Purpose
The service is designed to upload a new medication registry. The process uses the Jabba service. Upon execution of the request, a job is created, on the basis of which tasks are created. Each task is one request to create an entity from the registry.
Key points
NHS admin user download file with fields according to its structure.
The file should be in .csv format.
Specification
...
Link
...
Посилання на Apiary або Swagger
...
Resource
...
Посилання на ресурс, наприклад: /api/persons/create
...
Scope
...
medication_registry:write
...
Scope для доступу
...
Components
...
Зазначається перелік бізнес компонентів, які використовують цей метод, наприклад: ePrescription
...
Microservices
...
API paragraph not found
...
Перелік мікросервісів, які використовує метод API, наприклад: Auth, ABAC
...
Protocol type
...
API paragraph not found
...
Тип протоколу, який використовується запитом, наприклад: SOAP | REST
...
Request type
...
API paragraph not found
...
Тип запиту API, наприклад: GET, POST, PATCH…
...
Sync/Async
...
API paragraph not found
...
Метод є синхронним чи асинхронним?
...
Public/Private/Internal
...
Internal
...
Потрібно зазначити тип методу за ступенем доступності
Expand | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
|
Logic*
Потрібно по пунктах описати логіку методу API або додати діаграму
Preconditions
Які передумови мають бути виконані системою/користувачем. Наприклад:
створений запис в MedicationRequest;
рецепт відпущений (COMPLETED)
Global and configurable parameters
Потрібно вказати глобальні та конфігураційні параметри.
Наприклад:
...
Variable
...
Values
...
Description
...
CARE_PLAN_<category>_ICD10_AM_CONDITIONS_ALLOWED
...
Values that matches with dictionaryeHealth/ICD10_AM/condition_codes
Example: “E10.32, E11.92”
...
(Example: CARE_PLAN_CLASS_1_ICD10_AM_CONDITIONS_ALLOWED)
Input parameters
Потрібно вказати вхідні параметри запиту. Наприклад, для GET /patients/composition/job/{{asyncJobId}} вхідний параметр:
...
Input parameter
...
Values
...
Type
...
Description
...
Example
...
asyncJobId
...
String
...
Async Job Object ID
Filters
Потрібно вказати фільтри. Наприклад, для GET /api/medication_requests/{{id}}/dispenses?status=PROCESSED фільтр:
...
Filter
...
Values
...
Type
...
Description
...
Example
...
status
...
String
...
Optional
...
PROCESSED
Dictionaries
Потрібно вказати довідники, які використовує метод API
Request structure*
See on Apiary
Example:
Expand | ||
---|---|---|
| ||
|
Authorize*
Вимоги до авторизації: яким чином надається доступ до використання методу
Request to process the request using a token in the headers
Headers*
Наприклад:
Content-Type:application/json
Authorization:Bearer c2778f3064753ea70de870a53795f5c9
api-key:uXhEczJ56adsfh3Ri9SUkc4en
Request data validation*
Валідація даних
Наприклад:
Validate request using JSON schema
In case validation failed - generate 422 error
Expand | ||
---|---|---|
| ||
|
Processing*
Потрібно описати процеси, які відбуваються з даними
1. Using global parameters
Потрібно викликати глобальні параметри (Global parameters), щоб отримати наведені нижче параметри
Response structure*
See on Apiary
Example:
Expand | ||
---|---|---|
| ||
|
Post-processing processes*
Що має відбутися в ЦБД після опрацювання та відправлення відповіді, тощо
...
Purpose
The service is designed to upload a new medication registry. The process uses the Jabba service. Upon execution of the request, a job is created, on the basis of which tasks are created. Each task is one request to create an entity from the registry.
Key points
NHS admin user download file with fields according to its structure.
The file should be in .csv format.
Specification
Page Properties | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Expand | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
|
Logic
Validate input according to schema
Create job with type
create_medication_registry
For each line of input file create separate task of job
Each task must validate existing and create new entities of medications registry:
Extract medications with
type = INNM_DOSAGE
,is_active = TRUE
,innm_dosage.name
,innm_dosage.form
andinnm_dosage.ingredients.dosage
,innm_dosage.ingredients.is_primary
):in case found extract connected medications with
type = BRAND
,is_active = TRUE
,brand.name
,brand.form
,brand.package_qty
,brand.package_min_qty
,brand.certificate
,brand.container
andbrand.ingredients.dosage
,brand.ingredients.is_primary
, brand.manufacturer.name, brand.manufacturer.country, brand.certificate_expired_at:in case found extract connected program medication by medication_id and
program_medications.medical_program_id
and insert program medication with brand according to https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17153654796/RC_Create+full+medication+registry_EN#program_medications in case program medication not found
in case innm_dosage not found insert it according to https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17153654796/RC_Create+full+medication+registry_EN#medications-(type-=-INNM_DOSAGE) and its ingredients https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17153654796/RC_Create+full+medication+registry_EN#ingredients-(for-INNM_DOSAGE)
check existence of INNMs by
innms.name_original
in case innm not found - insert it according to https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17153654796/RC_Create+full+medication+registry_EN#innms
in case innm is found - skip innm creation.
in case more than one innm is found - return
FAILED
task status with error ('More than one INNM with such name_original exist in innms table')
in case brand not found insert brand according to https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17153654796/RC_Create+full+medication+registry_EN#medications-(type-=-BRAND) and its ingredient https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17153654796/RC_Create+full+medication+registry_EN#ingredients-(for-BRAND).
insert program medication with brand according to https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17153654796/RC_Create+full+medication+registry_EN#program_medications
in case brand and program medication found - return
FAILED
task status with error ('Such medication already exist')
Return job identifier with result.
innms
Attribute | Source and Logic | Type and Constraints | O/M |
---|---|---|---|
id | uuid_generate_v4(), auto | uuid | M |
sctid | innms.sctid, from request | varchar(255) | O |
name | innms.name, from request | varchar(255) | M |
name_original | innms.name_original, from request | varchar(255) | M |
is_active | true, auto | bool | M |
inserted_by | user_id, from token | uuid | M |
updated_by | user_id, from token | uuid | M |
inserted_at | now(), auto | timestamp | M |
updated_at | now(), auto | timestamp | M |
medications (type = INNM_DOSAGE)
Attribute | Source and Logic | Type and Constraints | O/M |
---|---|---|---|
id | uuid_generate_v4(), auto | uuid | M |
name | innm_dosage.name | varchar(255) | M |
type | auto (INNM_DOSAGE) | varchar(255) | M |
is_active | true, auto | bool | M |
form | innm_dosage.form | varchar(255) Dictionary MEDICATION_FORM | M |
inserted_by | user_id, from token | uuid | M |
updated_by | user_id, from token | uuid | M |
inserted_at | now(), auto | timestamp | M |
updated_at | now(), auto | timestamp | M |
daily_dosage | innm_dosage.daily_dosage | float | O |
max_daily_dosage | innm_dosage.max_daily_dosage | float | O |
mr_blank_type | innm_dosage.mr_blank_type | varchar(64) Dictionary MR_BLANK_TYPES | M |
dosage_form_is_dosed | innm_dosage.dosage_is_dosed | bool | M |
ingredients (for INNM_DOSAGE)
Attribute | Source and Logic | Type and Constraints | O/M | ||
---|---|---|---|---|---|
id | uuid_generate_v4(), auto | uuid | M | ||
dosage | numerator_value | innm_dosage_ingredients.dosage.numerator_value, from request | jsonb | float8 | M |
numerator_unit | innm_dosage_ingredients.dosage.numerator_unit, from request | varchar(255) Dictionary MEDICATION_UNIT | M | ||
denumerator_value | innm_dosage_ingredients.dosage.denumerator_value, from request | float8 | M | ||
denumerator_unit | innm_dosage_ingredients.dosage.denumerator_unit, from request | varchar(255) Dictionary MEDICATION_UNIT | M | ||
is_primary | innm_dosage_ingredients.is_primary, from request | bool At least one of the ingredients must be is_primary = true | M | ||
innm_child_id | uuid_generate_v4(), auto | uuid innm_id | M | ||
parent_id | uuid_generate_v4(), auto | uuid medication_id (type = INNM_DOSAGE) | M | ||
inserted_at | now(), auto | timestamp | M | ||
updated_at | now(), auto | timestamp | M |
medications (type = BRAND)
Attribute | Source and Logic | Type and Constraints | O/M | ||
---|---|---|---|---|---|
id | uuid_generate_v4(), auto | uuid | M | ||
name | brand.name | varchar(255) | M | ||
type | auto (BRAND) | varchar(255) | M | ||
manufacturer | name | brand.manufacturer.name | jsonb | varchar(255) | M |
country | brand.manufacturer.country | varchar(255) Dictionary COUNTRY | M | ||
code_atc | brand.code_atc | jsonb | varchar(255) | M | |
is_active | true, auto | bool | M | ||
form | brand.form | varchar(255) Dictionary MEDICATION_FORM | M | ||
container | numerator_value | brand.container.numerator_value | jsonb | float8 | M |
numerator_unit | brand.container.numerator_unit | varchar(255) Dictionary MEDICATION_UNIT | M | ||
denumerator_value | brand.container.denumerator_value | float8 | M | ||
denumerator_unit | brand.container.denumerator_unit | varchar(255) Dictionary MEDICATION_UNIT | M | ||
package_qty | brand.package_qty | float | O | ||
package_min_qty | brand.package_min_qty | float | O | ||
certificate | brand.certificate | varchar(255) | O | ||
certificate_expired_at | brand.certificate_expired_at | date | O | ||
inserted_by | user_id, from token | uuid | M | ||
updated_by | user_id, from token | uuid | M | ||
inserted_at | now(), auto | timestamp | M | ||
updated_at | now(), auto | timestamp | M | ||
form_pharm | brand.form_pharm | varchar(255) | O | ||
max_request_dosage | brand.max_request_dosage | int | O |
ingredients (for BRAND)
Attribute | Source and Logic | Type and Constraints | O/M | ||
---|---|---|---|---|---|
id | uuid_generate_v4(), auto | uuid | M | ||
is_primary | brand_ingredients.is_primary, from request | bool Only one ingredient should be is_primary = true | M | ||
dosage | numerator_value | brand_ingredients.dosage.numerator_value, from request | jsonb | float8 | M |
numerator_unit | brand_ingredients.dosage.numerator_unit, from request | varchar(255) Dictionary MEDICATION_UNIT | M | ||
denumerator_value | brand_ingredients.dosage.denumerator_value, from request | float8 | M | ||
denumerator_unit | brand_ingredients.dosage.denumerator_unit, from request | varchar(255) Dictionary MEDICATION_UNIT | M | ||
medication_child_id | uuid_generate_v4(), auto | uuid medication (type = INNM_DOSAGE) | M | ||
parent_id | uuid_generate_v4(), auto | uuid medication_id (type = BRAND) | M | ||
inserted_at | now(), auto | timestamp | M | ||
updated_at | now(), auto | timestamp | M |
program_medications
Attribute | Source and Logic | Type and Constraints | O/M | |
---|---|---|---|---|
id | uuid_generate_v4(), auto | uuid | M | |
reimbursement | type | program_medications.reimbursement.type | varchar(64) Dictionary REIMBURSEMENT_TYPE | M |
reimbursement_amount | program_medications.reimbursement.reimbursement_amount | float | M | |
percentage_discount | program_medications.reimbursement.percentage_discount | float | M | |
is_active | true, auto | bool | M | |
medication_request_allowed | true, auto | bool | M | |
care_plan_activity_allowed | true, auto | bool | M | |
inserted_by | user_id, from token | uuid | M | |
updated_by | user_id, from token | uuid | M | |
medication_id | medication_id (type = BRAND), auto | uuid | M | |
medical_program_id | program_medications.medical_program_id | uuid | M | |
inserted_at | now(), auto | timestamp | M | |
updated_at | now(), auto | timestamp | M | |
wholesale_price | program_medications.wholesale_price | float8 | O | |
consumer_price | program_medications.consumer_price | float8 | O | |
reimbursement_daily_dosage | program_medications.reimbursement_daily_dosage | float8 | O | |
estimated_payment_amount | program_medications.estimated_payment_amount | float8 | O | |
start_date | program_medications.start_date | date | O | |
end_date | program_medications.end_date | date | O | |
registry_number | program_medications.registry_number | varchar(255) | O |
Example with values:
View file | ||
---|---|---|
|
Authorize
Verify the validity of access token
in case of error - return 401 (“Invalid access token”) in case of validation fails
Verify that token is not expired
in case of error - return 401 (“Invalid access token”)
Check user scopes in order to perform this action (scope = 'medication_registry:write')
return 403 (“Your scope does not allow to access this resource. Missing allowances: medication_registry:write”) in case of invalid scope(s)
Headers
Наприклад:
Content-Type:application/json
Authorization:Bearer c2778f3064753ea70de870a53795f5c9
api-key:uXhEczJ56adsfh3Ri9SUkc4en
Request data validation
Validate request
Check that request using schema
Return 422 with the list of validation errors in case validation fails.
Check that registerType = 'FULL_MEDICATIONS_REGISTRY'
Return 422 with the list of validation errors in case validation fails.
Check that reasonDescription filled
Return 422 with the list of validation errors in case validation fails.
Check input file according to file structure
Return 422 with the list of validation errors in case validation fails.
Check input file size - csv file with max 30000 lines is allowed.
Return 422
The number of tasks for the job with a sequential execution strategy is limited to 30,000
in case validation fails
File example:
View file | ||
---|---|---|
|
*Note. Fields innms.sctid
, innms.name
, innms.name_original
, innm_dosage_ingredients.is_primary
, innm_dosage_ingredients.dosage.numerator_value
, innm_dosage_ingredients.dosage.numerator_unit
, innm_dosage_ingredients.dosage.denumerator_value
, innm_dosage_ingredients.dosage.denumerator_unit
, brand.code_atc
can exist as an array. Values should be separated as | (respectively).
HTTP status codes
Page Properties | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
Backward compatibility
...