The process is initiated by responsible person from NHS side which created and approved contract request previously and involves the transfer of a signed contract request with electronic digital signature.
Process is asynchronous. If all validations are successfully completed, the asynchronous process of creating a contract starts by processing the message.
Contract must be 2 time signed: from legal_entity and NHS sides. There is a particular order who must signed first - NHS side. After that legal entity owner can either sign contract request (will be created contract) or terminate contract request.
Preconditions
Before this the contract request should be created from MSP/PHARAMCY side and NHS employee should be appointed
This WS is designed to sign contract request from NHS side. Contract request's status must be ='PENDING_NHS_SIGN'. Method receives signed message (pkcs7) including signed content, digital signature, digital stamp and signer public key in signed_content property. All signature fields will be validated (including signer certificate authority).This service will store signed copy of Contract Request in Media Content Storage. Signed content MUST consists of JSON object with Contract Request data and printout template. Object that need to be signed is returned by Get Contract request details response, JSON.Path: $.data. data.prinout content must be changed to Print out content taken from Get Contract Request Printout Content
In DS EDRPOU/DRFO must be equal to contractor_legal_entity.edrpou
Check that EDRPOU in Certificate details exists and not empty
in case of error return 422 error ('Invalid EDRPOU in DS')
Check that EDRPOU in Certificate details is equal to EDRPOU in legal entity
Get client_id from token.
Find prm.legal_entities id by client_id
Compare EDRPOU in Certificate with legal_entities.edrpou
In case validation fails - generate 422 error
Get party.last_name using nhs_signer_id from contract_request
employees.employee_id=nhs_signer_id and client_id=employee.legal_entity_id → party.last_name
Convert prm.parties.LAST_NAME and Certificate details.SURNAME to uppercase
Compare prm.parties.LAST_NAME and Certificate details.SURNAME as Cyrillic letters
In case validation fails - generate 422 error
Validate DRFO
Get parties.tax_id using party_users.party_id by user_id.
Compare DRFO in Certificate with party.tax_id
Convert DRFO and TAX_ID to uppercase
Compare DRFO and TAX_ID as Cyrillic letters
Convert DRFO to Cyrillic and compare as Cyrillic letters
In case validation fails - generate 422 error
Validate Digital Stamp
Check that EDRPOU in Digital Stamp details exists and not empty
in case of error return 422 error ('Invalid EDRPOU in DS')
Check that EDRPOU in Certificate details is equal to EDRPOU in legal entity
Get client_id from token.
Find prm.legal_entities id by client_id
Compare EDRPOU in Certificate with legal_entities.edrpou
In case validation fails - generate 422 error
Check that EDRPOU in Digital Stamp details is equal to EDRPOU in Digital signature
Get EDRPOU from Digital signature.
Get EDRPOU from Digital Stamp.
Compare EDRPOU in Digital signature with Digital signature
In case validation fails - generate 422 error
Check employee
Contract_request can be signed by owner or nhs_signer with necessary scopes in equal legal_entity_id and same id as was previously input in contract_request.
Extract legal_entity_id (client_id) from token. Take contract_request_id.
Check client_id=nhs_legal_entity_id (nhs_side) - in case of error return 403 Error ('Invalid client id')
Validate that contract_request hasn't been signed by nhs_side already
Check if status= 'PENDING_NHS_SIGNED'
In case of error return 422 error ('The contract can't be signed by status')
Digital signature
Decode content that is encrypted in an electronic digital signature. Use Digital signature WS. Method checks digital signature and returns result.
Check signed content
Check decoded signed content with previously created on IL.db.
SELECT data
FROM contract_requests
WHERE id = {:id}
In case if they are not equal - generate 422 error (message: "Signed content does not match the previously created content")
Validate request
Validate request using JSON schema
In case validation fails - generate 422 error
Check contract request status
If status is not PENDING_NHS_SIGN - return error 422 'Incorrect status'
Validate contractor_divisions
Check divisions belongs to legal_entity and divisions.status='active'
in case of error return 422 error view $divisions ('Division must be active and within current legal_entity')
Employees from employee_divisions has employee_type='DOCTOR', status='APPROVED'
in case of error return 422 error view $employee ('Employee must be an active DOCTOR')
Check contractor_employee_divisions.division_id is present in contractor_divisions.id
in case of error return 422 error $divisions ('The division is not belong to contractor_divisions')
Check contract_number is null
in case of error return 422 error view $employee ('Employee can't be updated via Contract Request')
Validate start_date
start_date>now()
in case of error return 422 error $start_date ('Start date must be greater than create date')
Check whether all id is resolved and valid. For - contractor_legal_entity_id and nhs_legal_entity_id in status='active' and nhs_verified = true (prm.legal_entities) - contractor_owner_id and nhs_signer_id in status = 'APPROVED' (prm.employees)