HomeGuíasREST API
REST APILog In

EHR

Guía de integración con nuestra aplicación de EHR

En esta guía encontrarás cómo puedes realizar la integración con nuestra aplicación de EHR, permitiendo la suscripción de Doctores, acceso y sincronización de pacientes.

Para la integración con nuestra plataforma deberás de utilizar y proveer lo siguiente:

  1. Utilización de nuestro auth-service para la obtención de un access token.
  2. Implementación de nuestro widget para la suscripción de doctores.
  3. Uso de nuestro endpoint para registro de pacientes.
  4. Poder realizar una re-dirección desde tu aplicación WEB a nuestro EHR.
  5. Debes de proporcionar a Osigu un servicio REST que podamos utilizar para registrar de regreso un paciente creado desde nuestro EHR.

En esta integración existen cuatro puntos de integración en donde haremos uso de cada uno de los puntos mencionados antes.

1. Suscripción de doctores

Para la suscripción de doctores contamos con un widget que puedes implementar en tu sitio WEB (third-party JavaScript), este widget creará dentro de tu sitio un formulario para que el doctor complete cierta información requerida para la creación de su perfil.

La implementación del widget requiere de 2 pasos únicamente:

1.1 Implementación de nuestro JS, que contiene el código html, JavaScript y estilos en un solo paquete, necesarios para el despliegue de nuestro formulario que incluye también el consumo de nuestros servicios REST para el registro del mismo.

1.2 Creación del componente DoctorEnrollmentWidget, el cual requerirá el envío de cierta información del doctor, para que el usuario complete únicamente la información adicional que requerimos.

Implementación de JS

Para la implementación de nuestro JS debes únicamente agregar nuestro script a tu página, como puedes ver en el siguiente ejemplo.

<HTML>
  <HEAD>
  </HEAD>
  <BODY>
    <script type="text/javascript"
  src="https://doctorenrollment.widgets.osigu.com/sandbox/1.1.1/widget.js">
    </script> 
  </BODY>
</HTML>

Ambientes

El ejemplo muestra la implementación de nuestro widget, en él puedes observar que se esta realizando la implementación de la versión 0.1.0 del ambiente de sandbox. Nuestro ambiente de sandbox es utilizado para desarrollo y pruebas de integración con nuestros clientes.

Contamos con dos ambientes:

  • sandbox, como se ha mencionado antes, este ambiente es utilizado con nuestros clientes para desarrollo y pruebas de integración.
  • production, este ambiente es el que debe ser utilizado por tus aplicaciones una vez la integración haya sido probada, certificada y puesta en producción en tu ambiente productivo.

🚧

Atención

La comunicación con nuestros servicios WEB y widgets requieren de la implementación de mecanismos de autenticación realizada a través de nuestro OAuth2 server. Para esto te proporcionaremos las credenciales correspondientes para cada ambiente.

Versiones

Debes de realizar la implementación de nuestros widgets utilizando la última versión de los mismos. En el ejemplo 1.1 vemos que el script hace referencia a la versión 0.1.0 de nuestro componente.

Cada vez que liberemos una nueva versión que incluya un cambio ya sea mayor, menor o que incluya correción de errores estaremos notificando estos cambios por las vías de comunicación definidas con nuestros clientes, además agregamos en nuestra sección de noticias de este sitio un comunicado que indica la liberación de la nueva versión y los cambios que incluye la nueva versión liberada.

Cuando una nueva versión es liberada, se realiza para los dos ambientes, sandbox y production.

Instancia del componente

Cuando desees que nuestro formulario sea mostrado en tu sitio debes de crear la instancia de nuestro componente a través de JavaScript. Para esto debes de proporcionarnos los siguientes parámetros:

NombreTipoDescripciónReq
containerIdStringEste es el ID de la tag de HTML donde deseas que sea cargado el widget.Si
clientIdStringEste es el ID que se proporciona a cada cliente que integra nuestros widget. Este es un valor distinto por ambiente.Si
clientSecretStringAcompañado con cada clientID entregamos un llave llamada clientSecret, y con ambas llaves generamos un token de autorización. De igual forma este es un valor distinto por ambiente.Si
localeStringEsto sirve para desplegar los widgets en el idioma correspondiente hasta especificar el país, ejemplo: ´es´, ´en´Si
primaryColorStringCódigo de color hexadecimal, para ser utilizado como color primario.No
secondaryColorStringCódigo de color hexadecimal, para ser utilizado como color secundario.No
errorColorStringCódigo de color hexadecimal, para ser utilizado para despliegue de errores.No
doctorObjectEste objeto contiene la información del doctor necesaria para que pueda crearse el perfil de nuestro lado y que documentos como la receta electrónica se visualicen de manera correcta.Si
doctor.givenNameStringPrimer nombre del especialista médico.Si
doctor.middleNameStringSegundo nombre del especialista.No
doctor.firstSurnameStringApellido del especialista médico.Si
doctor.secondSurnameStringSegundo apellido del médico.No
doctor.countryCodeStringPaís en que practica el especialista. ISO 3166-1 alpha-2Si
doctor.emailAddressStringCorreo electrónico del doctor.Si
doctor.sexString (Enum)Sexo del doctor. los valores admitivos son, FEMALE o MALE.No
doctor.salutationStringSaludo del especialista, por ejemplo: Dr. o Dra.Si
doctor.medicalLicenseNumberStringNúmero de licencia médica, también es conocido como cédula profesional o colegiado.Si
doctor.issuingInstitutionStringInstitución en donde fue obtenido el grado.No
doctor.taxIdentificationNumberStringNúmero de contribuyente fiscal.Si
doctor.addressStringDirección del doctor, esta dirección será visualizada en la receta que se genere.Si
doctor.phoneNumberStringNúmero de teléfono del doctor, esta información también se visualizará en la receta generada.Si
doctor.cellPhoneNumberStringNúmero de teléfono móvil del doctor, esta información también se visualizará en la receta generada.No
doctor.timeZoneStringZona horaria del Doctor, por ejemplo: America/Guatemala o Europe/Madrid.Si
doctor.specialtiesStringArreglo de objetos que contiene información adicional de las especialidades del doctor.

La primer especialidad que vaya indicada en este arreglo se tomará como especialidad principal.
No
doctor.specialties[].nameStringNombre de la especialidad.Si
doctor.specialties[].issuingInstitutionStringEn algunos países es necesario saber la institución en donde fue obtenido la especialidad médica.No
doctor.specialties[].licenseNumberStringEn algunos países es necesario saber la institución en donde fue obtenido la especialidad médica.No

📘

Información

Para la creación de la instancia del widget puedes enviar tres colores hexadecimales de forma opcional, esto con el objetivo de que el formulario de registro se visualice utilizando los colores de tu marca. Si no proporcionas estos valores, no pasa nada, nuestro formulario se desplegará utilizando los valores que hemos definido por defecto.

El ejemplo 1.2 muestra la manera en que debe de crearse la instancia de nuestro widget. Al ejecutarse el código de JavaScript provocará que nuevas etiquetas de html correspondientes a nuestro formulario sea desplegado dentro de la etiqueta que hayas definido en la propiedad llamada containerId.

<HTML>
  <HEAD>
  </HEAD>
  <BODY>
    <script type="text/javascript"
    src="https://doctorenrollment.widgets.osigu.com/sandbox/1.1.1/widget.js">
    </script> 
    <noscript>
      <strong>Lo sentimos pero este sitio no trabaja apropiadamente sin
        JavaScript. Por favor habilitelo para continuar.</strong>
      <div id="widget_container"></div>
      <script>
        DoctorEnrollmentWidget.createWidget({
            containerId: "widget_container",
            primaryColor: "#2fa6ff",
            errorColor: "#ee6f6f",
            clientId: "gt-test-third-party-application-slug",
            clientSecret: "9a1b783b-a5d5-4194-8d10-ba15906e3bb0",
            locale: 'es',
            doctor: {
              givenName: 'Juan',
              middleName: 'Francisco',
              firstSurname: 'Bassi',
              secondSurname: 'López',
              countryCode: 'GT',
              emailAddress: '[email protected]',
              sex: 'MALE',
              salutation: 'Dr.',
              medicalLicenseNumber: '2012-468',
              issuingInstitution: 'Universidad Francisco Marroquin',
              taxIdentificationNumber: '64578-K',
              address: 'Ruta 2, 4-71 Zona 4, Cuatro Venezia',
              phoneNumber: '(502) 4578-6581',
              cellPhoneNumber: '+502 49290808',
              timeZone: 'America/Guatemala',
              specialties: [{
                name: 'Ginecología y Obstetricia',
                licenseNumber: '2016-547',
                issuingInstitution: 'Universidad de San Carlos de Guatemala'
              }]
            }
        });
    </script>
    </noscript>
  </BODY>
</HTML>

De parte de nuestro widget, las siguientes tareas serán realizadas.

  • Validación de credenciales según los valores de los atributos llamados clientId y clientSecret.
  • Verificación de registro según licencia médica (cédula profesional/colegiado) y código de país.
  • Despliegue de formulario de registro o mensaje de estado de registro.

Doctor no registrado

Dependiendo si el doctor aún no se encuentra registrado dentro de la plataforma Osigu, veremos que el Widget mostrá un formulario como se ve a continuación:

988

En él se le pide una contraseña y confirmación de la misma, esta contraseña es utilizada para la firma electrónica y además para poder crearle un usuario y acceder más adelante al EHR.

También tiene la posibilidad de generar una imagen con su firma manuscrita, esta firma será incluída dentro de la receta. Esto es opcional.

Al guardar esta información, el widget emitirá un evento al contenedor de tu aplicación WEB donde, el nombre del evento es onDoctorRegistered. Esto puede ser útil si quieres tener el control de qué usuarios han sido registrados en nuestra plataforma. Además en este evento debes de iniciar la sincronización de los pacientes del doctor registrados en tu plataforma hacia la nuestra, esto utilizando nuestro servicio web del cuál vablamos en el inciso dos de esta guía.

Evento onDoctorRegistered

Este es un pequeño ejemplo del evento emitido por el widget, su captura y la información que en él se contiene. En el evento podrás obtener el número de licencia médica principal del doctor y el país al que pertenece.

const container = document.getElementById('widget_container')
container.addEventListener("onDoctorRegistered", function (e) {
  console.log(e.detail.medicalLicenseNumber); 
  console.log(e.detail.medicalLicenseNumber); 
});

Es en este listener que debes de hace la sincronización de pacientes hacia nuestra plataforma.

Doctor registrado

Si el doctor ya se encuentra registrado en nuestra plataforma, el Widget muestra un mensaje indicando que ya se encuentra registrado.

786

2. Creación de pacientes fuera de EHR

Debe de realizarse una sincronización de pacientes en dos ocaciones:

  • Cuando un doctor acaba de ser registrado desde tu aplicación.
  • Cuando acaba de agregarse un usuario nuevo como paciente de un doctor que se ha dado de alta con nosotros desde tu aplicación.

Para ambos casos cuentas con un endpoint nuestro con el que puedes enviar el registro de uno o más pacientes para un doctor determinado. Este es un servicio que creará un mensaje dentro de nuestra cola de trabajo de EHR para que se inicie el registro de pacientes para el doctor especificado.

Puedes encontrar en nuestra referencia el contrato del servicio en el cual se especifica cada uno de los atributos requeridos de cada paciente.

Este servicio iniciará un proceso asíncrono de nuestro lado, por lo tanto recibirás una respuesta inmediata con un código de estado HTTP 201 y un identificador del proceso que se ha agregado a la cola de trabajo.

Ejemplo de solicitud

curl --request POST \
  --url https://sandbox.osigu.com/ehr-api/v1/patients/bulk \
  --header 'authorization: Bearer 99a801b4-6e34-4f64-94a9-c59ffc525c84' \
  --header 'content-type: application/json' \
  --data '{"doctor_country_code":"GT","medical_license_number":"2012-654","patients":[{"given_name":"Juan","first_surname":"Padilla","second_surname":"Rivera","sex":"MALE","date_of_birth":"1984-06-14","residence_country_code":"GT","phone_number":"53135485","cell_phone_number":"25468787","residence_address":"Ruta 2, 4-71 Zona 4, Cuatro Venezia, apto 102","related_patient":"false","email_address":"[email protected]","identity_document_type":"NATIONAL_IDENTITY_CARD","identity_document_id":"2515-67444-0102"}]}'

Para hacer uso de este endpoint debes de obtener un access token por medio de nuestro servidor OAuth2, puedes ver más información aquí de cómo obtener un access token.

Ejemplo de respuesta exitósa

{
  'id': '645c1c99-38a6-4cef-b924-858f280dfda9'
}

Verificando el estado

Ponemos a tu disposición también un servicio con el que puedes dar seguimiento del proceso de carga. Puedes encontrar más información del contrato aquí.

El proceso de carga puede estar en cualquiera de los siguientes estados:

EstadoDescripción
PENDINGEl proceso ha sido registrado, pero aún no ha iniciado la carga.
IN_PROGRESSLa carga ha sido iniciada.
COMPLETEDEl proceso de carga ha finalizado, los resultados ya pueden ser visualizados.

Una vez se haya completado el proceso de carga, la respuesta del servicio dará indicadores del total de pacientes cargados satisfactoriamente y el total de pacientes que no pudieron ser registrados.

Cuando exista uno o mas pacientes que no pudieron ser cargados retornaremos un arreglo de pacientes (patients_not_registered) en donde podrá encontrar el error y la descripción, los dos posibles errores serán:

ErrorDescripción
ALREADY_EXISTSQuiere decir que el paciente ya se encuentra registrado de lado de Osigu para el doctor indicado.
UNKNOW_ERROROcurrió un error inesperado en nuestro sistema, la descripción del error mostrará más detalles.

El siguiente es un ejemplo de un proceso completado.

{
  'id': '645c1c99-38a6-4cef-b924-858f280dfda9',
  'status': 'COMPLETED',
  'total_patients': 250,
  'succesfully_registered': 249,
  'registered_with_errors: 1,
  'doctor_country_code': 'GT',
  'medical_license_number': '2012-654'
  'patients_not_registered': [{
     'given_name': 'John',
     'middle_name': null,
     'first_surname': 'Doe',
     'second_surname': null,
     'related_patient': false,
     'email_address': '[email protected]',
     'identity_document_type': 'NATIONAL_IDENTITY_CARD',
     'identity_document_id': '2515-85781-0101',
     'error': 'ALREADY_EXISTS',
     'error_description': 'The patient already exists for this doctor'
   }]
}

3. Creación de pacientes desde el EHR

Cuando un doctor previamente suscrito en nuestra plataforma entre a EHR, y cree un paciente nuevo nosotros estaremos notificando hacia tu plataforma acerca de este paciente nuevo creado, para que ambas plataformas se encuentren sincronizadas.

El método de autenticación para este servicio queda a tu preferencia, pero el servicio que proveas debe de ser un servicio tipo REST o bien un servicio SOAP.

La información que estaremos enviando a tu servicio será la siguiente:

AtributoTipoDescripción
doctor_country_codeStringCódigo donde ejerce el doctor
medical_license_numberStringNúmero de licencia médica del doctor
patient.given_nameStringNombre del paciente
patient.middle_nameStringSegundo nombre del paciente
patient.first_surnameStringPrimer apellido del paciente
patient.second_surnameStringSegundo apellido del paciente
patient.sexStringSexo del paciente
patient.date_of_birdthStringFecha de nacimiento del paciente
patient.residence_country_codeStringPaís donde se encuentra reside el paciente,
patient.phone_numberStringTeléfono residencial o fijo del paciente
patient.cell_phone_numberStringNúmero de teléfono móvil del paciente.
patient.residence_addressStringDirección de residencia del paciente
patient.related_patientBooleanIndicador de si el paciente es un paciente relacionado
patient.email_addressStringDirección de correo del paciente
patient.tutor_identificationBooleanIdentifica si los documentos de identificación son del tutor.
patient.identity_document_typeStringTipo de documento de Identidad del paciente
patient.identity_document_idStringNúmero de documento que identifica a un paciente

4. Dirigiendo hacia EHR

Si deseas dirigir hacia el EHR en una nueva pestaña del navegador a tu usuario puedes hacerlo de la siguiente manera:

  1. Consumir el endpoint especificado en esta sección, el cual según la información proporcionada del paciente intentará ubicar al paciente con la información más básica, si no lo encuentra lo crea inmediatamente. Este servicio te devolverá un identificador único y temporal para el paciente, de forma que puedas pasar este identificador temporal del paciente como parámetro dentro de la URL del EHR, este identificador solo puede ser usado una vez.

  2. Dirigir en una nueva pestaña al usuario usando una URL como la que se ejemplifica a continuación. https://ehr.sandbox.osigu.com?patient=390a2d91-3f6b-4ff6-b56a-816430161356

Es importante notar que en el ejemplo se puede observar que se esta apuntando al ambiente de sandbox, pero la URL cambiaría a la hora de hacer el despliegue en el ambiente producto, la URL quedaría de la siguiente forma, https://ehr.osigu.com?patient=390a2d91-3f6b-4ff6-b56a-816430161356

El UUID 390a2d91-3f6b-4ff6-b56a-816430161356 que se observa en el ejemplo es el ID temporal del paciente.

Cuando EHR reciba el request, el doctor deberá iniciar sesión si aún no lo ha hecho, luego la aplicación lo dirige a la sala de espera en donde procede con la atención del paciente.

Ambientes República Dominicana

Para el caso de República Dominicana, se cuenta un stack propio, por lo tanto las credenciales de OAuth2 y las URLs varían, quedando de la siguiente manera: