Validate request
Validate request using JSON schema
Authorize
- Verify the validity of access token
- Check user scope declaration_request:create in order to perform this action
Validate Legal Entity Type
Validate legal entity from token: legal_entities.type should be in DECLARATION_REQUEST_LEGAL_ENTITY_TYPES and legal_entities.status =='active'
Validate doctor
Get employee details
Invoke Get employee details
Validate Response $.data.employee_type == DOCTOR
Calculate patient age
Calculate patient age
age = MONTHS_BETWEEN (now(), $.declaration_request.person.birth_date) / 12
Get global parameters
Invoke Global parameters to get following parameters:
- ADULT_AGE
- DECLARATION_TERM
- phone_number_auth_limit
curl -X GET \ {:host}/prm/api/global_parameters
{ "meta": { "url": "http://api-svc.prm/api/global_parameters", "type": "object", "request_id": "ikff7hcf0hhto5c06irl9i976kc3s41m", "code": 200 }, "data": { "verification_request_expiration": "30", "employ_request_expiration": "30", "declaration_term": "30", "declaration_request_expiration": "30", "billing_date": "2", "adult_age": "18", "type": "global_parameter" } }
Check that doctor speciality meets the patient age requirements
- Get doctor's speciality_officio (speciality object where speciality_officio == true)
- Check age requirements according to global parameters
Speciality officio | Age |
---|---|
FAMILY DOCTOR | All ages |
THERAPIST | Greater or equal to $.data.adult_age |
PEDIATRICIAN | Less than $.data.adult_age |
Check phone number
Invoke Check phone number WS in order to check phone number exists in DB.
Phone number: $.declaration_request.person.phones.[0].number
curl -k -L '{:host}/verifications/+380508887700'
{ "meta": { "url": "http://dev.ehealth.world/verifications/+380936235985", "type": "object", "request_id": "b98ie5d0j3fn7vcbbmksa4k45ptue2ca", "code": 200 }, "data": { "phone_number": "+380936235985" } }
{ "meta": { "url": "http://dev.ehealth.world/verifications/+380936235986", "type": "object", "request_id": "b4adrhrj5og9ogqanb57dqj0v1qkbb9j", "code": 404 }, "error": { "type": "not_found" } }
Search pending declaration requests
Search declarations in IL_DB.declaration_requests to prevent requests duplication:
- if tax_id is not null
WHERE IL_DB.declaration_requests.data.person.tax_id = :($.declaration_request.person.tax_id) AND IL_DB.declaration_requests.data.person.documents.number = :($.declaration_request.person.documents.number) AND IL_DB.declaration_requests.status IN ('NEW', 'APPROVED')
- if tax_id is null
WHERE IL_DB.declaration_requests.data.person.documents.number = :($.declaration_request.person.documents.number) AND IL_DB.declaration_requests.data.person.first_name = :($.declaration_request.person.first_name) AND IL_DB.declaration_requests.data.person.last_name = :($.declaration_request.person.last_name) AND IL_DB.declaration_requests.status IN ('NEW', 'APPROVED')
Cancel declaration requests
Change status of all found declarations:
SET IL_DB.declaration_requests.status = 'CANCELED' WHERE IL_DB.declaration_requests.id IN (:LIST)
Search pending declaration requests
Search persons request in IL_DB.person_requests to prevent requests duplication:
- if tax_id is not null
WHERE IL_DB.person_requests.data.tax_id = :($.declaration_requests.person.tax_id) AND IL_DB.person_requests.status IN ('NEW', 'APPROVED')
- if tax_id is null
WHERE IL_DB.person_requests.data.documents.number = :($.declaration_requests.person.documents.number) AND IL_DB.person_requests.status IN ('NEW', 'APPROVED')
If found person request - don't create person request. Return error "This person already has a person request"
Calculate declaration end/start date
Declaration
Start date:
start_date = Current_date()
End date:
if (person.age < 18)&(doctor.speciality = PEDIATRICIAN) { end_date = min(birth_date + 18y - 1d, start_date + declaration_term); } else { end_date = start_date + declaration_term; }
Validate confidant person
If person age < 14 check existence of confidant_person
- in case error return 422 - msg "Confidant person is mandatory for children"
Save declaration request
Insert record to IL.declaration_request in status 'NEW'
Check "no_tax_id" flag
- If "no_tax_id"= true, tax_id field should be empty, in case error return 422
- If "no_tax_id"=false and age>14, tax_id should be present, in case error return 422
Validate person_id
USE_DEDUPLICATION_MODEL - is a flag in in ehealth.charts that turn on logic:
If person.id
is in request then
- validate person.id is UUID
- in case error return 422
- search person by person.id in MPI
- in case error return 422, "such person doesn't exist"
- search persons in mpi (Пошук персон. Версія 3)
- If new person's tax_id and authentication_number match with founded person by passed person.id - add mpi_id to declaration request
- else validate person be deduplication model (if score > PERSON_ONLINE_DEDUPLICATION_MATCH_SCORE, then add mpi_id to declaration request)
- else return error 409, "such person can't be updated. New person should be created instead"
- else validate person be deduplication model (if score > PERSON_ONLINE_DEDUPLICATION_MATCH_SCORE, then add mpi_id to declaration request)
- If new person's tax_id and authentication_number match with founded person by passed person.id - add mpi_id to declaration request
If person.id
is not in request then
- search persons in mpi (Пошук персон. Версія 3)
- If we found person by tax_id and authentication_number
- return error 409, "such person exists. Update this person."
- In case authentication_method = OFFLINE, or don't found authentication_number, or we found authentication_number but tax_id don't match - We create pairs of new person with people from cluster and send to the model.
- in case deduplication model gave score < PERSON_ONLINE_DEDUPLICATION_MATCH_SCORE, create new person
- else return error 409, "such person exists. Update this person.
- If we found person by tax_id and authentication_number
Validate phone number limit
USE_PHONE_NUMBER_AUTH_LIMIT is a flag in ehealth.charts that shows whether we count phones or not.
- in case person is found, person_id will be saved to declaration_request, and person has the same authentication_methods.phone_number, we do not count phone numbers and do not compare the phone number with global_parameters.phone_number_auth_limit. So that we can update person, but still can not use phone over limit.
- In case person is not found
- Check if (SELECT count(*) from persons where authentication_methods::json->0->>'phone_number'='$.phone_number' and persons.status='active' and is_active=true)<global_parameters.phone_number_auth_limit
in case error return 422, msg "This phone number is present more then $.global_parameters.phone_number_auth_limit times in the system"
- Check if (SELECT count(*) from persons where authentication_methods::json->0->>'phone_number'='$.phone_number' and persons.status='active' and is_active=true)<global_parameters.phone_number_auth_limit
Validate declaration limit
Count all declarations in statusactive
where OPS.declarations.employee_id==$.declaration_request.employee_id1.1 If there is an active declaration with the current person, exclude it from the selection in order to let doctor resign declaration with current patientCount all declaration_requests in statusapproved
where IL.declaration_requests.data($.employee.id) ==$.declaration_request.employee_idGet all specialities of current doctorSelect speciality from PRM.employees where PRM.employees.party_id == (select PRM.employees.party_id where PRM.employees.id=$.declaration_request.employee_id)
Select config parameter for declarations_limit where speciality == select 3Compare the result of selections 1+2 with the lowest config parameter from select 4. In case count (declarations+declaration_requests )> config_parameter, return 409 "The employee has reached the declaration limit"
Validate person authentication phone
USE_DEDUPLICATION_MODEL - is a flag in in ehealth.charts that turn on logic:
If person have confidant_person, then person.auth_phone = person.confident_person.phone
- in case error return 422 - msg "Person must have same phone as the confidant person"
Validate person documents
- issued_at, issued_by is mandatory for documents
- Validate dates
- issued_at <= now() and issued_at => birth_date
- in case `issued_at > now()` show error 422, "Document issued date should be in the past"
- in case `issued_at < person.birth_date` show error 422, "Document issued date should greater than person.birth_date "
- expiration_date > now()
- in case error show 422, "Document expiration_date should be in future"
- expiration_date is mandatory for document_type
- NATIONAL_ID
- COMPLEMENTARY_PROTECTION_CERTIFICATE
- PERMANENT_RESIDENCE_PERMIT
- REFUGEE_CERTIFICATE
- TEMPORARY_CERTIFICATE
- TEMPORARY_PASSPORT
- in case error return 422, "expiration_date is mandatory for document_type $.documents.type"
- issued_at <= now() and issued_at => birth_date
- Validate documents_type.number according to json schema
- PASSPORT - `^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$`
- NATIONAL_ID - `^[0-9]{9}$`
- BIRTH_CERTIFICATE - ` ^(?![ЫЪЭЁыъэё@%&$^#`~:,.*|}{?!])[A-ZА-ЯҐЇІЄ0-9№\\/()-]+$ `
- COMPLEMENTARY_PROTECTION_CERTIFICATE - `^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$`
- PERMANENT_RESIDENCE_PERMIT - `^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$`
- REFUGEE_CERTIFICATE - `^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$`
- TEMPORARY_CERTIFICATE - `^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$`
- TEMPORARY_PASSPORT - `` ^(?![ыъэ@%&$^#`~:,.*|}{?!])[А-ЯҐЇІЄа-яґїіє0-9 №\\\"()-]+$ `
- if `unzr`exists and is not null and matches "^[0-9]{8}-[0-9]{5}$" check if first 8 symbols = birth_date
- in case error return 422, msg "unzr or birthdate are not correct"
if documents.type=NATIONAL_ID
check if unzr exists in request, in case error return 422, msg "unzr is mandatory for document type NATIONAL_ID"
- Document numbersmaxLength < 25
Determine auth method
Determine Channel
- channel from url
- if url is for cabinet сhannel set declaration_request.сhannel = CABINET
- if not - set declaration_request.сhannel = MIS
- if url is for cabinet сhannel set declaration_request.сhannel = CABINET
Generate printout form
Invoke MAN to render print form.
Request mapping:
Parameter | Source |
---|---|
id | DECLARATION REQUEST |
curl --request POST \ --header 'Accept: text/html' \ --header 'Content-Type: application/json' \ {:host}/templates/{:declaration_printout_id}/actions/render
Set IL.declaration_request.printout_content:
MANResponse.$.data
Generate upload URL
Depending on the payload system generates list of signed urls for document scan-copies upload.
Signed URLs to be expired after some period of time (configurable `SECRETS_TTL`). If it has been expired - new declaration request should be created.
Each link is generated for one one-page document in jpeg format. Document should be no more than 10MB.
For On-line
- if no_tax_id = true
- Generate URL with type person.no_tax_id
For Offline
1. If $.declaration_request.person.tax_id not null:
- Generate URL with type person.tax_id
2. For each $.declaration_request.person.documents:
- Generate URL's with type person.{$.declaration_request.person.documents.[:].type}
3. If $.declaration_request.person.confidant_person.[:].tax_id not null, for each:
- Generate URL with type confidant_person.{confidant_person.type}.tax_id
4. For each $.declaration_request.person.confidant_person.[:].documents_person:
- Generate URL's with type confidant_person.{confidant_person.type}.{$.declaration_request.person.confidant_person.[:].documents_person.[:].type}
5. For each $.declaration_request.person.confidant_person.[:].documents_relationship:
- Generate URL's with type confidant_person.{confidant_person.type}.{$.declaration_request.person.confidant_person.[:].documents_relationship.[:].type}
6. If no_tax_id = true
- Generate URL with type person.no_tax_id
Invoke Media Content Storage to generate upload URL for each document obtained by executing logic above
IL.declaration_request.documents structure:
{ "documents":[ { "type":"person.tax_id", "url": "https://storage.googleapis.com/..." } ] }
Save documents to DB.
Generate verification code
Invoke Initialize OTP to generate one time password and send it to client number.
Phone_number: IL.declaration_request.authentication_method_current.$.authentication_number
curl -X POST \ http://localhost:4000/verifications \ -H 'content-type: application/json' \ -d '{ "phone_number": "+380936235985" }'
Generate human readable declaration number
- Use algorithm to generate declaration_number
- Declaration number should consist of a 4 serial symbols and 8 number symbols and looks like XXXX-12H4-245D
- Add field to ops.declarations and il.declaration_requests - declaration_number
- Add declaration_number to print out form
Validate uniqueness of human readable declaration number
- generate declaration_number
- Search declaration_number in declaration_requests.declaration_number
- if exists = go to 'generate declaration_number'
- else save declaration_number to declaration_request