...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
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
...
API paragraph not found
...
Посилання на Apiary або Swagger
...
Resource
...
API paragraph not found
...
Посилання на ресурс, наприклад: /api/persons/create
...
Scope
...
medication_registry:write
...
Scope для доступу
...
Components
...
API paragraph not found
...
Зазначається перелік бізнес компонентів, які використовують цей метод, наприклад: 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
...
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
and innm_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
and brand.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.
...
Table of Contents |
---|
Purpose
The service is designed to uploading 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 entity from registry.
Key points
NHS admin user download file with fields according to its structure.
File should be in .csv format.
Full medication registry input data for GraphQL mutatiuon should be in .csv format and with escaped symbols (i.e. quotes, new lines - " as \"; new line replaced as \r\n ). Please note that UI of NHS Admin panel converts csv file to appropriate GraphQL input.
Specification
Page Properties | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||
|
Expand | |||||
---|---|---|---|---|---|
|
Authorization
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)
Validate request
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 csv_data input according to file structure
Return 422 with the list of validation errors in case validation fails
Check csv_data 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).
Service 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 and search 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 more than one medication with
type = INNM_DOSAGE
,is_active = TRUE
,innm_dosage.name
,innm_dosage.form
is found - returnFAILED
task status with error ('More than one INNM_DOSAGE with such name and form exist in medications table
')in case more than one ingredient is found - return
FAILED
task status with error ('More than one INNM_DOSAGE ingredient with such fields exist in ingredients table
')in case single medication with type = INNM_DOSAGE is found then check ingredients, in case ingredients of INNM_DOSAGE in DB are not equal to ingredients in uploaded register - return
FAILED
task status with error ('INNM_DOSAGE has different INNMS in ingredients table
')in case medication with
type = INNM_DOSAGE
is not found - insert it according to Create full medication registry | medications (type = INNM_DOSAGE), its ingredients according to Create full medication registry | ingredients (for INNM_DOSAGE), brand according to Create full medication registry | medications (type = BRAND), its ingredient according to Create full medication registry | ingredients (for BRAND) and program medication with brand according to Create full medication registry | program_medicationscheck existence of INNMs by
innms.name_original
in case innm is not found - insert it according to Create full medication registry | 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 medication with
type = INNM_DOSAGE
is found - proceed to brand.
Extract and search connected medications with
type = BRAND
,is_active = TRUE
,brand.name
,brand.form
,brand.package_qty
,brand.package_min_qty
,brand.certificate
,brand.container
,brand.manufacturer.name
,brand.manufacturer.country
,brand.certificate_expired_at
andbrand.ingredients.dosage
,brand.ingredients.is_primary,
brand.drlz_sku_id:in case more than one medication with such params is found - return
INNMFAILED
task status with error ('More than one
name_original exist in innms table')BRAND with such
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
...
fields exist in medications table
')in case single medication with type = BRAND is found then check ingredients, in case ingredient of BRAND in DB is not equal to ingredient of a brand in uploaded register - return
FAILED
task status with error ('Invalid BRAND ingredients in ingredients table
')in case medication with
type = BRAND
is not found OR is absent in registry - insert brand according to Create full medication registry | medications (type = BRAND), its ingredient according to Create full medication registry | ingredients (for BRAND) and program medication with brand according to Create full medication registry | program_medicationsin case medication with
type = BRAND
is found - proceed to program medication.
Extract and search connected program medication by:
In caseregistry_number = NULL
then search bymedication_id
(withtype = BRAND
) andprogram_medications.medical_program_id
andprogram_medication.registry_number IS NULL
;
In caseregistry_number
hasid
then search bymedication_id
(withtype = BRAND
) andprogram_medications.medical_program_id
andprogram_medication.registry_number
;in case more than one program medication with such params is found - return
FAILED
task status with error ('More than one PROGRAM_MEDICATION with such fields exist in program_medications table
')in case program medication is not found - insert program medication with brand OR with innm_dosage according to Create full medication registry | program_medication
in case program medication is 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/ |
---|
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
M
inserted_by
user_id, from token
M | |||
---|---|---|---|
id | uuid_generate_v4(), auto | uuid | M |
sctid | innms.sctid, from request | varchar(255) |
Dictionary MEDICATION_FORM
O | |||
name | innms.name, from request | varchar(255) | M |
name_ |
original |
innms.name_ |
original, from |
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
...
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
dosage
numerator_value
innm_dosage_ingredients.dosage.numerator_value, from request
jsonb
uuid | M |
name | innm_dosage |
.name | varchar(255) |
M | |||
type | auto (INNM_DOSAGE) | varchar(255) | M |
is_ |
innm_dosage_ingredients.dosage.denumerator_value, from request
active | true, auto | bool | M |
form | innm_dosage |
.form | varchar(255) Dictionary MEDICATION_ |
FORM | M |
inserted_ |
by |
innm_dosage_ingredients.is_primary, from request
bool
At least one of the ingredients must be is_primary = true
Two or more ingredients can 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
...
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 |
|
|
|
|
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 |
uuid
M
name
_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) |
M
type
auto (BRAND)
varchar(255)
M
manufacturer
name
brand.manufacturer.name
jsonb
varchar(255)
M
country
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_ |
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
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) (may be absent)
denumerator_unit
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 |
denumerator_value
brand_ingredients.dosage.denumerator_value, from request
float8
M
package_qty | brand.package_qty | float | O | ||
package_min_qty | brand.package_min_qty | float | O | ||
certificate | brand.certificate | 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)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 |
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
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 | M | ||
inserted_at | now(), auto | timestamp | M | ||
updated_at | now(), auto | timestamp | M |
wholesale_price
program_medications
...
Attribute |
---|
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
...
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 OR INNM_DOSAGE), 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 | |
max_daily_dosage | program_medication.max_daily_dosage | float8 | O |
HTTP status codes
Page Properties | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
|