Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

Note

The page is not supported. The method requirements can be found here [DRAFT] PreQualify Medication Request Request [API-005-008-003-0161]

Table of Contents
maxLevel7
minLevel1

...

Page Properties

Link

https://uaehealthapi.docs.apiary.io/#reference/public.-reimbursement/medication-request-requests/prequalify-medication-request-request

Посилання на Apiary або Swagger

Resource

/api/medication_request_requests/prequalify

Посилання на ресурс, наприклад: /api/persons/create

Scope

medication_request_request:write

Scope для доступу

Components

ePrescription, Reimbursement

Зазначається перелік бізнес компонентів, які використовують цей метод, наприклад: ePrescription

Microservices

Немає даних

Перелік мікросервісів, які використовує метод API, наприклад: Auth, ABAC

Protocol type

REST

Тип протоколу, який використовується запитом, наприклад: SOAP | REST

Request type

POST

Тип запиту API, наприклад: GET, POST, PATCH…

Sync/Async

Sync

Метод є синхронним чи асинхронним?

Логіка

Немає даних

Передумови

...

Expand
titleRequest example
Code Block
{
  "medication_request_request": {
    "person_id": "585044f5-1272-4bca-8d41-8440eefe7d26",
    "employee_id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
    "division_id": "881d6dee-dd3d-43f3-8983-922354c0e6ce",
    "created_at": "2017-08-17",
    "started_at": "2017-08-17",
    "ended_at": "2017-09-16",
    "medication_id": "1349a693-4db1-4a3f-9ac6-8c2f9e541982",
    "medication_qty": 10.34,
    "intent": "plan",
    "category": "community",
    "based_on": [
      {
        "identifier": {
          "type": {
            "coding": [
              {
                "system": "eHealth/resources",
                "code": "care_plan"
              }
            ]
          },
          "value": "9183a36b-4d45-4244-9339-63d81cd08d9c"
        }
      },
      {
        "identifier": {
          "type": {
            "coding": [
              {
                "system": "eHealth/resources",
                "code": "activity"
              }
            ]
          },
          "value": "9183a36b-4d45-4244-9339-63d81cd08d9c"
        }
      }
    ],
    "context": {
      "identifier": {
        "type": {
          "coding": [
            {
              "system": "eHealth/resources",
              "code": "encounter"
            }
          ]
        },
        "value": "9183a36b-4d45-4244-9339-63d81cd08d9c"
      }
    },
    "dosage_instruction": [
      {
        "sequence": 1,
        "text": "0.25mg PO every 6-12 hours as needed for menses from Jan 15-20, 2015.  Do not exceed more than 4mg per day",
        "additional_instruction": [
          {
            "coding": [
              {
                "system": "eHealth/SNOMED/additional_dosage_instructions",
                "code": "311504000"
              }
            ]
          }
        ],
        "patient_instruction": "0.25mg PO every 6-12 hours as needed for menses from Jan 15-20, 2015.  Do not exceed more than 4mg per day",
        "timing": {
          "event": [
            "2017-04-20T19:14:13Z"
          ],
          "repeat": {
            "bounds_duration": {
              "value": 10,
              "unit": "days",
              "system": "eHealth/ucum/units",
              "code": "d"
            },
            "count": 2,
            "count_max": 4,
            "duration": 4,
            "duration_max": 6,
            "duration_unit": "d",
            "frequency": 1,
            "frequency_max": 2,
            "period": 4,
            "period_max": 6,
            "period_unit": "d",
            "day_of_week": [
              "mon"
            ],
            "time_of_day": [
              "2017-04-20T19:14:13Z"
            ],
            "when": [
              "WAKE"
            ],
            "offset": 4
          },
          "code": {
            "coding": [
              {
                "system": "TIMING_ABBREVIATIONS",
                "code": "patient"
              }
            ]
          }
        },
        "as_needed_boolean": true,
        "site": {
          "coding": [
            {
              "system": "eHealth/SNOMED/anatomical_structure_administration_site_codes",
              "code": "344001"
            }
          ]
        },
        "route": {
          "coding": [
            {
              "system": "eHealth/SNOMED/route_codes",
              "code": "46713006"
            }
          ]
        },
        "method": {
          "coding": [
            {
              "system": "eHealth/SNOMED/administration_methods",
              "code": "419747000"
            }
          ]
        },
        "dose_and_rate": {
          "type": {
            "coding": [
              {
                "system": "eHealth/dose_and_rate",
                "code": "'ordered'"
              }
            ]
          },
          "dose_range": {
            "low": {
              "value": 0,
              "unit": "mg",
              "system": "eHealth/ucum/units",
              "code": "mg"
            },
            "high": {
              "value": 0,
              "unit": "mg",
              "system": "eHealth/ucum/units",
              "code": "mg"
            }
          },
          "rate_ratio": {
            "numerator": {
              "value": 0,
              "unit": "mg",
              "system": "eHealth/ucum/units",
              "code": "mg"
            },
            "denominator": {
              "value": 0,
              "unit": "mg",
              "system": "eHealth/ucum/units",
              "code": "mg"
            }
          }
        },
        "max_dose_per_period": {
          "numerator": {
            "value": 0,
            "unit": "mg",
            "system": "eHealth/ucum/units",
            "code": "mg"
          },
          "denominator": {
            "value": 0,
            "unit": "mg",
            "system": "eHealth/ucum/units",
            "code": "mg"
          }
        },
        "max_dose_per_administration": {
          "value": 0,
          "unit": "mg",
          "system": "eHealth/ucum/units",
          "code": "mg"
        },
        "max_dose_per_lifetime": {
          "value": 0,
          "unit": "mg",
          "system": "eHealth/ucum/units",
          "code": "mg"
        }
      }
    ],
    "priority": "routine",
    "prior_prescription": {
      "identifier": {
        "type": {
          "coding": [
            {
              "system": "eHealth/resources",
              "code": "medication_request"
            }
          ]
        },
        "value": "9183a36b-4d45-4244-9339-63d81cd08d9c"
      }
    },
    "container_dosage": {
      "system": "MEDICATION_UNIT",
      "code": "ML",
      "value": 4
    }
  },
  "programs": [
    {
      "id": "59781de0-2e64-4359-b716-bcc05a32c10f"
    }
  ]
}

Авторизація

  1. Перевірити валідність токену доступу

  2. Перевірити скоупи користувача (scope = 'medication_request_request:write') на можливість виконання даної дії

    1. в разі помилки - згенерувати відповідь 401

Headers

Content-Type:application/json

Authorization:Bearer c2778f3064753ea70de870a53795f5c9

Перевірити запит

  1. Перевірити запит, використовуючи схему JSON. 

    1. в разі помилки повернути 422 з повідомленням ("required property %{property} was not present")

Перевірити дані запиту

Перевірити тип рецепту

Тільки рецепти з типом (намір) order може бути перевірено.

  1. Перевірити намір на рецепт

    1. якщо намір для рецепту == plan - повернути 409, "Plan can't be qualified"

Логіка перевірки (перевірка можливості використання програми)

...

Деякі перевірки (нижче по тексту) повинні виконуватися для програми

  1. якщо проходять - зберегти відповідь для програми - status = VALID

1. Перевірити відповідність INNM програмі

...

Ціль перевірки:  Є перелік ЛЗ (які пов'язані з Innms) які можуть використовуватися за програмою. Потрібно перевірити, чи хоча б один з доступних ЛЗ (з `medication_request_allowed` == TRUE)  для Innm з відповідною програмою

  1. Перевірити відповідність innm з переліком ЛЗ для програми

    1.  

    2. якщо дані не знайдено:

      1. додати до відповіді: status = INVALID

      2. додати до відповіді: rejection_reason = "Innm not on the list of approved innms for program \"<medical_programs.name>\""

Code Block
SELECT * 
FROM program_medications PM
    INNER JOIN medical_programs MP
      ON PM.medical_program_id=MP.id
		INNER JOIN medications M
			ON M.id = PM.medication_id
				AND M.type =  'BRAND'
        AND MP.medication_request_allowed = TRUE
		INNER JOIN ingredients I
			ON I.parent_id = M.id
				AND I.is_primary = TRUE
				AND I.medication_child_id = PM.medication_id
WHERE PM.medical_program_id = 'medical_program_id'
         AND MP.is_active = TRUE
         AND M.is_active = TRUE;

2. Перевірити відсутність таких же ЛЗ для програми

...

Приклад перевірки: без перетину часу

EP

 Передумови # 1

Результат валідації #1 

 Передумови #2

Результат валідації #2 

 Передумови #3

Результат валідації #2 

PreQualifyMedicationRequestRequest

Відсутні записи MedicationRequest

OK

Створений запис в MedicationRequest

Не валідно

Рецепт відпущено (COMPLETED)

Не валідно

QualifyMedicationRequestByID

Відсутні записи MedicationRequest

Не можливо

Створений запис в MedicationRequest

OK

Рецепт відпущено (COMPLETED) 

Не валідно

  1. Для інформації - статуси чартів: Medication_request

  2. Отримати `check_innm_id`

    Code Block
    SELECT I.innm_child_id
    	FROM ingredients I
    WHERE I.parent_id = $.medication_id 
    	AND I.is_primary = TRUE
    
    

  3. Отримати рецепт з завершеним відпуском для person_id & check_innm_id

  4. Code Block
    SELECT * FROM medication_requests MR
    	INNER JOIN medications MED
    		ON MED.id = MR.medication_id
    	INNER JOIN ingredients I 
    		ON I.parent_id = MED.id
    			AND I.innm_child_id = `check_innm_id`
    			AND I.is_primary = TRUE
    	WHERE MR.person_id == $.person_id
        	AND MR.status IN (ACTIVE, COMPLETED)
    		AND NOT( $.started_at> MR.ended_at OR $.ended_at < MR.started_at)
    
    

  5. Перевірити наявність (IF EXIST ()  - що є перетином  розрахованого терміну (started_at + ended_at) для беклогу зі значеннями вибраних рецептів (started_at + ended_at) з пов'язаними medication_dispense в статусі (NEW,PROCESSED)).  

    1. якщо знайдено  

      1. додати до відповіді: status = INVALID

      2. додати до відповіді: rejection_reason = "It can be only 1 active/ completed medication request request or medication request per one innm for the same patient at the same period of time!"

  6. Знайти рецепт по $innm_dosge, $medical_program_id, $person_id and max(end_date). В разі наявності рецепту з ended_at>=current_date тоді наступний може бути виконано в

    • якщо (ended_at - started_at) => mrr_standart_duration то
      NEW created_at >= ended at - max_mrr_renew_days>=current_day

      • в разі помилки повернути помилку 422 ('It's to early to create new medication request for such innm_dosage and medical_program_id')

    • якщо (ended_at - started_at) < mrr_standart_duration то
      NEW created_at >= ended_at - min_mrr_renew_days>=current_day

      • в разі помилки повернути помилку 422 ('It's to early to create new medication request for such innm_dosage and medical_program_id')

3. Перевірити що план лікування є обов'язковим для програми

...

Перевірити ціль:  Потрібно перевірити, якщо рецепт з програмою потребує план лікування (з `care_plan_required` == TRUE) для цієї програми.

  1. Перевірити чи є based_on в запиті

    1. Перевірити значення care_plan_required

      Code Block
      SELECT medical_program_setting->>'care_plan_required'
      FROM medical_programs
      WHERE id = 'medical_program_id';
      

    2. Якщо care_plan_required відмічено:

      1. перевірити based_on (посилання на care_plan та її активність) в запиті

        1. в разі не знайдено based_on:

          1. додати до відповіді: status = INVALID

          2. додати до відповіді: rejection_reason = "Care plan with activity on "<medical_programs.name>\" is required for for program \"<medical_programs.name>\""

4. Перевірити, що дігнози відповідають програмі

...

Ціль перевірки: Необхідно перевірити чи рецепт з програмою потребує контекст (взаємодію) з вказаними діагнозами. 

  1. Якщо програма має параметр CONDITIONS_ICD10_AM_ALLOWED в medical_program_settings:

    1. Перевірити, чи первинні діагнози зі взаємодії в контексті має код з eHealth/ICD10_AM/condition_codes dictionary

      1. Перевірити коди діагнозів в CONDITIONS_ICD10_AM_ALLOWED

        1. в разі помилки - повернути 200 зі статусом = INVALID та rejection_reason = “Encounter in context has no primary diagnosis allowed for the medical program“ 

  2. Якщо програма має параметр CONDITIONS_ICPC2_ALLOWED в medical_program_settings:

    1. Перевірити, чи первинні діагнози зі взаємодії в контексті має код з eHealth/ICPC2/condition_codesdictionary

      1. Перевірити коди діагозів з CONDITIONS_ICPC2_ALLOWED

        1. в разі помилки - повернути 200 зі статусом = INVALID та rejection_reason = “Encounter in context has no primary diagnosis allowed for the medical program“

5. Перевірити співробітника

...

Ціль перевірки: Потрібно перевірити чи період рецепту не перевищив доступниму кількість днів.

  1. Якщо рецепт має програму з MEDICATION_REQUEST_MAX_PERIOD_DAY в налаштуваннях медичної програми:

    1. Перевірити, що період рецепту (ended_at - started_at) меньше або дорівнює налаштуванням параметру MEDICATION_REQUEST_MAX_PERIOD_DAY

      1. в разі помилки - повернути 200 зі статусом = INVALID та rejection_reason = “Period length exceeds allowed value for the medical program“ 

  2. Якщо рецепт має програму без MEDICATION_REQUEST_MAX_PERIOD_DAY в налаштуваннях програми:

    1. Перевірити, що період рецепту (ended_at - started_at) меньше або дорівнює параметру MEDICATION_REQUEST_MAX_PERIOD_DAY чарту

      1. в разі помилки - повернути 200 зі статусом = INVALID та rejection_reason = “Period length exceeds default maximum value“ 

8. Перевірити контекст

  1. Перевірити, що "context" активна сутність (не entered-in-error) з відповідного довідника, що належить поточному пацієнту

    1. Перевірити, що сутність в колекції $.data.context.identifier.type.coding[0].code with id == $.data.context.identifier.value that belongs to the current patient

      1.  в разі помилки - повернути код 200 зі статусом = INVALID та rejection_reason = “Encounter entity is not found for program“

    2. Перевірити, що діагнози взаємодії не є пустими в $.encounter.diagnosis

      1. в разі помилки - повернути код 422 ('Encounter without diagnosis can not be referenced')

9. Перевірити персону

Валідно для програм: будь-яких

...

Подальша обробка

Немає

HTTP статус коди

HTTP статус код

Повідомлення

Що викликало помилку

200

 Відповідь

 

401

Помилка неавторизованого доступу

409

Помилка

422

 Помилка

 

Зворотна сумісність

Немає даних