oro-sdk 5.3.1 → 5.3.4
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/client.d.ts +11 -0
- package/dist/helpers/consult.d.ts +9 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/prescription-refill.d.ts +21 -0
- package/dist/oro-sdk.cjs.development.js +933 -694
- package/dist/oro-sdk.cjs.development.js.map +1 -1
- package/dist/oro-sdk.cjs.production.min.js +1 -1
- package/dist/oro-sdk.cjs.production.min.js.map +1 -1
- package/dist/oro-sdk.esm.js +932 -695
- package/dist/oro-sdk.esm.js.map +1 -1
- package/package.json +2 -2
- package/src/client.ts +22 -1
- package/src/helpers/consult.ts +29 -0
- package/src/helpers/index.ts +1 -0
- package/src/helpers/patient-registration.ts +1 -24
- package/src/helpers/prescription-refill.ts +176 -0
package/package.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"version": "5.3.
|
2
|
+
"version": "5.3.4",
|
3
3
|
"main": "dist/index.js",
|
4
4
|
"typings": "dist/index.d.ts",
|
5
5
|
"files": [
|
@@ -55,7 +55,7 @@
|
|
55
55
|
"form-data": "^4.0.0",
|
56
56
|
"formdata-node": "^4.3.1",
|
57
57
|
"idb-keyval": "^5.0.6",
|
58
|
-
"oro-sdk-apis": "3.2.
|
58
|
+
"oro-sdk-apis": "3.2.4",
|
59
59
|
"oro-toolbox": "0.0.6",
|
60
60
|
"uuid": "^8.3.2"
|
61
61
|
}
|
package/src/client.ts
CHANGED
@@ -46,7 +46,13 @@ import {
|
|
46
46
|
} from 'oro-sdk-apis'
|
47
47
|
import * as OroToolbox from 'oro-toolbox'
|
48
48
|
import { CryptoRSA } from 'oro-toolbox'
|
49
|
-
import {
|
49
|
+
import {
|
50
|
+
createRefill,
|
51
|
+
decryptConsultLockboxGrants,
|
52
|
+
decryptGrants,
|
53
|
+
registerPatient,
|
54
|
+
sessionStorePrivateKeyName,
|
55
|
+
} from './helpers'
|
50
56
|
import {
|
51
57
|
AssociatedLockboxNotFound,
|
52
58
|
IncompleteAuthentication,
|
@@ -312,6 +318,21 @@ export class OroClient {
|
|
312
318
|
)
|
313
319
|
}
|
314
320
|
|
321
|
+
/**
|
322
|
+
* Creates and stores all relevant refill data
|
323
|
+
* - New consultation is created
|
324
|
+
* - Stores refill workflow data in the lockbox
|
325
|
+
* - Updates the consult to new
|
326
|
+
*
|
327
|
+
* @param consult
|
328
|
+
* @param populatedRefillWorkflow
|
329
|
+
* @returns
|
330
|
+
*/
|
331
|
+
public async createRefill(consult: ConsultRequest, populatedRefillWorkflow: WorkflowData): Promise<void> {
|
332
|
+
if (!this.rsa) throw IncompleteAuthentication
|
333
|
+
return createRefill(consult, populatedRefillWorkflow, this)
|
334
|
+
}
|
335
|
+
|
315
336
|
/**
|
316
337
|
* Fetches all grants, and consultations that exist in each lockbox
|
317
338
|
* Then updates the index for the current user with the lockbox consult relationship
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { Consult, ConsultRequest } from 'oro-sdk-apis'
|
2
|
+
import { OroClient } from '..'
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Creates a consultation if one has not been created and fails to be retrieved by the payment intent
|
6
|
+
* @param consult
|
7
|
+
* @param oroClient
|
8
|
+
* @returns the consult Uuid
|
9
|
+
*/
|
10
|
+
export async function getOrCreatePatientConsultationUuid(
|
11
|
+
consult: ConsultRequest,
|
12
|
+
oroClient: OroClient
|
13
|
+
): Promise<Consult> {
|
14
|
+
let payment = await oroClient.practiceClient.practiceGetPayment(
|
15
|
+
consult.uuidPractice,
|
16
|
+
consult.idStripeInvoiceOrPaymentIntent
|
17
|
+
)
|
18
|
+
if (payment && payment.uuidConsult) {
|
19
|
+
return oroClient.consultClient.getConsultByUUID(payment.uuidConsult).catch((err) => {
|
20
|
+
console.error('Error while retrieving consult', err)
|
21
|
+
throw err
|
22
|
+
})
|
23
|
+
} else {
|
24
|
+
return await oroClient.consultClient.consultCreate(consult).catch((err) => {
|
25
|
+
console.error('Error while creating consult', err)
|
26
|
+
throw err
|
27
|
+
})
|
28
|
+
}
|
29
|
+
}
|
package/src/helpers/index.ts
CHANGED
@@ -29,6 +29,7 @@ import {
|
|
29
29
|
RegisterPatientOutput,
|
30
30
|
toActualObject,
|
31
31
|
} from '..'
|
32
|
+
import { getOrCreatePatientConsultationUuid } from './consult'
|
32
33
|
|
33
34
|
const MAX_RETRIES = 15
|
34
35
|
|
@@ -275,30 +276,6 @@ export async function registerPatient(
|
|
275
276
|
}
|
276
277
|
}
|
277
278
|
|
278
|
-
/**
|
279
|
-
* Creates a consultation if one has not been created and fails to be retrieved by the payment intent
|
280
|
-
* @param consult
|
281
|
-
* @param oroClient
|
282
|
-
* @returns the consult Uuid
|
283
|
-
*/
|
284
|
-
async function getOrCreatePatientConsultationUuid(consult: ConsultRequest, oroClient: OroClient): Promise<Consult> {
|
285
|
-
let payment = await oroClient.practiceClient.practiceGetPayment(
|
286
|
-
consult.uuidPractice,
|
287
|
-
consult.idStripeInvoiceOrPaymentIntent
|
288
|
-
)
|
289
|
-
if (payment && payment.uuidConsult) {
|
290
|
-
return oroClient.consultClient.getConsultByUUID(payment.uuidConsult).catch((err) => {
|
291
|
-
console.error('Error while retrieving consult', err)
|
292
|
-
throw err
|
293
|
-
})
|
294
|
-
} else {
|
295
|
-
return await oroClient.consultClient.consultCreate(consult).catch((err) => {
|
296
|
-
console.error('Error while creating consult', err)
|
297
|
-
throw err
|
298
|
-
})
|
299
|
-
}
|
300
|
-
}
|
301
|
-
|
302
279
|
/**
|
303
280
|
* Creates a new lockbox for the patient if they do not have any, otherwise, use the first (and only one)
|
304
281
|
* @param oroClient
|
@@ -0,0 +1,176 @@
|
|
1
|
+
import {
|
2
|
+
Consult,
|
3
|
+
ConsultRequest,
|
4
|
+
DocumentType,
|
5
|
+
MedicalStatus,
|
6
|
+
MetadataCategory,
|
7
|
+
PlaceData,
|
8
|
+
SelectedAnswersData,
|
9
|
+
Uuid,
|
10
|
+
WorkflowData,
|
11
|
+
} from 'oro-sdk-apis'
|
12
|
+
import { OroClient } from '..'
|
13
|
+
import { getOrCreatePatientConsultationUuid } from './consult'
|
14
|
+
|
15
|
+
const MAX_RETRIES = 15
|
16
|
+
/**
|
17
|
+
* Placeholder while the workflow interpreter for the refill flows is complete
|
18
|
+
*
|
19
|
+
* Creates a fake workflow in which the workflow data will reside
|
20
|
+
*
|
21
|
+
* @param isTreatmentWorking the value from the `is treatment working` question
|
22
|
+
* @param hasSideEffects the value from the `does the treatment have side effects` question
|
23
|
+
* @param deliveryAddress the provided delivery address
|
24
|
+
* @param pharmacy
|
25
|
+
* @returns a workflow
|
26
|
+
*/
|
27
|
+
export function getRefillAnswersAsWorkflow(
|
28
|
+
isTreatmentWorking: string,
|
29
|
+
hasSideEffects: string,
|
30
|
+
deliveryAddress?: string,
|
31
|
+
pharmacy?: PlaceData
|
32
|
+
): WorkflowData {
|
33
|
+
let selectedAnswers: SelectedAnswersData = [
|
34
|
+
{
|
35
|
+
['isTreatmentWorking']: isTreatmentWorking,
|
36
|
+
},
|
37
|
+
{
|
38
|
+
['hasSideEffects']: hasSideEffects,
|
39
|
+
},
|
40
|
+
]
|
41
|
+
|
42
|
+
if (deliveryAddress) selectedAnswers.push({ ['deliveryAddress']: deliveryAddress })
|
43
|
+
if (pharmacy) selectedAnswers.push({ ['pharmacy']: JSON.stringify(pharmacy) })
|
44
|
+
|
45
|
+
return {
|
46
|
+
"id": "32573a20-6f1d-49be-9ad3-b87c58074979",
|
47
|
+
"createdAt": "2022-10-03T00:00:00.000Z",
|
48
|
+
"culDeSacs": [],
|
49
|
+
"hidePlanRules": [],
|
50
|
+
"pages": [
|
51
|
+
{
|
52
|
+
"title": "Prescription Refill",
|
53
|
+
"groups": [
|
54
|
+
{
|
55
|
+
"type": "field-group",
|
56
|
+
"fieldsAndGroups": [
|
57
|
+
{
|
58
|
+
"type": "field",
|
59
|
+
"id": "isTreatmentWorking"
|
60
|
+
},
|
61
|
+
{
|
62
|
+
"type": "field",
|
63
|
+
"id": "hasSideEffects"
|
64
|
+
},
|
65
|
+
{
|
66
|
+
"type": "field",
|
67
|
+
"id": "youPharmacy"
|
68
|
+
},
|
69
|
+
{
|
70
|
+
"type": "field",
|
71
|
+
"id": "youAddress"
|
72
|
+
}
|
73
|
+
]
|
74
|
+
}
|
75
|
+
],
|
76
|
+
"questions": {
|
77
|
+
"isTreatmentWorking": {
|
78
|
+
"label": "Is the treatment working for you?",
|
79
|
+
"kind": "radio",
|
80
|
+
"inline": true,
|
81
|
+
"inlineLabel": false,
|
82
|
+
"metaCategory": MetadataCategory.Refill,
|
83
|
+
"answers": {
|
84
|
+
"73bec6eb-0310-4787-af3c-ac9c291737b2": {
|
85
|
+
"text": "Yes"
|
86
|
+
},
|
87
|
+
"e193951f-986f-4db3-bede-903045a1804a": {
|
88
|
+
"text": "No"
|
89
|
+
}
|
90
|
+
}
|
91
|
+
},
|
92
|
+
"hasSideEffects": {
|
93
|
+
"label": "Are there any side effects",
|
94
|
+
"kind": "radio",
|
95
|
+
"inline": true,
|
96
|
+
"inlineLabel": false,
|
97
|
+
"metaCategory": MetadataCategory.Refill,
|
98
|
+
"answers": {
|
99
|
+
"1b87ad22-d316-4fac-9c7f-8f4ccb841aed": {
|
100
|
+
"text": "Yes"
|
101
|
+
},
|
102
|
+
"ab7f5a41-c351-4f5d-a568-e38f9f200e9a": {
|
103
|
+
"text": "No"
|
104
|
+
}
|
105
|
+
}
|
106
|
+
},
|
107
|
+
"youPharmacy": {
|
108
|
+
"kind": "online-pharmacy-picker",
|
109
|
+
"label": "Which pharmacy do you want the prescription sent to?",
|
110
|
+
"metaCategory": MetadataCategory.Refill,
|
111
|
+
"minorLabel": " (Optional)",
|
112
|
+
"summaryLabel": "Your pharmacy"
|
113
|
+
},
|
114
|
+
"youAddress": {
|
115
|
+
"kind": "place-address",
|
116
|
+
"label": "Address",
|
117
|
+
"metaCategory": MetadataCategory.Refill
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
],
|
122
|
+
"locale": "en",
|
123
|
+
selectedAnswers
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* Complete refill flow, creates a consult, stores refill data and updates consultation status
|
129
|
+
* @param consultRequest
|
130
|
+
* @param populatedRefillWorkflow the refill workflow data
|
131
|
+
* @param oroClient
|
132
|
+
*/
|
133
|
+
export async function createRefill(
|
134
|
+
consultRequest: ConsultRequest,
|
135
|
+
populatedRefillWorkflow: WorkflowData,
|
136
|
+
oroClient: OroClient
|
137
|
+
) {
|
138
|
+
let retry = MAX_RETRIES
|
139
|
+
let errorsThrown: Error[] = []
|
140
|
+
|
141
|
+
let newConsult: Consult | undefined
|
142
|
+
let lockboxUuid: Uuid | undefined
|
143
|
+
|
144
|
+
for (; retry > 0; retry--) {
|
145
|
+
try {
|
146
|
+
if (!newConsult) newConsult = await getOrCreatePatientConsultationUuid(consultRequest, oroClient)
|
147
|
+
|
148
|
+
if (!lockboxUuid) lockboxUuid = (await oroClient.getGrants())[0].lockboxUuid
|
149
|
+
|
150
|
+
await oroClient
|
151
|
+
.getOrInsertJsonData(
|
152
|
+
lockboxUuid!,
|
153
|
+
populatedRefillWorkflow,
|
154
|
+
{
|
155
|
+
category: MetadataCategory.Refill,
|
156
|
+
documentType: DocumentType.PopulatedWorkflowData,
|
157
|
+
consultationIds: [newConsult.uuid],
|
158
|
+
},
|
159
|
+
{}
|
160
|
+
)
|
161
|
+
.catch((err) => {
|
162
|
+
console.error('[SDK: prescription refill] Some errors happened during refill data upload', err)
|
163
|
+
errorsThrown.push(err)
|
164
|
+
})
|
165
|
+
|
166
|
+
if (errorsThrown.length > 0) throw errorsThrown
|
167
|
+
await oroClient.consultClient.updateConsultByUUID(newConsult.uuid, {
|
168
|
+
statusMedical: MedicalStatus.New,
|
169
|
+
})
|
170
|
+
} catch (err) {
|
171
|
+
console.error(`[SDK] Error occured during refill: ${err}, retrying... Retries remaining: ${retry}`)
|
172
|
+
errorsThrown = []
|
173
|
+
continue
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|