@oneblink/sdk-core 7.3.0-beta.1 → 7.3.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,24 +31,25 @@ type PaymentDisplayDetail = {
31
31
  *
32
32
  * ```js
33
33
  * const detailItems =
34
- * paymentService.getDisplayDetailsFromFormSubmissionPayment({
34
+ * paymentService.getDisplayDetailsFromFormSubmissionPayment(
35
35
  * formSubmissionPayment,
36
- * formatCurrency,
37
- * })
36
+ * {
37
+ * formatCurrency,
38
+ * formatDateTime,
39
+ * formatDate,
40
+ * },
41
+ * )
38
42
  * ```
39
43
  *
44
+ * @param formSubmissionPayment
40
45
  * @param options
41
46
  * @returns
42
47
  */
43
- export declare const getDisplayDetailsFromFormSubmissionPayment: ({ formSubmissionPayment, formatCurrency, formatDateTime, }: {
44
- /** The form submission payment to get the details from */
45
- formSubmissionPayment: SubmissionTypes.FormSubmissionPayment;
46
- /** A function to format any curreny values */
47
- formatCurrency: ReplaceInjectablesFormatters['formatCurrency'];
48
- /**
49
- * A function to format any dates. If this is not passed, datetimes will be
50
- * returned as iso strings.
51
- */
52
- formatDateTime: ReplaceInjectablesFormatters['formatDateTime'];
53
- }) => PaymentDisplayDetail[];
48
+ export declare const getDisplayDetailsFromFormSubmissionPayment: (formSubmissionPayment: SubmissionTypes.FormSubmissionPayment, { formatCurrency, formatDateTime, formatDate, }: Pick<ReplaceInjectablesFormatters, 'formatCurrency' | 'formatDate' | 'formatDateTime'>) => {
49
+ amount: {
50
+ value: number;
51
+ formatted: string;
52
+ };
53
+ paymentDisplayDetails: PaymentDisplayDetail[];
54
+ } | undefined;
54
55
  export {};
@@ -62,143 +62,167 @@ exports.checkForPaymentEvent = checkForPaymentEvent;
62
62
  *
63
63
  * ```js
64
64
  * const detailItems =
65
- * paymentService.getDisplayDetailsFromFormSubmissionPayment({
65
+ * paymentService.getDisplayDetailsFromFormSubmissionPayment(
66
66
  * formSubmissionPayment,
67
- * formatCurrency,
68
- * })
67
+ * {
68
+ * formatCurrency,
69
+ * formatDateTime,
70
+ * formatDate,
71
+ * },
72
+ * )
69
73
  * ```
70
74
  *
75
+ * @param formSubmissionPayment
71
76
  * @param options
72
77
  * @returns
73
78
  */
74
- const getDisplayDetailsFromFormSubmissionPayment = ({ formSubmissionPayment, formatCurrency, formatDateTime, }) => {
79
+ const getDisplayDetailsFromFormSubmissionPayment = (
80
+ /** The form submission payment to get the details from */
81
+ formSubmissionPayment, { formatCurrency, formatDateTime, formatDate, }) => {
75
82
  var _a, _b;
76
83
  switch (formSubmissionPayment.type) {
77
84
  case 'NSW_GOV_PAY': {
78
85
  const { paymentTransaction } = formSubmissionPayment;
79
86
  if (!paymentTransaction || !paymentTransaction.agencyCompletionPayment) {
80
- return [];
87
+ return;
81
88
  }
82
- return [
83
- {
84
- key: 'completionReference',
85
- label: 'Completion Reference',
86
- value: paymentTransaction.agencyCompletionPayment
87
- .paymentCompletionReference,
88
- },
89
- {
90
- key: 'paymentReference',
91
- label: 'Payment Reference',
92
- value: paymentTransaction.agencyCompletionPayment.paymentReference,
93
- },
94
- {
95
- key: 'bankReference',
96
- label: 'Bank Reference',
97
- value: paymentTransaction.agencyCompletionPayment.bankReference,
98
- },
99
- {
100
- key: 'paymentMethod',
101
- label: 'Payment Method',
102
- value: paymentTransaction.agencyCompletionPayment.paymentMethod,
103
- },
104
- ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===
105
- 'BPAY' && ((_a = paymentTransaction.agencyCompletionPayment.bPay) === null || _a === void 0 ? void 0 : _a.billerCode)
106
- ? [
107
- {
108
- key: 'billerCode',
109
- label: 'BPay Biller Code',
110
- value: paymentTransaction.agencyCompletionPayment.bPay.billerCode,
111
- },
112
- ]
113
- : []),
114
- ...(paymentTransaction.agencyCompletionPayment.paymentMethod === 'CARD'
115
- ? [
116
- {
117
- key: 'creditCardMask',
118
- label: 'Card Number',
119
- value: `xxxx xxxx xxxx ${(_b = paymentTransaction.agencyCompletionPayment.card) === null || _b === void 0 ? void 0 : _b.last4Digits}`,
120
- },
121
- ]
122
- : []),
123
- {
124
- key: 'amount',
125
- label: 'Amount',
126
- value: formatCurrency(paymentTransaction.agencyCompletionPayment.amount),
127
- },
128
- {
129
- key: 'surchargeAmount',
130
- label: 'Surcharge Amount',
131
- value: formatCurrency(paymentTransaction.agencyCompletionPayment.surcharge),
132
- },
133
- {
134
- key: 'surchargeGST',
135
- label: 'Surcharge GST',
136
- value: formatCurrency(paymentTransaction.agencyCompletionPayment.surchargeGst),
137
- },
138
- {
139
- key: 'createdDateTime',
140
- label: 'Created Date Time',
141
- value: formatDateTime(formSubmissionPayment.createdAt),
142
- },
143
- ];
89
+ const amount = {
90
+ value: paymentTransaction.agencyCompletionPayment.amount,
91
+ formatted: formatCurrency(paymentTransaction.agencyCompletionPayment.amount),
92
+ };
93
+ return {
94
+ amount,
95
+ paymentDisplayDetails: [
96
+ {
97
+ key: 'completionReference',
98
+ label: 'Completion Reference',
99
+ value: paymentTransaction.agencyCompletionPayment
100
+ .paymentCompletionReference,
101
+ },
102
+ {
103
+ key: 'paymentReference',
104
+ label: 'Payment Reference',
105
+ value: paymentTransaction.agencyCompletionPayment.paymentReference,
106
+ },
107
+ {
108
+ key: 'bankReference',
109
+ label: 'Bank Reference',
110
+ value: paymentTransaction.agencyCompletionPayment.bankReference,
111
+ },
112
+ {
113
+ key: 'paymentMethod',
114
+ label: 'Payment Method',
115
+ value: paymentTransaction.agencyCompletionPayment.paymentMethod,
116
+ },
117
+ ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===
118
+ 'BPAY' &&
119
+ ((_a = paymentTransaction.agencyCompletionPayment.bPay) === null || _a === void 0 ? void 0 : _a.billerCode)
120
+ ? [
121
+ {
122
+ key: 'billerCode',
123
+ label: 'BPay Biller Code',
124
+ value: paymentTransaction.agencyCompletionPayment.bPay.billerCode,
125
+ },
126
+ ]
127
+ : []),
128
+ ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===
129
+ 'CARD'
130
+ ? [
131
+ {
132
+ key: 'creditCardMask',
133
+ label: 'Card Number',
134
+ value: `xxxx xxxx xxxx ${(_b = paymentTransaction.agencyCompletionPayment.card) === null || _b === void 0 ? void 0 : _b.last4Digits}`,
135
+ },
136
+ ]
137
+ : []),
138
+ {
139
+ key: 'amount',
140
+ label: 'Amount',
141
+ value: amount.formatted,
142
+ },
143
+ {
144
+ key: 'surchargeAmount',
145
+ label: 'Surcharge Amount',
146
+ value: formatCurrency(paymentTransaction.agencyCompletionPayment.surcharge),
147
+ },
148
+ {
149
+ key: 'surchargeGST',
150
+ label: 'Surcharge GST',
151
+ value: formatCurrency(paymentTransaction.agencyCompletionPayment.surchargeGst),
152
+ },
153
+ {
154
+ key: 'createdDateTime',
155
+ label: 'Created Date Time',
156
+ value: formatDateTime(formSubmissionPayment.createdAt),
157
+ },
158
+ ],
159
+ };
144
160
  }
145
161
  case 'BPOINT': {
146
162
  const { paymentTransaction } = formSubmissionPayment;
147
163
  if (!paymentTransaction) {
148
- return [];
164
+ return;
149
165
  }
150
- return [
151
- {
152
- key: 'receiptNumber',
153
- label: 'Receipt Number',
154
- value: paymentTransaction.ReceiptNumber,
155
- },
156
- {
157
- key: 'crn1',
158
- label: 'CRN 1',
159
- value: paymentTransaction.Crn1,
160
- },
161
- {
162
- key: 'crn2',
163
- label: 'CRN 2',
164
- value: paymentTransaction.Crn2,
165
- },
166
- {
167
- key: 'crn3',
168
- label: 'CRN 3',
169
- value: paymentTransaction.Crn3,
170
- },
171
- {
172
- key: 'billerCode',
173
- label: 'Biller Code',
174
- value: paymentTransaction.BillerCode,
175
- },
176
- {
177
- key: 'creditCardMask',
178
- label: 'Card Number',
179
- value: paymentTransaction.CardDetails.MaskedCardNumber,
180
- },
181
- {
182
- key: 'amount',
183
- label: 'Amount',
184
- value: formatCurrency(paymentTransaction.Amount / 100),
185
- },
186
- {
187
- key: 'surchargeAmount',
188
- label: 'Surcharge Amount',
189
- value: formatCurrency(paymentTransaction.AmountSurcharge / 100),
190
- },
191
- {
192
- key: 'processedDateTime',
193
- label: 'Processed Date Time',
194
- value: formatDateTime(paymentTransaction.ProcessedDateTime),
195
- },
196
- ];
166
+ const amountValue = paymentTransaction.Amount / 100;
167
+ const amount = {
168
+ value: amountValue,
169
+ formatted: formatCurrency(amountValue),
170
+ };
171
+ return {
172
+ amount,
173
+ paymentDisplayDetails: [
174
+ {
175
+ key: 'receiptNumber',
176
+ label: 'Receipt Number',
177
+ value: paymentTransaction.ReceiptNumber,
178
+ },
179
+ {
180
+ key: 'crn1',
181
+ label: 'CRN 1',
182
+ value: paymentTransaction.Crn1,
183
+ },
184
+ {
185
+ key: 'crn2',
186
+ label: 'CRN 2',
187
+ value: paymentTransaction.Crn2,
188
+ },
189
+ {
190
+ key: 'crn3',
191
+ label: 'CRN 3',
192
+ value: paymentTransaction.Crn3,
193
+ },
194
+ {
195
+ key: 'billerCode',
196
+ label: 'Biller Code',
197
+ value: paymentTransaction.BillerCode,
198
+ },
199
+ {
200
+ key: 'creditCardMask',
201
+ label: 'Card Number',
202
+ value: paymentTransaction.CardDetails.MaskedCardNumber,
203
+ },
204
+ {
205
+ key: 'amount',
206
+ label: 'Amount',
207
+ value: amount.formatted,
208
+ },
209
+ {
210
+ key: 'surchargeAmount',
211
+ label: 'Surcharge Amount',
212
+ value: formatCurrency(paymentTransaction.AmountSurcharge / 100),
213
+ },
214
+ {
215
+ key: 'processedDateTime',
216
+ label: 'Processed Date Time',
217
+ value: formatDateTime(paymentTransaction.ProcessedDateTime),
218
+ },
219
+ ],
220
+ };
197
221
  }
198
222
  case 'CP_PAY': {
199
223
  const { paymentTransaction } = formSubmissionPayment;
200
224
  if (!paymentTransaction) {
201
- return [];
225
+ return;
202
226
  }
203
227
  const determineDetails = () => {
204
228
  var _a, _b;
@@ -212,8 +236,14 @@ const getDisplayDetailsFromFormSubmissionPayment = ({ formSubmissionPayment, for
212
236
  ? `xxxx xxxx xxxx ${paymentTransaction.result.lastFour}`
213
237
  : undefined,
214
238
  amount: paymentTransaction.result.amount !== undefined
215
- ? formatCurrency(paymentTransaction.result.amount)
216
- : 'Unknown',
239
+ ? {
240
+ value: paymentTransaction.result.amount,
241
+ formatted: formatCurrency(paymentTransaction.result.amount),
242
+ }
243
+ : {
244
+ value: NaN,
245
+ formatted: 'Unknown',
246
+ },
217
247
  createdDateTime: paymentTransaction.result.createdOnUtc,
218
248
  };
219
249
  }
@@ -229,103 +259,110 @@ const getDisplayDetailsFromFormSubmissionPayment = ({ formSubmissionPayment, for
229
259
  creditCardMask: paymentTransaction.lastFour
230
260
  ? `xxxx xxxx xxxx ${paymentTransaction.lastFour}`
231
261
  : undefined,
232
- amount: formatCurrency(paymentTransaction.amount),
262
+ amount: {
263
+ value: paymentTransaction.amount,
264
+ formatted: formatCurrency(paymentTransaction.amount),
265
+ },
233
266
  createdDateTime: paymentTransaction.createdAt,
234
267
  };
235
268
  }
236
269
  }
237
270
  };
238
271
  const { transactionId, orderNumber, paymentType, creditCardMask, amount, createdDateTime, } = determineDetails();
239
- const result = [];
272
+ const paymentDisplayDetails = [];
240
273
  if (transactionId) {
241
- result.push({
274
+ paymentDisplayDetails.push({
242
275
  key: 'transactionId',
243
276
  label: 'Transaction Id',
244
277
  value: transactionId,
245
278
  });
246
279
  }
247
280
  if (orderNumber) {
248
- result.push({
281
+ paymentDisplayDetails.push({
249
282
  key: 'orderNumber',
250
283
  label: 'Order Number',
251
284
  value: orderNumber,
252
285
  });
253
286
  }
254
287
  if (paymentType) {
255
- result.push({
288
+ paymentDisplayDetails.push({
256
289
  key: 'paymentType',
257
290
  label: 'Payment Type',
258
291
  value: paymentType,
259
292
  });
260
293
  }
261
294
  if (creditCardMask) {
262
- result.push({
295
+ paymentDisplayDetails.push({
263
296
  key: 'creditCardMask',
264
297
  label: 'Card Number',
265
298
  value: creditCardMask,
266
299
  });
267
300
  }
268
- if (amount) {
269
- result.push({
270
- key: 'amount',
271
- label: 'Amount',
272
- value: amount,
273
- });
274
- }
301
+ paymentDisplayDetails.push({
302
+ key: 'amount',
303
+ label: 'Amount',
304
+ value: amount.formatted,
305
+ });
275
306
  if (createdDateTime) {
276
- result.push({
307
+ paymentDisplayDetails.push({
277
308
  key: 'createdDateTime',
278
309
  label: 'Created At',
279
310
  value: formatDateTime(createdDateTime),
280
311
  });
281
312
  }
282
- return result;
313
+ return {
314
+ amount,
315
+ paymentDisplayDetails,
316
+ };
283
317
  }
284
318
  case 'WESTPAC_QUICK_STREAM': {
285
319
  const { paymentTransaction } = formSubmissionPayment;
286
320
  if (!paymentTransaction) {
287
- return [];
321
+ return;
288
322
  }
289
- return [
290
- {
291
- key: 'receiptNumber',
292
- label: 'Receipt Number',
293
- value: paymentTransaction.receiptNumber,
294
- },
295
- {
296
- key: 'paymentReferenceNumber',
297
- label: 'Payment Reference',
298
- value: paymentTransaction.paymentReferenceNumber,
299
- },
300
- {
301
- key: 'customerReferenceNumber',
302
- label: 'Customer Reference Number',
303
- value: paymentTransaction.customerReferenceNumber,
304
- },
305
- ...(paymentTransaction.totalAmount
306
- ? [
307
- {
308
- key: 'amount',
309
- label: 'Amount',
310
- value: formatCurrency(parseFloat(paymentTransaction.totalAmount.amount.toString())),
311
- },
312
- ]
313
- : []),
314
- ...(paymentTransaction.surchargeAmount.amount
315
- ? [
316
- {
317
- key: 'surchargeAmount',
318
- label: 'Surcharge Amount',
319
- value: formatCurrency(parseFloat(paymentTransaction.surchargeAmount.amount.toString())),
320
- },
321
- ]
322
- : []),
323
- {
324
- key: 'settlementDate',
325
- label: 'Settlement Date',
326
- value: formatDateTime(paymentTransaction.settlementDate),
327
- },
328
- ];
323
+ const amount = {
324
+ value: paymentTransaction.totalAmount.amount,
325
+ formatted: formatCurrency(parseFloat(paymentTransaction.totalAmount.amount.toString())),
326
+ };
327
+ return {
328
+ amount,
329
+ paymentDisplayDetails: [
330
+ {
331
+ key: 'receiptNumber',
332
+ label: 'Receipt Number',
333
+ value: paymentTransaction.receiptNumber,
334
+ },
335
+ {
336
+ key: 'paymentReferenceNumber',
337
+ label: 'Payment Reference',
338
+ value: paymentTransaction.paymentReferenceNumber,
339
+ },
340
+ {
341
+ key: 'customerReferenceNumber',
342
+ label: 'Customer Reference Number',
343
+ value: paymentTransaction.customerReferenceNumber,
344
+ },
345
+ {
346
+ key: 'amount',
347
+ label: 'Amount',
348
+ value: amount.formatted,
349
+ },
350
+ ...(paymentTransaction.surchargeAmount.amount
351
+ ? [
352
+ {
353
+ key: 'surchargeAmount',
354
+ label: 'Surcharge Amount',
355
+ value: formatCurrency(parseFloat(paymentTransaction.surchargeAmount.amount.toString())),
356
+ },
357
+ ]
358
+ : []),
359
+ {
360
+ key: 'settlementDate',
361
+ label: 'Settlement Date',
362
+ value: formatDate(paymentTransaction.settlementDate),
363
+ },
364
+ ],
365
+ };
329
366
  }
330
367
  }
331
368
  };
@@ -1 +1 @@
1
- {"version":3,"file":"paymentService.js","sourceRoot":"","sources":["../src/paymentService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FormTypes,\n SubmissionEventTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { conditionalLogicService, formElementsService } from '.'\nimport {\n getRootElementValueById,\n ReplaceInjectablesFormatters,\n} from './submissionService'\n\n/**\n * Examine a submission and its form definition to validate whether a payment\n * workflow event needs to run.\n *\n * #### Example\n *\n * ```js\n * const result = paymentService.checkForPaymentEvent(form, submission)\n * ```\n *\n * @param definition\n * @param submission\n * @returns\n */\nexport function checkForPaymentEvent(\n definition: FormTypes.Form,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n):\n | {\n paymentSubmissionEvent: SubmissionEventTypes.FormPaymentEvent\n amount: number\n }\n | undefined {\n const paymentSubmissionEvents = definition.paymentEvents || []\n const paymentSubmissionEvent = paymentSubmissionEvents.find(\n (paymentSubmissionEvent) => {\n return (\n paymentSubmissionEvent &&\n conditionalLogicService.evaluateConditionalPredicates({\n isConditional: !!paymentSubmissionEvent.conditionallyExecute,\n requiresAllConditionalPredicates:\n !!paymentSubmissionEvent.requiresAllConditionallyExecutePredicates,\n conditionalPredicates:\n paymentSubmissionEvent.conditionallyExecutePredicates || [],\n submission: submission,\n formElements: definition.elements,\n })\n )\n },\n )\n\n if (!paymentSubmissionEvent) {\n return\n }\n console.log(\n 'Checking if submission with payment submission event needs processing',\n )\n\n const amountElement = formElementsService.findFormElement(\n definition.elements,\n (element) => element.id === paymentSubmissionEvent.configuration.elementId,\n )\n if (!amountElement || amountElement.type === 'page') {\n console.log(\n 'Form has a payment submission event but the amount element does not exist, throwing error',\n )\n throw new Error(\n 'We could not find the configuration required to make a payment. Please contact your administrator to ensure your application configuration has been completed successfully.',\n )\n }\n\n console.log('Found form element for payment submission event', amountElement)\n\n const amount = getRootElementValueById(\n amountElement.id,\n definition.elements,\n submission,\n )\n\n if (!amount) {\n console.log(\n 'Form has a payment submission event but the amount has been entered as 0 or not at all, finishing as normal submission',\n )\n return\n }\n\n if (typeof amount !== 'number') {\n console.log(\n 'Form has a payment submission event but the amount is not a number, throwing error',\n )\n throw new Error(\n 'The configuration required to make a payment is incorrect. Please contact your administrator to ensure your application configuration has been completed successfully.',\n )\n }\n\n const result = {\n paymentSubmissionEvent,\n amount,\n }\n\n return result\n}\n\ntype PaymentDisplayDetail = {\n label: string\n value: string\n /** A key to identify the detail */\n key: string\n}\n\n/**\n * Retrieve an array of detail items from a form submission payment.\n *\n * #### Example\n *\n * ```js\n * const detailItems =\n * paymentService.getDisplayDetailsFromFormSubmissionPayment({\n * formSubmissionPayment,\n * formatCurrency,\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport const getDisplayDetailsFromFormSubmissionPayment = ({\n formSubmissionPayment,\n formatCurrency,\n formatDateTime,\n}: {\n /** The form submission payment to get the details from */\n formSubmissionPayment: SubmissionTypes.FormSubmissionPayment\n /** A function to format any curreny values */\n formatCurrency: ReplaceInjectablesFormatters['formatCurrency']\n /**\n * A function to format any dates. If this is not passed, datetimes will be\n * returned as iso strings.\n */\n formatDateTime: ReplaceInjectablesFormatters['formatDateTime']\n}): PaymentDisplayDetail[] => {\n switch (formSubmissionPayment.type) {\n case 'NSW_GOV_PAY': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction || !paymentTransaction.agencyCompletionPayment) {\n return []\n }\n return [\n {\n key: 'completionReference',\n label: 'Completion Reference',\n value:\n paymentTransaction.agencyCompletionPayment\n .paymentCompletionReference,\n },\n {\n key: 'paymentReference',\n label: 'Payment Reference',\n value: paymentTransaction.agencyCompletionPayment.paymentReference,\n },\n {\n key: 'bankReference',\n label: 'Bank Reference',\n value: paymentTransaction.agencyCompletionPayment.bankReference,\n },\n {\n key: 'paymentMethod',\n label: 'Payment Method',\n value: paymentTransaction.agencyCompletionPayment.paymentMethod,\n },\n ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===\n 'BPAY' && paymentTransaction.agencyCompletionPayment.bPay?.billerCode\n ? [\n {\n key: 'billerCode',\n label: 'BPay Biller Code',\n value:\n paymentTransaction.agencyCompletionPayment.bPay.billerCode,\n },\n ]\n : []),\n ...(paymentTransaction.agencyCompletionPayment.paymentMethod === 'CARD'\n ? [\n {\n key: 'creditCardMask',\n label: 'Card Number',\n value: `xxxx xxxx xxxx ${paymentTransaction.agencyCompletionPayment.card?.last4Digits}`,\n },\n ]\n : []),\n {\n key: 'amount',\n label: 'Amount',\n value: formatCurrency(\n paymentTransaction.agencyCompletionPayment.amount,\n ),\n },\n {\n key: 'surchargeAmount',\n label: 'Surcharge Amount',\n value: formatCurrency(\n paymentTransaction.agencyCompletionPayment.surcharge,\n ),\n },\n {\n key: 'surchargeGST',\n label: 'Surcharge GST',\n value: formatCurrency(\n paymentTransaction.agencyCompletionPayment.surchargeGst,\n ),\n },\n {\n key: 'createdDateTime',\n label: 'Created Date Time',\n value: formatDateTime(formSubmissionPayment.createdAt),\n },\n ]\n }\n case 'BPOINT': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction) {\n return []\n }\n return [\n {\n key: 'receiptNumber',\n label: 'Receipt Number',\n value: paymentTransaction.ReceiptNumber,\n },\n {\n key: 'crn1',\n label: 'CRN 1',\n value: paymentTransaction.Crn1,\n },\n {\n key: 'crn2',\n label: 'CRN 2',\n value: paymentTransaction.Crn2,\n },\n {\n key: 'crn3',\n label: 'CRN 3',\n value: paymentTransaction.Crn3,\n },\n {\n key: 'billerCode',\n label: 'Biller Code',\n value: paymentTransaction.BillerCode,\n },\n {\n key: 'creditCardMask',\n label: 'Card Number',\n value: paymentTransaction.CardDetails.MaskedCardNumber,\n },\n {\n key: 'amount',\n label: 'Amount',\n value: formatCurrency(paymentTransaction.Amount / 100),\n },\n {\n key: 'surchargeAmount',\n label: 'Surcharge Amount',\n value: formatCurrency(paymentTransaction.AmountSurcharge / 100),\n },\n {\n key: 'processedDateTime',\n label: 'Processed Date Time',\n value: formatDateTime(paymentTransaction.ProcessedDateTime),\n },\n ]\n }\n case 'CP_PAY': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction) {\n return []\n }\n\n const determineDetails = () => {\n switch (paymentTransaction.cpPayVersion) {\n case 'v2': {\n return {\n transactionId: paymentTransaction.result.id,\n orderNumber:\n paymentTransaction.result.externalReferenceId ?? undefined,\n paymentType: paymentTransaction.result.paymentType,\n creditCardMask: paymentTransaction.result.lastFour\n ? `xxxx xxxx xxxx ${paymentTransaction.result.lastFour}`\n : undefined,\n amount:\n paymentTransaction.result.amount !== undefined\n ? formatCurrency(paymentTransaction.result.amount)\n : 'Unknown',\n createdDateTime: paymentTransaction.result.createdOnUtc,\n }\n }\n default: {\n return {\n transactionId: paymentTransaction.transactionId,\n orderNumber: paymentTransaction.orderNumber ?? undefined,\n paymentType:\n paymentTransaction.paymentTypeId === 1\n ? 'Credit/Debit Card'\n : paymentTransaction.paymentTypeId === 2\n ? 'ACH'\n : undefined,\n creditCardMask: paymentTransaction.lastFour\n ? `xxxx xxxx xxxx ${paymentTransaction.lastFour}`\n : undefined,\n amount: formatCurrency(paymentTransaction.amount),\n createdDateTime: paymentTransaction.createdAt,\n }\n }\n }\n }\n\n const {\n transactionId,\n orderNumber,\n paymentType,\n creditCardMask,\n amount,\n createdDateTime,\n } = determineDetails()\n const result = []\n if (transactionId) {\n result.push({\n key: 'transactionId',\n label: 'Transaction Id',\n value: transactionId,\n })\n }\n if (orderNumber) {\n result.push({\n key: 'orderNumber',\n label: 'Order Number',\n value: orderNumber,\n })\n }\n if (paymentType) {\n result.push({\n key: 'paymentType',\n label: 'Payment Type',\n value: paymentType,\n })\n }\n if (creditCardMask) {\n result.push({\n key: 'creditCardMask',\n label: 'Card Number',\n value: creditCardMask,\n })\n }\n if (amount) {\n result.push({\n key: 'amount',\n label: 'Amount',\n value: amount,\n })\n }\n if (createdDateTime) {\n result.push({\n key: 'createdDateTime',\n label: 'Created At',\n value: formatDateTime(createdDateTime),\n })\n }\n\n return result\n }\n case 'WESTPAC_QUICK_STREAM': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction) {\n return []\n }\n\n return [\n {\n key: 'receiptNumber',\n label: 'Receipt Number',\n value: paymentTransaction.receiptNumber,\n },\n {\n key: 'paymentReferenceNumber',\n label: 'Payment Reference',\n value: paymentTransaction.paymentReferenceNumber,\n },\n {\n key: 'customerReferenceNumber',\n label: 'Customer Reference Number',\n value: paymentTransaction.customerReferenceNumber,\n },\n ...(paymentTransaction.totalAmount\n ? [\n {\n key: 'amount',\n label: 'Amount',\n value: formatCurrency(\n parseFloat(paymentTransaction.totalAmount.amount.toString()),\n ),\n },\n ]\n : []),\n ...(paymentTransaction.surchargeAmount.amount\n ? [\n {\n key: 'surchargeAmount',\n label: 'Surcharge Amount',\n value: formatCurrency(\n parseFloat(\n paymentTransaction.surchargeAmount.amount.toString(),\n ),\n ),\n },\n ]\n : []),\n {\n key: 'settlementDate',\n label: 'Settlement Date',\n value: formatDateTime(paymentTransaction.settlementDate),\n },\n ]\n }\n }\n}\n"]}
1
+ {"version":3,"file":"paymentService.js","sourceRoot":"","sources":["../src/paymentService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n FormTypes,\n SubmissionEventTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { conditionalLogicService, formElementsService } from '.'\nimport {\n getRootElementValueById,\n ReplaceInjectablesFormatters,\n} from './submissionService'\n\n/**\n * Examine a submission and its form definition to validate whether a payment\n * workflow event needs to run.\n *\n * #### Example\n *\n * ```js\n * const result = paymentService.checkForPaymentEvent(form, submission)\n * ```\n *\n * @param definition\n * @param submission\n * @returns\n */\nexport function checkForPaymentEvent(\n definition: FormTypes.Form,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n):\n | {\n paymentSubmissionEvent: SubmissionEventTypes.FormPaymentEvent\n amount: number\n }\n | undefined {\n const paymentSubmissionEvents = definition.paymentEvents || []\n const paymentSubmissionEvent = paymentSubmissionEvents.find(\n (paymentSubmissionEvent) => {\n return (\n paymentSubmissionEvent &&\n conditionalLogicService.evaluateConditionalPredicates({\n isConditional: !!paymentSubmissionEvent.conditionallyExecute,\n requiresAllConditionalPredicates:\n !!paymentSubmissionEvent.requiresAllConditionallyExecutePredicates,\n conditionalPredicates:\n paymentSubmissionEvent.conditionallyExecutePredicates || [],\n submission: submission,\n formElements: definition.elements,\n })\n )\n },\n )\n\n if (!paymentSubmissionEvent) {\n return\n }\n console.log(\n 'Checking if submission with payment submission event needs processing',\n )\n\n const amountElement = formElementsService.findFormElement(\n definition.elements,\n (element) => element.id === paymentSubmissionEvent.configuration.elementId,\n )\n if (!amountElement || amountElement.type === 'page') {\n console.log(\n 'Form has a payment submission event but the amount element does not exist, throwing error',\n )\n throw new Error(\n 'We could not find the configuration required to make a payment. Please contact your administrator to ensure your application configuration has been completed successfully.',\n )\n }\n\n console.log('Found form element for payment submission event', amountElement)\n\n const amount = getRootElementValueById(\n amountElement.id,\n definition.elements,\n submission,\n )\n\n if (!amount) {\n console.log(\n 'Form has a payment submission event but the amount has been entered as 0 or not at all, finishing as normal submission',\n )\n return\n }\n\n if (typeof amount !== 'number') {\n console.log(\n 'Form has a payment submission event but the amount is not a number, throwing error',\n )\n throw new Error(\n 'The configuration required to make a payment is incorrect. Please contact your administrator to ensure your application configuration has been completed successfully.',\n )\n }\n\n const result = {\n paymentSubmissionEvent,\n amount,\n }\n\n return result\n}\n\ntype PaymentDisplayDetail = {\n label: string\n value: string\n /** A key to identify the detail */\n key: string\n}\n\n/**\n * Retrieve an array of detail items from a form submission payment.\n *\n * #### Example\n *\n * ```js\n * const detailItems =\n * paymentService.getDisplayDetailsFromFormSubmissionPayment(\n * formSubmissionPayment,\n * {\n * formatCurrency,\n * formatDateTime,\n * formatDate,\n * },\n * )\n * ```\n *\n * @param formSubmissionPayment\n * @param options\n * @returns\n */\nexport const getDisplayDetailsFromFormSubmissionPayment = (\n /** The form submission payment to get the details from */\n formSubmissionPayment: SubmissionTypes.FormSubmissionPayment,\n {\n formatCurrency,\n formatDateTime,\n formatDate,\n }: Pick<\n ReplaceInjectablesFormatters,\n 'formatCurrency' | 'formatDate' | 'formatDateTime'\n >,\n):\n | {\n amount: {\n value: number\n formatted: string\n }\n paymentDisplayDetails: PaymentDisplayDetail[]\n }\n | undefined => {\n switch (formSubmissionPayment.type) {\n case 'NSW_GOV_PAY': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction || !paymentTransaction.agencyCompletionPayment) {\n return\n }\n\n const amount = {\n value: paymentTransaction.agencyCompletionPayment.amount,\n formatted: formatCurrency(\n paymentTransaction.agencyCompletionPayment.amount,\n ),\n }\n return {\n amount,\n paymentDisplayDetails: [\n {\n key: 'completionReference',\n label: 'Completion Reference',\n value:\n paymentTransaction.agencyCompletionPayment\n .paymentCompletionReference,\n },\n {\n key: 'paymentReference',\n label: 'Payment Reference',\n value: paymentTransaction.agencyCompletionPayment.paymentReference,\n },\n {\n key: 'bankReference',\n label: 'Bank Reference',\n value: paymentTransaction.agencyCompletionPayment.bankReference,\n },\n {\n key: 'paymentMethod',\n label: 'Payment Method',\n value: paymentTransaction.agencyCompletionPayment.paymentMethod,\n },\n ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===\n 'BPAY' &&\n paymentTransaction.agencyCompletionPayment.bPay?.billerCode\n ? [\n {\n key: 'billerCode',\n label: 'BPay Biller Code',\n value:\n paymentTransaction.agencyCompletionPayment.bPay.billerCode,\n },\n ]\n : []),\n ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===\n 'CARD'\n ? [\n {\n key: 'creditCardMask',\n label: 'Card Number',\n value: `xxxx xxxx xxxx ${paymentTransaction.agencyCompletionPayment.card?.last4Digits}`,\n },\n ]\n : []),\n {\n key: 'amount',\n label: 'Amount',\n value: amount.formatted,\n },\n {\n key: 'surchargeAmount',\n label: 'Surcharge Amount',\n value: formatCurrency(\n paymentTransaction.agencyCompletionPayment.surcharge,\n ),\n },\n {\n key: 'surchargeGST',\n label: 'Surcharge GST',\n value: formatCurrency(\n paymentTransaction.agencyCompletionPayment.surchargeGst,\n ),\n },\n {\n key: 'createdDateTime',\n label: 'Created Date Time',\n value: formatDateTime(formSubmissionPayment.createdAt),\n },\n ],\n }\n }\n case 'BPOINT': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction) {\n return\n }\n const amountValue = paymentTransaction.Amount / 100\n const amount = {\n value: amountValue,\n formatted: formatCurrency(amountValue),\n }\n return {\n amount,\n paymentDisplayDetails: [\n {\n key: 'receiptNumber',\n label: 'Receipt Number',\n value: paymentTransaction.ReceiptNumber,\n },\n {\n key: 'crn1',\n label: 'CRN 1',\n value: paymentTransaction.Crn1,\n },\n {\n key: 'crn2',\n label: 'CRN 2',\n value: paymentTransaction.Crn2,\n },\n {\n key: 'crn3',\n label: 'CRN 3',\n value: paymentTransaction.Crn3,\n },\n {\n key: 'billerCode',\n label: 'Biller Code',\n value: paymentTransaction.BillerCode,\n },\n {\n key: 'creditCardMask',\n label: 'Card Number',\n value: paymentTransaction.CardDetails.MaskedCardNumber,\n },\n {\n key: 'amount',\n label: 'Amount',\n value: amount.formatted,\n },\n {\n key: 'surchargeAmount',\n label: 'Surcharge Amount',\n value: formatCurrency(paymentTransaction.AmountSurcharge / 100),\n },\n {\n key: 'processedDateTime',\n label: 'Processed Date Time',\n value: formatDateTime(paymentTransaction.ProcessedDateTime),\n },\n ],\n }\n }\n case 'CP_PAY': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction) {\n return\n }\n\n const determineDetails = () => {\n switch (paymentTransaction.cpPayVersion) {\n case 'v2': {\n return {\n transactionId: paymentTransaction.result.id,\n orderNumber:\n paymentTransaction.result.externalReferenceId ?? undefined,\n paymentType: paymentTransaction.result.paymentType,\n creditCardMask: paymentTransaction.result.lastFour\n ? `xxxx xxxx xxxx ${paymentTransaction.result.lastFour}`\n : undefined,\n amount:\n paymentTransaction.result.amount !== undefined\n ? {\n value: paymentTransaction.result.amount,\n formatted: formatCurrency(\n paymentTransaction.result.amount,\n ),\n }\n : {\n value: NaN,\n formatted: 'Unknown',\n },\n createdDateTime: paymentTransaction.result.createdOnUtc,\n }\n }\n default: {\n return {\n transactionId: paymentTransaction.transactionId,\n orderNumber: paymentTransaction.orderNumber ?? undefined,\n paymentType:\n paymentTransaction.paymentTypeId === 1\n ? 'Credit/Debit Card'\n : paymentTransaction.paymentTypeId === 2\n ? 'ACH'\n : undefined,\n creditCardMask: paymentTransaction.lastFour\n ? `xxxx xxxx xxxx ${paymentTransaction.lastFour}`\n : undefined,\n amount: {\n value: paymentTransaction.amount,\n formatted: formatCurrency(paymentTransaction.amount),\n },\n createdDateTime: paymentTransaction.createdAt,\n }\n }\n }\n }\n\n const {\n transactionId,\n orderNumber,\n paymentType,\n creditCardMask,\n amount,\n createdDateTime,\n } = determineDetails()\n const paymentDisplayDetails = []\n if (transactionId) {\n paymentDisplayDetails.push({\n key: 'transactionId',\n label: 'Transaction Id',\n value: transactionId,\n })\n }\n if (orderNumber) {\n paymentDisplayDetails.push({\n key: 'orderNumber',\n label: 'Order Number',\n value: orderNumber,\n })\n }\n if (paymentType) {\n paymentDisplayDetails.push({\n key: 'paymentType',\n label: 'Payment Type',\n value: paymentType,\n })\n }\n if (creditCardMask) {\n paymentDisplayDetails.push({\n key: 'creditCardMask',\n label: 'Card Number',\n value: creditCardMask,\n })\n }\n paymentDisplayDetails.push({\n key: 'amount',\n label: 'Amount',\n value: amount.formatted,\n })\n if (createdDateTime) {\n paymentDisplayDetails.push({\n key: 'createdDateTime',\n label: 'Created At',\n value: formatDateTime(createdDateTime),\n })\n }\n\n return {\n amount,\n paymentDisplayDetails,\n }\n }\n case 'WESTPAC_QUICK_STREAM': {\n const { paymentTransaction } = formSubmissionPayment\n if (!paymentTransaction) {\n return\n }\n\n const amount = {\n value: paymentTransaction.totalAmount.amount,\n formatted: formatCurrency(\n parseFloat(paymentTransaction.totalAmount.amount.toString()),\n ),\n }\n\n return {\n amount,\n paymentDisplayDetails: [\n {\n key: 'receiptNumber',\n label: 'Receipt Number',\n value: paymentTransaction.receiptNumber,\n },\n {\n key: 'paymentReferenceNumber',\n label: 'Payment Reference',\n value: paymentTransaction.paymentReferenceNumber,\n },\n {\n key: 'customerReferenceNumber',\n label: 'Customer Reference Number',\n value: paymentTransaction.customerReferenceNumber,\n },\n {\n key: 'amount',\n label: 'Amount',\n value: amount.formatted,\n },\n ...(paymentTransaction.surchargeAmount.amount\n ? [\n {\n key: 'surchargeAmount',\n label: 'Surcharge Amount',\n value: formatCurrency(\n parseFloat(\n paymentTransaction.surchargeAmount.amount.toString(),\n ),\n ),\n },\n ]\n : []),\n {\n key: 'settlementDate',\n label: 'Settlement Date',\n value: formatDate(paymentTransaction.settlementDate),\n },\n ],\n }\n }\n }\n}\n"]}
@@ -1,9 +1,14 @@
1
1
  import { FormTypes, MiscTypes, ScheduledTasksTypes, SubmissionTypes } from '@oneblink/types';
2
2
  export type ReplaceInjectablesFormatters = {
3
+ /** A function to format any date/times. */
3
4
  formatDateTime: (value: string) => string;
5
+ /** A function to format any dates. */
4
6
  formatDate: (value: string) => string;
7
+ /** A function to format any times. */
5
8
  formatTime: (value: string) => string;
9
+ /** A function to format any numbers. */
6
10
  formatNumber: (value: number) => string;
11
+ /** A function to format any numbers as currency. */
7
12
  formatCurrency: (value: number) => string;
8
13
  };
9
14
  export type ReplaceInjectablesBaseOptions = ReplaceInjectablesFormatters & {
@@ -1 +1 @@
1
- {"version":3,"file":"replaceCustomValues.js","sourceRoot":"","sources":["../src/replaceCustomValues.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n APINSWTypes,\n CivicaTypes,\n FormTypes,\n GeoscapeTypes,\n GoogleTypes,\n MiscTypes,\n PointTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { getABNNumberFromABNRecord } from './abnService'\nimport {\n RootElementRegex,\n NestedElementRegex,\n matchElementsTagRegex,\n} from './form-elements-regex'\nimport { findFormElement, flattenFormElements } from './formElementsService'\n\nexport type ReplaceInjectablesFormatters = {\n formatDateTime: (value: string) => string\n formatDate: (value: string) => string\n formatTime: (value: string) => string\n formatNumber: (value: number) => string\n formatCurrency: (value: number) => string\n}\n\nexport type ReplaceInjectablesBaseOptions = ReplaceInjectablesFormatters & {\n submission: SubmissionTypes.S3SubmissionData['submission']\n userProfile: MiscTypes.UserProfile | undefined\n task: ScheduledTasksTypes.Task | undefined\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /**\n * Determine if only root level elements should be replaced.\n *\n * `false` will replace `\"{ELEMENT:Parent_Name}\"` and\n * `\"{ELEMENT:Children|Name}\"`.\n *\n * `true` will replace `\"{ELEMENT:Parent_Name}\"` but will NOT replace\n * `{ELEMENT:Children|Name}`.\n */\n excludeNestedElements?: boolean\n}\n\nexport type ReplaceInjectablesOptions = ReplaceInjectablesBaseOptions & {\n form: FormTypes.Form\n submissionId: string\n submissionTimestamp: string\n externalId: string | undefined\n previousApprovalId: string | undefined\n}\n\nconst SUBMISSION_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesOptions) => string | undefined\n}> = [\n {\n string: '{INFO_PAGE_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{INFO_PAGE_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{FORM_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{FORM_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{DATE}',\n value: ({\n submissionTimestamp,\n formatDateTime,\n }: ReplaceInjectablesOptions) => {\n if (!submissionTimestamp) {\n return undefined\n }\n return formatDateTime(submissionTimestamp)\n },\n },\n {\n string: '{TIMESTAMP}',\n value: ({ submissionTimestamp }: ReplaceInjectablesOptions) =>\n submissionTimestamp,\n },\n {\n string: '{SUBMISSION_ID}',\n value: ({ submissionId }: ReplaceInjectablesOptions) => submissionId,\n },\n {\n string: '{EXTERNAL_ID}',\n value: ({ externalId }: ReplaceInjectablesOptions) => externalId,\n },\n {\n string: '{PREVIOUS_APPROVAL_ID}',\n value: ({ previousApprovalId }: ReplaceInjectablesOptions) =>\n previousApprovalId,\n },\n]\n\nconst ELEMENT_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesBaseOptions) => string | undefined\n}> = [\n {\n string: '{USER:email}',\n value: ({ userProfile }) => userProfile?.email,\n },\n {\n string: '{USER:username}',\n value: ({ userProfile }) => userProfile?.username,\n },\n {\n string: '{TASK_NAME}',\n value: ({ task }) => task?.name,\n },\n {\n string: '{TASK_GROUP_NAME}',\n value: ({ taskGroup }) => taskGroup?.name,\n },\n {\n string: '{TASK_GROUP_INSTANCE_LABEL}',\n value: ({ taskGroupInstance }) => taskGroupInstance?.label,\n },\n]\n\n/**\n * Function to get the display value of a property in submission, if elementId\n * is provided propertyName will be ignored\n *\n * #### Example\n *\n * ```typescript\n * const result = submissionService.getElementSubmissionValue({\n * propertyName: 'search',\n * submission: {\n * search: 'Entered By User',\n * },\n * formElements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport function getElementSubmissionValue({\n propertyName,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n propertyName,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId?: string\n propertyName?: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters) {\n if (elementId === undefined && propertyName === undefined) {\n return undefined\n }\n\n let result: ReturnType<typeof getElementSubmissionValueByName> | undefined =\n undefined\n\n if (elementId) {\n result = getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n })\n } else if (propertyName) {\n result = getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n })\n }\n\n if (!result) {\n return\n }\n return formatValue({\n element: result.formElement,\n unknownValue: result.unknownValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n })\n}\n\nfunction getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}):\n | { formElement: FormTypes.FormElement | undefined; unknownValue: unknown }\n | undefined {\n const unknownValue = submission[propertyName]\n if (unknownValue === undefined || unknownValue === null) {\n return undefined\n }\n\n const formElement = findFormElement(\n formElements,\n (element) =>\n element.type !== 'page' &&\n element.type !== 'section' &&\n element.name === propertyName,\n )\n\n return { formElement, unknownValue }\n}\n\nfunction getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}): { formElement: FormTypes.FormElement; unknownValue: unknown } | undefined {\n // make sure submission is an object\n if (Object(submission) !== submission) {\n return undefined\n }\n\n const flattenedElements = flattenFormElements(formElements)\n\n let unknown: unknown = undefined\n let formElement: FormTypes.FormElement | undefined = undefined\n\n for (const element of flattenedElements) {\n if (elementId === element.id) {\n if ('name' in element) {\n unknown = submission[element.name]\n formElement = element\n }\n break\n }\n if (element.type === 'form') {\n const newSubmissionData = submission[element.name]\n\n const result = getElementSubmissionValueById({\n elementId,\n formElements: element.elements ?? [],\n submission:\n newSubmissionData as SubmissionTypes.S3SubmissionData['submission'],\n })\n if (result) {\n unknown = result.unknownValue\n formElement = result.formElement\n break\n }\n }\n }\n\n if (unknown === undefined || unknown === null || formElement === undefined) {\n return undefined\n }\n\n return { unknownValue: unknown, formElement }\n}\n\nfunction formatValue({\n element,\n unknownValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n}: {\n element: FormTypes.FormElement | undefined\n unknownValue: unknown\n} & ReplaceInjectablesFormatters) {\n switch (element?.type) {\n case 'datetime': {\n const value = unknownValue as string\n return { element: element, value: formatDateTime(value) }\n }\n case 'date': {\n const value = unknownValue as string\n return { element: element, value: formatDate(value) }\n }\n case 'time': {\n const value = unknownValue as string\n return { element: element, value: formatTime(value) }\n }\n case 'radio':\n case 'autocomplete': {\n const value = unknownValue as string\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label || value }\n }\n\n case 'checkboxes': {\n const value = unknownValue as string[]\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n }\n case 'compliance': {\n const value = unknownValue as {\n value?: string\n }\n const option = (element.options || []).find(\n (option: FormTypes.ChoiceElementOption) => option.value === value.value,\n )\n return {\n element: element,\n value: {\n ...value,\n value: option?.label || value.value,\n },\n }\n }\n case 'select': {\n if (element.multi) {\n const value = unknownValue as string[]\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n } else {\n const value = unknownValue as string\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label }\n }\n }\n case 'boolean': {\n const value = unknownValue as boolean\n return { element: element, value: value ? 'Yes' : 'No' }\n }\n case 'calculation': {\n const value = unknownValue as number\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n let text\n if (element.displayAsCurrency) {\n text = formatCurrency(value)\n } else {\n text = formatNumber(value)\n }\n return { element: element, value: text }\n }\n return undefined\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n const value = unknownValue as\n | PointTypes.PointAddress\n | GeoscapeTypes.GeoscapeAddress\n return {\n element: element,\n value: value?.addressDetails?.formattedAddress || value?.addressId,\n }\n }\n case 'googleAddress': {\n const value = unknownValue as GoogleTypes.GoogleMapsAddress\n return {\n element: element,\n value: value.formatted_address || value.place_id,\n }\n }\n case 'civicaStreetName': {\n const value = unknownValue as CivicaTypes.CivicaStreetName\n return { element: element, value: value?.formattedStreet }\n }\n case 'civicaNameRecord': {\n const value = unknownValue as CivicaTypes.CivicaNameRecord\n return {\n element: element,\n value:\n [value?.title, value?.givenName1, value?.familyName]\n .filter((t) => t)\n .join(' ') || value?.emailAddress,\n }\n }\n case 'abn': {\n const value = unknownValue as MiscTypes.ABNRecord\n return {\n element: element,\n value: value ? getABNNumberFromABNRecord(value) : undefined,\n }\n }\n case 'apiNSWLiquorLicence': {\n const value = unknownValue as APINSWTypes.LiquorLicenceDetails | undefined\n return {\n element: element,\n value:\n `${value?.licenceDetail?.licenceNumber} | ${value?.licenceDetail?.licenceName}`.trim(),\n }\n }\n default: {\n return { element: element, value: unknownValue }\n }\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text while a form is being\n * filled out. The replacements are suppose to be user friendly and for display\n * purposes, e.g. dates should be displayed in the user's desired format and\n * timezone.\n *\n * #### Example\n *\n * ```js\n * const { text: url } =\n * submissionService.replaceInjectablesWithElementValues(\n * 'https://example.com/path?search{ELEMENT:search}',\n * {\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * submission: {\n * search: 'Entered By User',\n * },\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * userProfile: {\n * userId: 'abc123',\n * username: 'john-user',\n * email: 'john.user@domain.com',\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithElementValues(\n text: string,\n options: {\n formElements: FormTypes.FormElement[]\n } & ReplaceInjectablesBaseOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n let hadAllInjectablesReplaced = true\n text = ELEMENT_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, text)\n\n const matchesElement = text.match(\n options.excludeNestedElements ? RootElementRegex : NestedElementRegex,\n )\n if (matchesElement) {\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: !!options.excludeNestedElements,\n },\n ({ elementName, elementMatch }) => {\n const result = getElementSubmissionValue({\n propertyName: elementName,\n ...options,\n })\n\n const hasNoValue = result === undefined || result.value === undefined\n if (hasNoValue) {\n hadAllInjectablesReplaced = false\n }\n\n text = text.replace(\n elementMatch,\n hasNoValue ? '' : (result.value as string),\n )\n },\n )\n }\n\n return {\n text,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text after a successful form\n * submission as well as other replaceable parameters e.g. `submissionId`. The\n * replacements are suppose to be user friendly and for display purposes, e.g.\n * dates should be displayed in the user's desired format and timezone.\n *\n * #### Example\n *\n * ```js\n * const result = submissionService.replaceInjectablesWithSubmissionValues(\n * 'https://example.com/path?submissionId={SUBMISSION_ID}&externalId={EXTERNAL_ID}&search{ELEMENT:search}',\n * {\n * submissionId: 'abc-123',\n * submissionTimestamp: '2021-07-02T02:19:13.670Z',\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * submission: {\n * search: 'Entered By User',\n * },\n * form: {\n * id: 1,\n * name: 'Form',\n * organisationId: '',\n * formsAppEnvironmentId: 1,\n * formsAppIds: [],\n * isAuthenticated: false,\n * isMultiPage: false,\n * isInfoPage: false,\n * postSubmissionAction: 'FORMS_LIBRARY',\n * cancelAction: 'FORMS_LIBRARY',\n * submissionEvents: [],\n * tags: [],\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithSubmissionValues(\n text: string,\n options: ReplaceInjectablesOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n const result = replaceInjectablesWithElementValues(text, {\n formElements: options.form.elements,\n ...options,\n })\n let hadAllInjectablesReplaced = result.hadAllInjectablesReplaced\n const replacedText = SUBMISSION_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, result.text)\n\n return {\n text: replacedText,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Process a resource with injectable element values to turn a single resource\n * (could be a single) into multiple resources. e.g.\n * `\"{ELEMENT:Children|Child_Name} {ELEMENT:Family_Name}\"` with the following\n * submission data:\n *\n * ```json\n * {\n * \"Family_Name\": \"Smith\",\n * \"Children\": [\n * {\n * \"Child_Name\": \"John\"\n * },\n * {\n * \"Child_Name\": \"Jane\"\n * }\n * ]\n * }\n * ```\n *\n * Would result in the following resources:\n *\n * - `\"John Smith\"`\n * - `\"Jane Smith\"`\n *\n * #### Example\n *\n * ```js\n * const emailAddresses = processInjectablesInCustomResource({\n * resource: '{ELEMENT:People|Email_Address}',\n * submission: {\n * People: [\n * {\n * Email_Address: 'user@oneblink.io',\n * },\n * {\n * Email_Address: 'admin@oneblink.io',\n * },\n * ],\n * },\n * formElements: [\n * {\n * id: '18dcd3e0-6e2f-462e-803b-e24562d9fa6d',\n * type: 'repeatableSet',\n * name: 'People',\n * label: 'People',\n * elements: [\n * {\n * id: 'd0902113-3f77-4070-adbd-ca3ae95ce091',\n * type: 'email',\n * name: 'Email_Address',\n * label: 'Email_Address',\n * },\n * ],\n * },\n * ],\n * replaceRootInjectables: (resource, submission, formElements) => {\n * const { text } = replaceInjectablesWithElementValues(resource, {\n * submission,\n * formElements,\n * excludeNestedElements: true,\n * // other options\n * })\n * return text\n * },\n * })\n * // emailAddresses === [\"user@oneblink.io\", \"admin@oneblink.io\"]\n * ```\n *\n * @param options\n * @returns\n */\nexport function processInjectablesInCustomResource<T>({\n resource,\n submission,\n formElements,\n replaceRootInjectables,\n prepareNestedInjectables = (resource, prepare) =>\n prepare(String(resource)) as T,\n}: {\n /** The resource that contains properties that support injection or a string */\n resource: T\n /** The form submission data to process */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form elements to process */\n formElements: FormTypes.FormElement[]\n /**\n * A function to inject values, this allows custom formatters to be used.\n * Return `undefined` to prevent the injection from recursively continuing.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param submission The current form submission data to process (may be an\n * entry in a repeatable set)\n * @param formElements The current form elements to process (may be the\n * elements from a repeatable set)\n * @returns\n */\n replaceRootInjectables: (\n resource: T,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n formElements: FormTypes.FormElement[],\n ) =>\n | [injectedText: string, resourceKey: string, newResource: T]\n | string\n | undefined\n /**\n * An optional function to replace nested injectables when creating multiple\n * resources from repeatable sets. Only required if the `resource` param is\n * not a `string`.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param prepare A function to prepare the resource string(s) for another\n * iteration\n * @returns\n */\n prepareNestedInjectables?: (\n resource: T,\n preparer: (resourceText: string) => string,\n ) => T\n}): Map<string, T> {\n const newResources: Map<string, T> = new Map<string, T>()\n\n const injectorResult = replaceRootInjectables(\n resource,\n submission,\n formElements,\n )\n if (!injectorResult) {\n return newResources\n }\n\n const [text, resourceKey, newResource] =\n typeof injectorResult === 'string'\n ? [injectorResult, injectorResult, injectorResult as T]\n : injectorResult\n\n // Find nested form elements\n const matches: Map<string, boolean> = new Map()\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: false,\n },\n ({ elementName }) => {\n const [repeatableSetElementName, ...elementNames] = elementName.split('|')\n matches.set(repeatableSetElementName, !!elementNames.length)\n },\n )\n\n if (matches.size) {\n matches.forEach((hasNestedFormElements, repeatableSetElementName) => {\n if (hasNestedFormElements) {\n // Attempt to create a new resource for each entry in the repeatable set.\n const entries = submission?.[repeatableSetElementName]\n if (Array.isArray(entries)) {\n const repeatableSetElement = findFormElement(\n formElements,\n (formElement) => {\n return (\n 'name' in formElement &&\n formElement.name === repeatableSetElementName\n )\n },\n )\n if (\n repeatableSetElement &&\n 'elements' in repeatableSetElement &&\n Array.isArray(repeatableSetElement.elements)\n ) {\n for (const entry of entries) {\n const replacedResource = prepareNestedInjectables(\n newResource,\n (resourceText) => {\n return resourceText.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n )\n },\n )\n const nestedResources = processInjectablesInCustomResource<T>({\n resource: replacedResource,\n submission: entry,\n formElements: repeatableSetElement.elements,\n replaceRootInjectables,\n prepareNestedInjectables,\n })\n if (nestedResources.size) {\n nestedResources.forEach((nestedResource, nestedResourceKey) => {\n if (!newResources.has(nestedResourceKey)) {\n newResources.set(nestedResourceKey, nestedResource)\n }\n })\n }\n }\n }\n }\n }\n })\n } else {\n newResources.set(resourceKey, newResource)\n }\n\n return newResources\n}\n"]}
1
+ {"version":3,"file":"replaceCustomValues.js","sourceRoot":"","sources":["../src/replaceCustomValues.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n APINSWTypes,\n CivicaTypes,\n FormTypes,\n GeoscapeTypes,\n GoogleTypes,\n MiscTypes,\n PointTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { getABNNumberFromABNRecord } from './abnService'\nimport {\n RootElementRegex,\n NestedElementRegex,\n matchElementsTagRegex,\n} from './form-elements-regex'\nimport { findFormElement, flattenFormElements } from './formElementsService'\n\nexport type ReplaceInjectablesFormatters = {\n /** A function to format any date/times. */\n formatDateTime: (value: string) => string\n /** A function to format any dates. */\n formatDate: (value: string) => string\n /** A function to format any times. */\n formatTime: (value: string) => string\n /** A function to format any numbers. */\n formatNumber: (value: number) => string\n /** A function to format any numbers as currency. */\n formatCurrency: (value: number) => string\n}\n\nexport type ReplaceInjectablesBaseOptions = ReplaceInjectablesFormatters & {\n submission: SubmissionTypes.S3SubmissionData['submission']\n userProfile: MiscTypes.UserProfile | undefined\n task: ScheduledTasksTypes.Task | undefined\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /**\n * Determine if only root level elements should be replaced.\n *\n * `false` will replace `\"{ELEMENT:Parent_Name}\"` and\n * `\"{ELEMENT:Children|Name}\"`.\n *\n * `true` will replace `\"{ELEMENT:Parent_Name}\"` but will NOT replace\n * `{ELEMENT:Children|Name}`.\n */\n excludeNestedElements?: boolean\n}\n\nexport type ReplaceInjectablesOptions = ReplaceInjectablesBaseOptions & {\n form: FormTypes.Form\n submissionId: string\n submissionTimestamp: string\n externalId: string | undefined\n previousApprovalId: string | undefined\n}\n\nconst SUBMISSION_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesOptions) => string | undefined\n}> = [\n {\n string: '{INFO_PAGE_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{INFO_PAGE_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{FORM_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{FORM_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{DATE}',\n value: ({\n submissionTimestamp,\n formatDateTime,\n }: ReplaceInjectablesOptions) => {\n if (!submissionTimestamp) {\n return undefined\n }\n return formatDateTime(submissionTimestamp)\n },\n },\n {\n string: '{TIMESTAMP}',\n value: ({ submissionTimestamp }: ReplaceInjectablesOptions) =>\n submissionTimestamp,\n },\n {\n string: '{SUBMISSION_ID}',\n value: ({ submissionId }: ReplaceInjectablesOptions) => submissionId,\n },\n {\n string: '{EXTERNAL_ID}',\n value: ({ externalId }: ReplaceInjectablesOptions) => externalId,\n },\n {\n string: '{PREVIOUS_APPROVAL_ID}',\n value: ({ previousApprovalId }: ReplaceInjectablesOptions) =>\n previousApprovalId,\n },\n]\n\nconst ELEMENT_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesBaseOptions) => string | undefined\n}> = [\n {\n string: '{USER:email}',\n value: ({ userProfile }) => userProfile?.email,\n },\n {\n string: '{USER:username}',\n value: ({ userProfile }) => userProfile?.username,\n },\n {\n string: '{TASK_NAME}',\n value: ({ task }) => task?.name,\n },\n {\n string: '{TASK_GROUP_NAME}',\n value: ({ taskGroup }) => taskGroup?.name,\n },\n {\n string: '{TASK_GROUP_INSTANCE_LABEL}',\n value: ({ taskGroupInstance }) => taskGroupInstance?.label,\n },\n]\n\n/**\n * Function to get the display value of a property in submission, if elementId\n * is provided propertyName will be ignored\n *\n * #### Example\n *\n * ```typescript\n * const result = submissionService.getElementSubmissionValue({\n * propertyName: 'search',\n * submission: {\n * search: 'Entered By User',\n * },\n * formElements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport function getElementSubmissionValue({\n propertyName,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n propertyName,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId?: string\n propertyName?: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters) {\n if (elementId === undefined && propertyName === undefined) {\n return undefined\n }\n\n let result: ReturnType<typeof getElementSubmissionValueByName> | undefined =\n undefined\n\n if (elementId) {\n result = getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n })\n } else if (propertyName) {\n result = getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n })\n }\n\n if (!result) {\n return\n }\n return formatValue({\n element: result.formElement,\n unknownValue: result.unknownValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n })\n}\n\nfunction getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}):\n | { formElement: FormTypes.FormElement | undefined; unknownValue: unknown }\n | undefined {\n const unknownValue = submission[propertyName]\n if (unknownValue === undefined || unknownValue === null) {\n return undefined\n }\n\n const formElement = findFormElement(\n formElements,\n (element) =>\n element.type !== 'page' &&\n element.type !== 'section' &&\n element.name === propertyName,\n )\n\n return { formElement, unknownValue }\n}\n\nfunction getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}): { formElement: FormTypes.FormElement; unknownValue: unknown } | undefined {\n // make sure submission is an object\n if (Object(submission) !== submission) {\n return undefined\n }\n\n const flattenedElements = flattenFormElements(formElements)\n\n let unknown: unknown = undefined\n let formElement: FormTypes.FormElement | undefined = undefined\n\n for (const element of flattenedElements) {\n if (elementId === element.id) {\n if ('name' in element) {\n unknown = submission[element.name]\n formElement = element\n }\n break\n }\n if (element.type === 'form') {\n const newSubmissionData = submission[element.name]\n\n const result = getElementSubmissionValueById({\n elementId,\n formElements: element.elements ?? [],\n submission:\n newSubmissionData as SubmissionTypes.S3SubmissionData['submission'],\n })\n if (result) {\n unknown = result.unknownValue\n formElement = result.formElement\n break\n }\n }\n }\n\n if (unknown === undefined || unknown === null || formElement === undefined) {\n return undefined\n }\n\n return { unknownValue: unknown, formElement }\n}\n\nfunction formatValue({\n element,\n unknownValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n}: {\n element: FormTypes.FormElement | undefined\n unknownValue: unknown\n} & ReplaceInjectablesFormatters) {\n switch (element?.type) {\n case 'datetime': {\n const value = unknownValue as string\n return { element: element, value: formatDateTime(value) }\n }\n case 'date': {\n const value = unknownValue as string\n return { element: element, value: formatDate(value) }\n }\n case 'time': {\n const value = unknownValue as string\n return { element: element, value: formatTime(value) }\n }\n case 'radio':\n case 'autocomplete': {\n const value = unknownValue as string\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label || value }\n }\n\n case 'checkboxes': {\n const value = unknownValue as string[]\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n }\n case 'compliance': {\n const value = unknownValue as {\n value?: string\n }\n const option = (element.options || []).find(\n (option: FormTypes.ChoiceElementOption) => option.value === value.value,\n )\n return {\n element: element,\n value: {\n ...value,\n value: option?.label || value.value,\n },\n }\n }\n case 'select': {\n if (element.multi) {\n const value = unknownValue as string[]\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n } else {\n const value = unknownValue as string\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label }\n }\n }\n case 'boolean': {\n const value = unknownValue as boolean\n return { element: element, value: value ? 'Yes' : 'No' }\n }\n case 'calculation': {\n const value = unknownValue as number\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n let text\n if (element.displayAsCurrency) {\n text = formatCurrency(value)\n } else {\n text = formatNumber(value)\n }\n return { element: element, value: text }\n }\n return undefined\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n const value = unknownValue as\n | PointTypes.PointAddress\n | GeoscapeTypes.GeoscapeAddress\n return {\n element: element,\n value: value?.addressDetails?.formattedAddress || value?.addressId,\n }\n }\n case 'googleAddress': {\n const value = unknownValue as GoogleTypes.GoogleMapsAddress\n return {\n element: element,\n value: value.formatted_address || value.place_id,\n }\n }\n case 'civicaStreetName': {\n const value = unknownValue as CivicaTypes.CivicaStreetName\n return { element: element, value: value?.formattedStreet }\n }\n case 'civicaNameRecord': {\n const value = unknownValue as CivicaTypes.CivicaNameRecord\n return {\n element: element,\n value:\n [value?.title, value?.givenName1, value?.familyName]\n .filter((t) => t)\n .join(' ') || value?.emailAddress,\n }\n }\n case 'abn': {\n const value = unknownValue as MiscTypes.ABNRecord\n return {\n element: element,\n value: value ? getABNNumberFromABNRecord(value) : undefined,\n }\n }\n case 'apiNSWLiquorLicence': {\n const value = unknownValue as APINSWTypes.LiquorLicenceDetails | undefined\n return {\n element: element,\n value:\n `${value?.licenceDetail?.licenceNumber} | ${value?.licenceDetail?.licenceName}`.trim(),\n }\n }\n default: {\n return { element: element, value: unknownValue }\n }\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text while a form is being\n * filled out. The replacements are suppose to be user friendly and for display\n * purposes, e.g. dates should be displayed in the user's desired format and\n * timezone.\n *\n * #### Example\n *\n * ```js\n * const { text: url } =\n * submissionService.replaceInjectablesWithElementValues(\n * 'https://example.com/path?search{ELEMENT:search}',\n * {\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * submission: {\n * search: 'Entered By User',\n * },\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * userProfile: {\n * userId: 'abc123',\n * username: 'john-user',\n * email: 'john.user@domain.com',\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithElementValues(\n text: string,\n options: {\n formElements: FormTypes.FormElement[]\n } & ReplaceInjectablesBaseOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n let hadAllInjectablesReplaced = true\n text = ELEMENT_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, text)\n\n const matchesElement = text.match(\n options.excludeNestedElements ? RootElementRegex : NestedElementRegex,\n )\n if (matchesElement) {\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: !!options.excludeNestedElements,\n },\n ({ elementName, elementMatch }) => {\n const result = getElementSubmissionValue({\n propertyName: elementName,\n ...options,\n })\n\n const hasNoValue = result === undefined || result.value === undefined\n if (hasNoValue) {\n hadAllInjectablesReplaced = false\n }\n\n text = text.replace(\n elementMatch,\n hasNoValue ? '' : (result.value as string),\n )\n },\n )\n }\n\n return {\n text,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text after a successful form\n * submission as well as other replaceable parameters e.g. `submissionId`. The\n * replacements are suppose to be user friendly and for display purposes, e.g.\n * dates should be displayed in the user's desired format and timezone.\n *\n * #### Example\n *\n * ```js\n * const result = submissionService.replaceInjectablesWithSubmissionValues(\n * 'https://example.com/path?submissionId={SUBMISSION_ID}&externalId={EXTERNAL_ID}&search{ELEMENT:search}',\n * {\n * submissionId: 'abc-123',\n * submissionTimestamp: '2021-07-02T02:19:13.670Z',\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * submission: {\n * search: 'Entered By User',\n * },\n * form: {\n * id: 1,\n * name: 'Form',\n * organisationId: '',\n * formsAppEnvironmentId: 1,\n * formsAppIds: [],\n * isAuthenticated: false,\n * isMultiPage: false,\n * isInfoPage: false,\n * postSubmissionAction: 'FORMS_LIBRARY',\n * cancelAction: 'FORMS_LIBRARY',\n * submissionEvents: [],\n * tags: [],\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithSubmissionValues(\n text: string,\n options: ReplaceInjectablesOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n const result = replaceInjectablesWithElementValues(text, {\n formElements: options.form.elements,\n ...options,\n })\n let hadAllInjectablesReplaced = result.hadAllInjectablesReplaced\n const replacedText = SUBMISSION_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, result.text)\n\n return {\n text: replacedText,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Process a resource with injectable element values to turn a single resource\n * (could be a single) into multiple resources. e.g.\n * `\"{ELEMENT:Children|Child_Name} {ELEMENT:Family_Name}\"` with the following\n * submission data:\n *\n * ```json\n * {\n * \"Family_Name\": \"Smith\",\n * \"Children\": [\n * {\n * \"Child_Name\": \"John\"\n * },\n * {\n * \"Child_Name\": \"Jane\"\n * }\n * ]\n * }\n * ```\n *\n * Would result in the following resources:\n *\n * - `\"John Smith\"`\n * - `\"Jane Smith\"`\n *\n * #### Example\n *\n * ```js\n * const emailAddresses = processInjectablesInCustomResource({\n * resource: '{ELEMENT:People|Email_Address}',\n * submission: {\n * People: [\n * {\n * Email_Address: 'user@oneblink.io',\n * },\n * {\n * Email_Address: 'admin@oneblink.io',\n * },\n * ],\n * },\n * formElements: [\n * {\n * id: '18dcd3e0-6e2f-462e-803b-e24562d9fa6d',\n * type: 'repeatableSet',\n * name: 'People',\n * label: 'People',\n * elements: [\n * {\n * id: 'd0902113-3f77-4070-adbd-ca3ae95ce091',\n * type: 'email',\n * name: 'Email_Address',\n * label: 'Email_Address',\n * },\n * ],\n * },\n * ],\n * replaceRootInjectables: (resource, submission, formElements) => {\n * const { text } = replaceInjectablesWithElementValues(resource, {\n * submission,\n * formElements,\n * excludeNestedElements: true,\n * // other options\n * })\n * return text\n * },\n * })\n * // emailAddresses === [\"user@oneblink.io\", \"admin@oneblink.io\"]\n * ```\n *\n * @param options\n * @returns\n */\nexport function processInjectablesInCustomResource<T>({\n resource,\n submission,\n formElements,\n replaceRootInjectables,\n prepareNestedInjectables = (resource, prepare) =>\n prepare(String(resource)) as T,\n}: {\n /** The resource that contains properties that support injection or a string */\n resource: T\n /** The form submission data to process */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form elements to process */\n formElements: FormTypes.FormElement[]\n /**\n * A function to inject values, this allows custom formatters to be used.\n * Return `undefined` to prevent the injection from recursively continuing.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param submission The current form submission data to process (may be an\n * entry in a repeatable set)\n * @param formElements The current form elements to process (may be the\n * elements from a repeatable set)\n * @returns\n */\n replaceRootInjectables: (\n resource: T,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n formElements: FormTypes.FormElement[],\n ) =>\n | [injectedText: string, resourceKey: string, newResource: T]\n | string\n | undefined\n /**\n * An optional function to replace nested injectables when creating multiple\n * resources from repeatable sets. Only required if the `resource` param is\n * not a `string`.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param prepare A function to prepare the resource string(s) for another\n * iteration\n * @returns\n */\n prepareNestedInjectables?: (\n resource: T,\n preparer: (resourceText: string) => string,\n ) => T\n}): Map<string, T> {\n const newResources: Map<string, T> = new Map<string, T>()\n\n const injectorResult = replaceRootInjectables(\n resource,\n submission,\n formElements,\n )\n if (!injectorResult) {\n return newResources\n }\n\n const [text, resourceKey, newResource] =\n typeof injectorResult === 'string'\n ? [injectorResult, injectorResult, injectorResult as T]\n : injectorResult\n\n // Find nested form elements\n const matches: Map<string, boolean> = new Map()\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: false,\n },\n ({ elementName }) => {\n const [repeatableSetElementName, ...elementNames] = elementName.split('|')\n matches.set(repeatableSetElementName, !!elementNames.length)\n },\n )\n\n if (matches.size) {\n matches.forEach((hasNestedFormElements, repeatableSetElementName) => {\n if (hasNestedFormElements) {\n // Attempt to create a new resource for each entry in the repeatable set.\n const entries = submission?.[repeatableSetElementName]\n if (Array.isArray(entries)) {\n const repeatableSetElement = findFormElement(\n formElements,\n (formElement) => {\n return (\n 'name' in formElement &&\n formElement.name === repeatableSetElementName\n )\n },\n )\n if (\n repeatableSetElement &&\n 'elements' in repeatableSetElement &&\n Array.isArray(repeatableSetElement.elements)\n ) {\n for (const entry of entries) {\n const replacedResource = prepareNestedInjectables(\n newResource,\n (resourceText) => {\n return resourceText.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n )\n },\n )\n const nestedResources = processInjectablesInCustomResource<T>({\n resource: replacedResource,\n submission: entry,\n formElements: repeatableSetElement.elements,\n replaceRootInjectables,\n prepareNestedInjectables,\n })\n if (nestedResources.size) {\n nestedResources.forEach((nestedResource, nestedResourceKey) => {\n if (!newResources.has(nestedResourceKey)) {\n newResources.set(nestedResourceKey, nestedResource)\n }\n })\n }\n }\n }\n }\n }\n })\n } else {\n newResources.set(resourceKey, newResource)\n }\n\n return newResources\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/sdk-core",
3
3
  "description": "OneBlink SDK for JavaScript (works in Browsers and NodeJS)",
4
- "version": "7.3.0-beta.1",
4
+ "version": "7.3.0-beta.2",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/sdk-core-js/issues"