@oneblink/sdk-core 10.0.0 → 10.1.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.
Files changed (33) hide show
  1. package/dist/calculationService.d.ts +144 -0
  2. package/dist/calculationService.js +297 -0
  3. package/dist/calculationService.js.map +1 -0
  4. package/dist/conditionalLogicService/evaluateConditionalSubmissionTimestampPredicate.js +1 -1
  5. package/dist/conditionalLogicService/evaluateConditionalSubmissionTimestampPredicate.js.map +1 -1
  6. package/dist/conditionalLogicService/types.d.ts +5 -0
  7. package/dist/conditionalLogicService/types.js +5 -1
  8. package/dist/conditionalLogicService/types.js.map +1 -1
  9. package/dist/index.d.ts +10 -0
  10. package/dist/index.js +10 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/paymentService/getPaymentProvider.d.ts +9 -0
  13. package/dist/paymentService/getPaymentProvider.js +20 -0
  14. package/dist/paymentService/getPaymentProvider.js.map +1 -0
  15. package/dist/paymentService/providers/bpoint.d.ts +7 -0
  16. package/dist/paymentService/providers/bpoint.js +76 -0
  17. package/dist/paymentService/providers/bpoint.js.map +1 -0
  18. package/dist/paymentService/providers/cpPay.d.ts +7 -0
  19. package/dist/paymentService/providers/cpPay.js +119 -0
  20. package/dist/paymentService/providers/cpPay.js.map +1 -0
  21. package/dist/paymentService/providers/nswGovPay.d.ts +7 -0
  22. package/dist/paymentService/providers/nswGovPay.js +90 -0
  23. package/dist/paymentService/providers/nswGovPay.js.map +1 -0
  24. package/dist/paymentService/providers/westpacQuickStream.d.ts +7 -0
  25. package/dist/paymentService/providers/westpacQuickStream.js +64 -0
  26. package/dist/paymentService/providers/westpacQuickStream.js.map +1 -0
  27. package/dist/paymentService/types.d.ts +25 -0
  28. package/dist/paymentService/types.js +2 -0
  29. package/dist/paymentService/types.js.map +1 -0
  30. package/dist/paymentService.d.ts +19 -15
  31. package/dist/paymentService.js +61 -296
  32. package/dist/paymentService.js.map +1 -1
  33. package/package.json +4 -1
@@ -1,5 +1,6 @@
1
- import { conditionalLogicService, formElementsService } from './index.js';
2
- import { getRootElementValueById, } from './submissionService.js';
1
+ import { calculationService, conditionalLogicService, formElementsService, } from './index.js';
2
+ import { getRootElementValueById } from './submissionService.js';
3
+ import getPaymentProvider from './paymentService/getPaymentProvider.js';
3
4
  /**
4
5
  * Examine a submission and its form definition to validate whether a payment
5
6
  * workflow event needs to run.
@@ -51,13 +52,12 @@ export function checkForPaymentEvent({ definition, submission, submissionTimesta
51
52
  return;
52
53
  }
53
54
  console.log('Checking if submission with payment submission event needs processing');
54
- const amountElement = formElementsService.findFormElement(definition.elements, (element) => element.id === paymentSubmissionEvent.configuration.elementId);
55
- if (!amountElement || amountElement.type === 'page') {
56
- console.log('Form has a payment submission event but the amount element does not exist, throwing error');
57
- throw new Error('We could not find the configuration required to make a payment. Please contact your administrator to ensure your application configuration has been completed successfully.');
58
- }
59
- console.log('Found form element for payment submission event', amountElement);
60
- const amount = getRootElementValueById(amountElement.id, definition.elements, submission);
55
+ const amount = resolvePaymentEventAmount({
56
+ configuration: paymentSubmissionEvent.configuration,
57
+ definition,
58
+ submission,
59
+ parseDayOnlyDate,
60
+ });
61
61
  if (!amount) {
62
62
  console.log('Form has a payment submission event but the amount has been entered as 0 or not at all, finishing as normal submission');
63
63
  return;
@@ -66,11 +66,41 @@ export function checkForPaymentEvent({ definition, submission, submissionTimesta
66
66
  console.log('Form has a payment submission event but the amount is not a number, throwing error');
67
67
  throw new Error('The configuration required to make a payment is incorrect. Please contact your administrator to ensure your application configuration has been completed successfully.');
68
68
  }
69
- const result = {
69
+ return {
70
70
  paymentSubmissionEvent,
71
71
  amount,
72
72
  };
73
- return result;
73
+ }
74
+ function resolvePaymentEventAmount({ configuration, definition, submission, parseDayOnlyDate, }) {
75
+ switch (configuration.amountType) {
76
+ case 'NUMBER': {
77
+ console.log('Using fixed payment amount from payment submission event configuration', configuration.paymentAmount);
78
+ return configuration.paymentAmount;
79
+ }
80
+ case 'EXPRESSION': {
81
+ console.log('Evaluating payment calculation from payment submission event configuration', configuration.paymentCalculation);
82
+ return calculationService.evaluateExpression({
83
+ expression: configuration.paymentCalculation,
84
+ submission,
85
+ formElements: definition.elements,
86
+ parseDayOnlyDate,
87
+ });
88
+ }
89
+ case 'FORM_ELEMENT':
90
+ default: {
91
+ if (!configuration.elementId) {
92
+ console.log('Form has a payment submission event but the amount configuration is missing, throwing error');
93
+ throw new Error('We could not find the configuration required to make a payment. Please contact your administrator to ensure your application configuration has been completed successfully.');
94
+ }
95
+ const amountElement = formElementsService.findFormElement(definition.elements, (element) => element.id === configuration.elementId);
96
+ if (!amountElement) {
97
+ console.log('Form has a payment submission event but the amount element does not exist, throwing error');
98
+ throw new Error('We could not find the configuration required to make a payment. Please contact your administrator to ensure your application configuration has been completed successfully.');
99
+ }
100
+ console.log('Found form element for payment submission event', amountElement);
101
+ return getRootElementValueById(amountElement.id, definition.elements, submission);
102
+ }
103
+ }
74
104
  }
75
105
  /**
76
106
  * Retrieve an array of detail items from a form submission payment.
@@ -95,290 +125,25 @@ export function checkForPaymentEvent({ definition, submission, submissionTimesta
95
125
  */
96
126
  export const getDisplayDetailsFromFormSubmissionPayment = (
97
127
  /** The form submission payment to get the details from */
98
- formSubmissionPayment, { formatCurrency, formatDateTime, formatDate, }) => {
99
- switch (formSubmissionPayment.type) {
100
- case 'NSW_GOV_PAY': {
101
- const { paymentTransaction } = formSubmissionPayment;
102
- if (!paymentTransaction || !paymentTransaction.agencyCompletionPayment) {
103
- return;
104
- }
105
- const amount = {
106
- value: paymentTransaction.agencyCompletionPayment.amount,
107
- formatted: formatCurrency(paymentTransaction.agencyCompletionPayment.amount),
108
- };
109
- return {
110
- amount,
111
- paymentDisplayDetails: [
112
- {
113
- key: 'NSW_GOV_PAY_COMPLETION_REFERENCE',
114
- label: 'Completion Reference',
115
- value: paymentTransaction.agencyCompletionPayment
116
- .paymentCompletionReference,
117
- },
118
- {
119
- key: 'NSW_GOV_PAY_PAYMENT_REFERENCE',
120
- label: 'Payment Reference',
121
- value: paymentTransaction.agencyCompletionPayment.paymentReference,
122
- },
123
- {
124
- key: 'NSW_GOV_PAY_BANK_REFERENCE',
125
- label: 'Bank Reference',
126
- value: paymentTransaction.agencyCompletionPayment.bankReference,
127
- },
128
- {
129
- key: 'NSW_GOV_PAY_PAYMENT_METHOD',
130
- label: 'Payment Method',
131
- value: paymentTransaction.agencyCompletionPayment.paymentMethod,
132
- },
133
- ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===
134
- 'BPAY' &&
135
- paymentTransaction.agencyCompletionPayment.bPay?.billerCode
136
- ? [
137
- {
138
- key: 'NSW_GOV_PAY_BPAY_BILLER_CODE',
139
- label: 'BPay Biller Code',
140
- value: paymentTransaction.agencyCompletionPayment.bPay.billerCode,
141
- },
142
- ]
143
- : []),
144
- ...(paymentTransaction.agencyCompletionPayment.paymentMethod ===
145
- 'CARD'
146
- ? [
147
- {
148
- key: 'NSW_GOV_PAY_CREDIT_CARD_NUMBER',
149
- label: 'Card Number',
150
- value: `xxxx xxxx xxxx ${paymentTransaction.agencyCompletionPayment.card?.last4Digits}`,
151
- },
152
- ]
153
- : []),
154
- {
155
- key: 'NSW_GOV_PAY_AMOUNT',
156
- label: 'Amount',
157
- value: amount.formatted,
158
- },
159
- {
160
- key: 'NSW_GOV_PAY_SURCHARGE_AMOUNT',
161
- label: 'Surcharge Amount',
162
- value: formatCurrency(paymentTransaction.agencyCompletionPayment.surcharge),
163
- },
164
- {
165
- key: 'NSW_GOV_PAY_SURCHARGE_GST',
166
- label: 'Surcharge GST',
167
- value: formatCurrency(paymentTransaction.agencyCompletionPayment.surchargeGst),
168
- },
169
- {
170
- key: 'NSW_GOV_PAY_CREATED_DATE_TIME',
171
- label: 'Created Date Time',
172
- value: formatDateTime(formSubmissionPayment.createdAt),
173
- },
174
- ],
175
- };
176
- }
177
- case 'BPOINT': {
178
- const { paymentTransaction } = formSubmissionPayment;
179
- if (!paymentTransaction) {
180
- return;
181
- }
182
- const amountValue = paymentTransaction.Amount / 100;
183
- const amount = {
184
- value: amountValue,
185
- formatted: formatCurrency(amountValue),
186
- };
187
- return {
188
- amount,
189
- paymentDisplayDetails: [
190
- {
191
- key: 'BPOINT_RECEIPT_NUMBER',
192
- label: 'Receipt Number',
193
- value: paymentTransaction.ReceiptNumber,
194
- },
195
- {
196
- key: 'BPOINT_CRN1',
197
- label: 'CRN 1',
198
- value: paymentTransaction.Crn1,
199
- },
200
- {
201
- key: 'BPOINT_CRN2',
202
- label: 'CRN 2',
203
- value: paymentTransaction.Crn2,
204
- },
205
- {
206
- key: 'BPOINT_CRN3',
207
- label: 'CRN 3',
208
- value: paymentTransaction.Crn3,
209
- },
210
- {
211
- key: 'BPOINT_BILLER_CODE',
212
- label: 'Biller Code',
213
- value: paymentTransaction.BillerCode,
214
- },
215
- {
216
- key: 'BPOINT_CREDIT_CARD_MASK',
217
- label: 'Card Number',
218
- value: paymentTransaction.CardDetails.MaskedCardNumber,
219
- },
220
- {
221
- key: 'BPOINT_AMOUNT',
222
- label: 'Amount',
223
- value: amount.formatted,
224
- },
225
- {
226
- key: 'BPOINT_SURCHARGE_AMOUNT',
227
- label: 'Surcharge Amount',
228
- value: formatCurrency(paymentTransaction.AmountSurcharge / 100),
229
- },
230
- {
231
- key: 'BPOINT_PROCESSED_DATE_TIME',
232
- label: 'Processed Date Time',
233
- value: formatDateTime(paymentTransaction.ProcessedDateTime),
234
- },
235
- ],
236
- };
237
- }
238
- case 'CP_PAY': {
239
- const { paymentTransaction } = formSubmissionPayment;
240
- if (!paymentTransaction) {
241
- return;
242
- }
243
- const determineDetails = () => {
244
- switch (paymentTransaction.cpPayVersion) {
245
- case 'v2': {
246
- return {
247
- transactionId: paymentTransaction.result.id,
248
- orderNumber: paymentTransaction.result.externalReferenceId ?? undefined,
249
- paymentType: paymentTransaction.result.paymentType,
250
- creditCardMask: paymentTransaction.result.lastFour
251
- ? `xxxx xxxx xxxx ${paymentTransaction.result.lastFour}`
252
- : undefined,
253
- amount: paymentTransaction.result.amount !== undefined
254
- ? {
255
- value: paymentTransaction.result.amount,
256
- formatted: formatCurrency(paymentTransaction.result.amount),
257
- }
258
- : {
259
- value: NaN,
260
- formatted: 'Unknown',
261
- },
262
- createdDateTime: paymentTransaction.result.createdOnUtc,
263
- };
264
- }
265
- default: {
266
- return {
267
- transactionId: paymentTransaction.transactionId,
268
- orderNumber: paymentTransaction.orderNumber ?? undefined,
269
- paymentType: paymentTransaction.paymentTypeId === 1
270
- ? 'Credit/Debit Card'
271
- : paymentTransaction.paymentTypeId === 2
272
- ? 'ACH'
273
- : undefined,
274
- creditCardMask: paymentTransaction.lastFour
275
- ? `xxxx xxxx xxxx ${paymentTransaction.lastFour}`
276
- : undefined,
277
- amount: {
278
- value: paymentTransaction.amount,
279
- formatted: formatCurrency(paymentTransaction.amount),
280
- },
281
- createdDateTime: paymentTransaction.createdAt,
282
- };
283
- }
284
- }
285
- };
286
- const { transactionId, orderNumber, paymentType, creditCardMask, amount, createdDateTime, } = determineDetails();
287
- const paymentDisplayDetails = [];
288
- if (transactionId) {
289
- paymentDisplayDetails.push({
290
- key: 'CP_PAY_TRANSACTION_ID',
291
- label: 'Transaction Id',
292
- value: transactionId,
293
- });
294
- }
295
- if (orderNumber) {
296
- paymentDisplayDetails.push({
297
- key: 'CP_PAY_ORDER_NUMBER',
298
- label: 'Order Number',
299
- value: orderNumber,
300
- });
301
- }
302
- if (paymentType) {
303
- paymentDisplayDetails.push({
304
- key: 'CP_PAY_PAYMENT_TYPE',
305
- label: 'Payment Type',
306
- value: paymentType,
307
- });
308
- }
309
- if (creditCardMask) {
310
- paymentDisplayDetails.push({
311
- key: 'CP_PAY_CREDIT_CARD_MASK',
312
- label: 'Card Number',
313
- value: creditCardMask,
314
- });
315
- }
316
- paymentDisplayDetails.push({
317
- key: 'CP_PAY_AMOUNT',
318
- label: 'Amount',
319
- value: amount.formatted,
320
- });
321
- if (createdDateTime) {
322
- paymentDisplayDetails.push({
323
- key: 'CP_PAY_CREATED_DATE_TIME',
324
- label: 'Created At',
325
- value: formatDateTime(createdDateTime),
326
- });
327
- }
328
- return {
329
- amount,
330
- paymentDisplayDetails,
331
- };
332
- }
333
- case 'WESTPAC_QUICK_STREAM': {
334
- const { paymentTransaction } = formSubmissionPayment;
335
- if (!paymentTransaction) {
336
- return;
337
- }
338
- const amount = {
339
- value: paymentTransaction.totalAmount.amount,
340
- formatted: formatCurrency(parseFloat(paymentTransaction.totalAmount.amount.toString())),
341
- };
342
- return {
343
- amount,
344
- paymentDisplayDetails: [
345
- {
346
- key: 'WESTPAC_QUICK_STREAM_RECEIPT_NUMBER',
347
- label: 'Receipt Number',
348
- value: paymentTransaction.receiptNumber,
349
- },
350
- {
351
- key: 'WESTPAC_QUICK_STREAM_PAYMENT_REFERENCE_NUMBER',
352
- label: 'Payment Reference',
353
- value: paymentTransaction.paymentReferenceNumber,
354
- },
355
- {
356
- key: 'WESTPAC_QUICK_STREAM_CUSTOMER_REFERENCE_NUMBER',
357
- label: 'Customer Reference Number',
358
- value: paymentTransaction.customerReferenceNumber,
359
- },
360
- {
361
- key: 'WESTPAC_QUICK_STREAM_AMOUNT',
362
- label: 'Amount',
363
- value: amount.formatted,
364
- },
365
- ...(paymentTransaction.surchargeAmount.amount
366
- ? [
367
- {
368
- key: 'WESTPAC_QUICK_STREAM_SURCHARGE_AMOUNT',
369
- label: 'Surcharge Amount',
370
- value: formatCurrency(parseFloat(paymentTransaction.surchargeAmount.amount.toString())),
371
- },
372
- ]
373
- : []),
374
- {
375
- key: 'WESTPAC_QUICK_STREAM_SETTLEMENT_DATE',
376
- label: 'Settlement Date',
377
- value: formatDate(paymentTransaction.settlementDate),
378
- },
379
- ],
380
- };
381
- }
382
- }
128
+ formSubmissionPayment, formatters) => {
129
+ return getPaymentProvider(formSubmissionPayment.type).getDisplayDetails(formSubmissionPayment, formatters);
383
130
  };
131
+ /**
132
+ * Map a form submission payment to the Form Store payment property.
133
+ *
134
+ * #### Example
135
+ *
136
+ * ```js
137
+ * const formStorePayment =
138
+ * paymentService.getFormStorePaymentFromFormSubmissionPayment(
139
+ * formSubmissionPayment,
140
+ * )
141
+ * ```
142
+ *
143
+ * @param formSubmissionPayment
144
+ * @returns
145
+ */
146
+ export function getFormStorePaymentFromFormSubmissionPayment(formSubmissionPayment) {
147
+ return getPaymentProvider(formSubmissionPayment.type).getFormStorePayment(formSubmissionPayment);
148
+ }
384
149
  //# sourceMappingURL=paymentService.js.map
@@ -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 './index.js'\nimport {\n getRootElementValueById,\n ReplaceInjectablesFormatters,\n} from './submissionService.js'\nimport {\n AddOffsetToDate,\n EndOfDay,\n ParseDayOnlyDate,\n StartOfDay,\n} from './conditionalLogicService/types.js'\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({\n * definition: form,\n * submission,\n * submissionTimestamp,\n * parseDayOnlyDate: (value) => new Date(`${value}T00:00:00.000Z`),\n * addDaysToDate: (date, days) => {\n * date.setUTCDate(date.getUTCDate() + days)\n * return date\n * },\n * startOfDay: (date) => {\n * date.setUTCHours(0, 0, 0, 0)\n * return date\n * },\n * endOfDay: (date) => {\n * date.setUTCHours(23, 59, 59, 999)\n * return date\n * },\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport function checkForPaymentEvent({\n definition,\n submission,\n submissionTimestamp,\n parseDayOnlyDate,\n addDaysToDate,\n startOfDay,\n endOfDay,\n}: {\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** ISO timestamp the form was submitted. When evaluating during submission, pass `new Date().toISOString()`. */\n submissionTimestamp: string\n /** Parse `YYYY-MM-DD` strings when evaluating date based predicates */\n parseDayOnlyDate: ParseDayOnlyDate\n /** Add days to a date when evaluating date based predicates */\n addDaysToDate: AddOffsetToDate\n /** Start of calendar day when evaluating date (not datetime) based predicates */\n startOfDay: StartOfDay\n /** End of calendar day when evaluating date (not datetime) based predicates */\n endOfDay: EndOfDay\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 submissionTimestamp,\n parseDayOnlyDate,\n addDaysToDate,\n startOfDay,\n endOfDay,\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 unique key across payment providers to identify the detail */\n key: SubmissionEventTypes.PaymentDisplayDetailKey\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: 'NSW_GOV_PAY_COMPLETION_REFERENCE',\n label: 'Completion Reference',\n value:\n paymentTransaction.agencyCompletionPayment\n .paymentCompletionReference,\n },\n {\n key: 'NSW_GOV_PAY_PAYMENT_REFERENCE',\n label: 'Payment Reference',\n value: paymentTransaction.agencyCompletionPayment.paymentReference,\n },\n {\n key: 'NSW_GOV_PAY_BANK_REFERENCE',\n label: 'Bank Reference',\n value: paymentTransaction.agencyCompletionPayment.bankReference,\n },\n {\n key: 'NSW_GOV_PAY_PAYMENT_METHOD',\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: 'NSW_GOV_PAY_BPAY_BILLER_CODE' as const,\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: 'NSW_GOV_PAY_CREDIT_CARD_NUMBER' as const,\n label: 'Card Number',\n value: `xxxx xxxx xxxx ${paymentTransaction.agencyCompletionPayment.card?.last4Digits}`,\n },\n ]\n : []),\n {\n key: 'NSW_GOV_PAY_AMOUNT',\n label: 'Amount',\n value: amount.formatted,\n },\n {\n key: 'NSW_GOV_PAY_SURCHARGE_AMOUNT',\n label: 'Surcharge Amount',\n value: formatCurrency(\n paymentTransaction.agencyCompletionPayment.surcharge,\n ),\n },\n {\n key: 'NSW_GOV_PAY_SURCHARGE_GST',\n label: 'Surcharge GST',\n value: formatCurrency(\n paymentTransaction.agencyCompletionPayment.surchargeGst,\n ),\n },\n {\n key: 'NSW_GOV_PAY_CREATED_DATE_TIME',\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: 'BPOINT_RECEIPT_NUMBER',\n label: 'Receipt Number',\n value: paymentTransaction.ReceiptNumber,\n },\n {\n key: 'BPOINT_CRN1',\n label: 'CRN 1',\n value: paymentTransaction.Crn1,\n },\n {\n key: 'BPOINT_CRN2',\n label: 'CRN 2',\n value: paymentTransaction.Crn2,\n },\n {\n key: 'BPOINT_CRN3',\n label: 'CRN 3',\n value: paymentTransaction.Crn3,\n },\n {\n key: 'BPOINT_BILLER_CODE',\n label: 'Biller Code',\n value: paymentTransaction.BillerCode,\n },\n {\n key: 'BPOINT_CREDIT_CARD_MASK',\n label: 'Card Number',\n value: paymentTransaction.CardDetails.MaskedCardNumber,\n },\n {\n key: 'BPOINT_AMOUNT',\n label: 'Amount',\n value: amount.formatted,\n },\n {\n key: 'BPOINT_SURCHARGE_AMOUNT',\n label: 'Surcharge Amount',\n value: formatCurrency(paymentTransaction.AmountSurcharge / 100),\n },\n {\n key: 'BPOINT_PROCESSED_DATE_TIME',\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: PaymentDisplayDetail[] = []\n if (transactionId) {\n paymentDisplayDetails.push({\n key: 'CP_PAY_TRANSACTION_ID',\n label: 'Transaction Id',\n value: transactionId,\n })\n }\n if (orderNumber) {\n paymentDisplayDetails.push({\n key: 'CP_PAY_ORDER_NUMBER',\n label: 'Order Number',\n value: orderNumber,\n })\n }\n if (paymentType) {\n paymentDisplayDetails.push({\n key: 'CP_PAY_PAYMENT_TYPE',\n label: 'Payment Type',\n value: paymentType,\n })\n }\n if (creditCardMask) {\n paymentDisplayDetails.push({\n key: 'CP_PAY_CREDIT_CARD_MASK',\n label: 'Card Number',\n value: creditCardMask,\n })\n }\n paymentDisplayDetails.push({\n key: 'CP_PAY_AMOUNT',\n label: 'Amount',\n value: amount.formatted,\n })\n if (createdDateTime) {\n paymentDisplayDetails.push({\n key: 'CP_PAY_CREATED_DATE_TIME',\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: 'WESTPAC_QUICK_STREAM_RECEIPT_NUMBER',\n label: 'Receipt Number',\n value: paymentTransaction.receiptNumber,\n },\n {\n key: 'WESTPAC_QUICK_STREAM_PAYMENT_REFERENCE_NUMBER',\n label: 'Payment Reference',\n value: paymentTransaction.paymentReferenceNumber,\n },\n {\n key: 'WESTPAC_QUICK_STREAM_CUSTOMER_REFERENCE_NUMBER',\n label: 'Customer Reference Number',\n value: paymentTransaction.customerReferenceNumber,\n },\n {\n key: 'WESTPAC_QUICK_STREAM_AMOUNT',\n label: 'Amount',\n value: amount.formatted,\n },\n ...(paymentTransaction.surchargeAmount.amount\n ? [\n {\n key: 'WESTPAC_QUICK_STREAM_SURCHARGE_AMOUNT' as const,\n label: 'Surcharge Amount',\n value: formatCurrency(\n parseFloat(\n paymentTransaction.surchargeAmount.amount.toString(),\n ),\n ),\n },\n ]\n : []),\n {\n key: 'WESTPAC_QUICK_STREAM_SETTLEMENT_DATE',\n label: 'Settlement Date',\n value: formatDate(paymentTransaction.settlementDate),\n },\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 {\n calculationService,\n conditionalLogicService,\n formElementsService,\n} from './index.js'\nimport { getRootElementValueById } from './submissionService.js'\nimport {\n AddOffsetToDate,\n EndOfDay,\n ParseDayOnlyDate,\n StartOfDay,\n} from './conditionalLogicService/types.js'\nimport getPaymentProvider from './paymentService/getPaymentProvider.js'\nimport type {\n FormStorePayment,\n PaymentDisplayDetail,\n PaymentDisplayFormatters,\n PaymentDisplayDetailsResult,\n} from './paymentService/types.js'\n\nexport {\n FormStorePayment,\n PaymentDisplayDetail,\n PaymentDisplayDetailsResult,\n PaymentDisplayFormatters,\n}\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({\n * definition: form,\n * submission,\n * submissionTimestamp,\n * parseDayOnlyDate: (value) => new Date(`${value}T00:00:00.000Z`),\n * addDaysToDate: (date, days) => {\n * date.setUTCDate(date.getUTCDate() + days)\n * return date\n * },\n * startOfDay: (date) => {\n * date.setUTCHours(0, 0, 0, 0)\n * return date\n * },\n * endOfDay: (date) => {\n * date.setUTCHours(23, 59, 59, 999)\n * return date\n * },\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport function checkForPaymentEvent({\n definition,\n submission,\n submissionTimestamp,\n parseDayOnlyDate,\n addDaysToDate,\n startOfDay,\n endOfDay,\n}: {\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** ISO timestamp the form was submitted. When evaluating during submission, pass `new Date().toISOString()`. */\n submissionTimestamp: string\n /** Parse `YYYY-MM-DD` strings when evaluating date based predicates */\n parseDayOnlyDate: ParseDayOnlyDate\n /** Add days to a date when evaluating date based predicates */\n addDaysToDate: AddOffsetToDate\n /** Start of calendar day when evaluating date (not datetime) based predicates */\n startOfDay: StartOfDay\n /** End of calendar day when evaluating date (not datetime) based predicates */\n endOfDay: EndOfDay\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 submissionTimestamp,\n parseDayOnlyDate,\n addDaysToDate,\n startOfDay,\n endOfDay,\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 amount = resolvePaymentEventAmount({\n configuration: paymentSubmissionEvent.configuration,\n definition,\n submission,\n parseDayOnlyDate,\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 return {\n paymentSubmissionEvent,\n amount,\n }\n}\n\nfunction resolvePaymentEventAmount({\n configuration,\n definition,\n submission,\n parseDayOnlyDate,\n}: {\n configuration: SubmissionEventTypes.FormPaymentEvent['configuration']\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n parseDayOnlyDate: ParseDayOnlyDate\n}): unknown {\n switch (configuration.amountType) {\n case 'NUMBER': {\n console.log(\n 'Using fixed payment amount from payment submission event configuration',\n configuration.paymentAmount,\n )\n return configuration.paymentAmount\n }\n case 'EXPRESSION': {\n console.log(\n 'Evaluating payment calculation from payment submission event configuration',\n configuration.paymentCalculation,\n )\n return calculationService.evaluateExpression({\n expression: configuration.paymentCalculation,\n submission,\n formElements: definition.elements,\n parseDayOnlyDate,\n })\n }\n case 'FORM_ELEMENT':\n default: {\n if (!configuration.elementId) {\n console.log(\n 'Form has a payment submission event but the amount configuration is missing, 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 const amountElement = formElementsService.findFormElement(\n definition.elements,\n (element) => element.id === configuration.elementId,\n )\n if (!amountElement) {\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(\n 'Found form element for payment submission event',\n amountElement,\n )\n\n return getRootElementValueById(\n amountElement.id,\n definition.elements,\n submission,\n )\n }\n }\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 formatters: PaymentDisplayFormatters,\n): PaymentDisplayDetailsResult | undefined => {\n return getPaymentProvider(formSubmissionPayment.type).getDisplayDetails(\n formSubmissionPayment,\n formatters,\n )\n}\n\n/**\n * Map a form submission payment to the Form Store payment property.\n *\n * #### Example\n *\n * ```js\n * const formStorePayment =\n * paymentService.getFormStorePaymentFromFormSubmissionPayment(\n * formSubmissionPayment,\n * )\n * ```\n *\n * @param formSubmissionPayment\n * @returns\n */\nexport function getFormStorePaymentFromFormSubmissionPayment(\n formSubmissionPayment: SubmissionTypes.FormSubmissionPayment,\n): FormStorePayment {\n return getPaymentProvider(formSubmissionPayment.type).getFormStorePayment(\n formSubmissionPayment,\n )\n}\n"]}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "@oneblink/sdk-core",
3
3
  "description": "OneBlink SDK for JavaScript (works in Browsers and NodeJS)",
4
- "version": "10.0.0",
4
+ "version": "10.1.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"
8
8
  },
9
+ "dependencies": {
10
+ "morph-expressions": "^1.1.1"
11
+ },
9
12
  "devDependencies": {
10
13
  "@eslint/eslintrc": "^3.3.3",
11
14
  "@eslint/js": "^9.39.2",