@defra-fish/sales-api-service 1.30.0-rc.8 → 1.30.0
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.
- package/package.json +5 -5
- package/src/services/transactions/__tests__/create-transaction.spec.js +29 -2
- package/src/services/transactions/__tests__/process-transaction-queue.spec.js +52 -4
- package/src/services/transactions/create-transaction.js +7 -3
- package/src/services/transactions/process-transaction-queue.js +6 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defra-fish/sales-api-service",
|
|
3
|
-
"version": "1.30.0
|
|
3
|
+
"version": "1.30.0",
|
|
4
4
|
"description": "Rod Licensing Sales API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@defra-fish/business-rules-lib": "1.30.0
|
|
39
|
-
"@defra-fish/connectors-lib": "1.30.0
|
|
40
|
-
"@defra-fish/dynamics-lib": "1.30.0
|
|
38
|
+
"@defra-fish/business-rules-lib": "1.30.0",
|
|
39
|
+
"@defra-fish/connectors-lib": "1.30.0",
|
|
40
|
+
"@defra-fish/dynamics-lib": "1.30.0",
|
|
41
41
|
"@hapi/boom": "^9.1.2",
|
|
42
42
|
"@hapi/hapi": "^20.1.3",
|
|
43
43
|
"@hapi/inert": "^6.0.3",
|
|
@@ -52,5 +52,5 @@
|
|
|
52
52
|
"moment-timezone": "^0.5.34",
|
|
53
53
|
"uuid": "^8.3.2"
|
|
54
54
|
},
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "f5dacdf20e2841487fa641de4eed2bae64e6c205"
|
|
56
56
|
}
|
|
@@ -7,23 +7,28 @@ import {
|
|
|
7
7
|
} from '../../../__mocks__/test-data.js'
|
|
8
8
|
import { TRANSACTION_STAGING_TABLE } from '../../../config.js'
|
|
9
9
|
import AwsMock from 'aws-sdk'
|
|
10
|
+
import { getPermissionCost } from '@defra-fish/business-rules-lib'
|
|
11
|
+
import { getReferenceDataForEntityAndId } from '../../reference-data.service.js'
|
|
10
12
|
|
|
13
|
+
jest.mock('@defra-fish/business-rules-lib')
|
|
11
14
|
jest.mock('../../reference-data.service.js', () => ({
|
|
12
15
|
...jest.requireActual('../../reference-data.service.js'),
|
|
13
|
-
getReferenceDataForEntityAndId: async (entityType, id) => {
|
|
16
|
+
getReferenceDataForEntityAndId: jest.fn(async (entityType, id) => {
|
|
14
17
|
let item = null
|
|
15
18
|
if (entityType === MOCK_12MONTH_SENIOR_PERMIT.constructor) {
|
|
16
19
|
item = [MOCK_12MONTH_SENIOR_PERMIT, MOCK_12MONTH_DISABLED_PERMIT, MOCK_1DAY_SENIOR_PERMIT_ENTITY].find(p => p.id === id)
|
|
17
20
|
}
|
|
18
21
|
return item
|
|
19
|
-
}
|
|
22
|
+
})
|
|
20
23
|
}))
|
|
21
24
|
|
|
22
25
|
describe('transaction service', () => {
|
|
23
26
|
beforeAll(() => {
|
|
24
27
|
TRANSACTION_STAGING_TABLE.TableName = 'TestTable'
|
|
28
|
+
getPermissionCost.mockReturnValue(54)
|
|
25
29
|
})
|
|
26
30
|
beforeEach(AwsMock.__resetAll)
|
|
31
|
+
beforeEach(jest.clearAllMocks)
|
|
27
32
|
|
|
28
33
|
describe('createTransaction', () => {
|
|
29
34
|
it('accepts a new transaction', async () => {
|
|
@@ -46,6 +51,28 @@ describe('transaction service', () => {
|
|
|
46
51
|
)
|
|
47
52
|
})
|
|
48
53
|
|
|
54
|
+
it.each([99, 115, 22, 87.99])('uses business rules lib to calculate price (%d)', async permitPrice => {
|
|
55
|
+
getPermissionCost.mockReturnValueOnce(permitPrice)
|
|
56
|
+
const mockPayload = mockTransactionPayload()
|
|
57
|
+
const { cost } = await createTransaction(mockPayload)
|
|
58
|
+
expect(cost).toBe(permitPrice)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('passes startDate and permit to getPermissionCost', async () => {
|
|
62
|
+
getReferenceDataForEntityAndId.mockReturnValueOnce(MOCK_12MONTH_SENIOR_PERMIT)
|
|
63
|
+
const mockPayload = mockTransactionPayload()
|
|
64
|
+
const {
|
|
65
|
+
permissions: [{ startDate }]
|
|
66
|
+
} = mockPayload
|
|
67
|
+
await createTransaction(mockPayload)
|
|
68
|
+
expect(getPermissionCost).toHaveBeenCalledWith(
|
|
69
|
+
expect.objectContaining({
|
|
70
|
+
startDate,
|
|
71
|
+
permit: MOCK_12MONTH_SENIOR_PERMIT
|
|
72
|
+
})
|
|
73
|
+
)
|
|
74
|
+
})
|
|
75
|
+
|
|
49
76
|
it('throws exceptions back up the stack', async () => {
|
|
50
77
|
AwsMock.DynamoDB.DocumentClient.__throwWithErrorOn('put')
|
|
51
78
|
await expect(createTransaction(mockTransactionPayload())).rejects.toThrow('Test error')
|
|
@@ -24,7 +24,8 @@ import {
|
|
|
24
24
|
} from '../../../__mocks__/test-data.js'
|
|
25
25
|
import { TRANSACTION_STAGING_TABLE, TRANSACTION_STAGING_HISTORY_TABLE } from '../../../config.js'
|
|
26
26
|
import AwsMock from 'aws-sdk'
|
|
27
|
-
import { POCL_DATA_SOURCE, DDE_DATA_SOURCE } from '@defra-fish/business-rules-lib'
|
|
27
|
+
import { POCL_DATA_SOURCE, DDE_DATA_SOURCE, getPermissionCost } from '@defra-fish/business-rules-lib'
|
|
28
|
+
import { getReferenceDataForEntityAndId } from '../../reference-data.service.js'
|
|
28
29
|
|
|
29
30
|
jest.mock('../../reference-data.service.js', () => ({
|
|
30
31
|
...jest.requireActual('../../reference-data.service.js'),
|
|
@@ -34,7 +35,7 @@ jest.mock('../../reference-data.service.js', () => ({
|
|
|
34
35
|
}
|
|
35
36
|
return []
|
|
36
37
|
},
|
|
37
|
-
getReferenceDataForEntityAndId: async (entityType, id) => {
|
|
38
|
+
getReferenceDataForEntityAndId: jest.fn(async (entityType, id) => {
|
|
38
39
|
let item = null
|
|
39
40
|
if (entityType === MOCK_12MONTH_SENIOR_PERMIT.constructor) {
|
|
40
41
|
item = [MOCK_12MONTH_SENIOR_PERMIT, MOCK_12MONTH_DISABLED_PERMIT, MOCK_1DAY_SENIOR_PERMIT_ENTITY].find(p => p.id === id)
|
|
@@ -42,7 +43,7 @@ jest.mock('../../reference-data.service.js', () => ({
|
|
|
42
43
|
item = MOCK_CONCESSION
|
|
43
44
|
}
|
|
44
45
|
return item
|
|
45
|
-
}
|
|
46
|
+
})
|
|
46
47
|
}))
|
|
47
48
|
|
|
48
49
|
jest.mock('@defra-fish/dynamics-lib', () => ({
|
|
@@ -60,7 +61,8 @@ jest.mock('@defra-fish/business-rules-lib', () => ({
|
|
|
60
61
|
POCL_DATA_SOURCE: 'POCL_DATA_SOURCE',
|
|
61
62
|
DDE_DATA_SOURCE: 'DDE_DATA_SOURCE',
|
|
62
63
|
POCL_TRANSACTION_SOURCES: ['POCL_DATA_SOURCE', 'DDE_DATA_SOURCE'],
|
|
63
|
-
START_AFTER_PAYMENT_MINUTES: 30
|
|
64
|
+
START_AFTER_PAYMENT_MINUTES: 30,
|
|
65
|
+
getPermissionCost: jest.fn(() => 1)
|
|
64
66
|
}))
|
|
65
67
|
|
|
66
68
|
describe('transaction service', () => {
|
|
@@ -244,6 +246,52 @@ describe('transaction service', () => {
|
|
|
244
246
|
expect(e.output.statusCode).toEqual(404)
|
|
245
247
|
}
|
|
246
248
|
})
|
|
249
|
+
|
|
250
|
+
describe.each([20, 38.46, 287])('uses getPermissionCost (%d) value ', cost => {
|
|
251
|
+
const setup = async () => {
|
|
252
|
+
getPermissionCost.mockReturnValueOnce(cost)
|
|
253
|
+
const mockRecord = mockFinalisedTransactionRecord()
|
|
254
|
+
AwsMock.DynamoDB.DocumentClient.__setResponse('get', { Item: mockRecord })
|
|
255
|
+
await processQueue({ id: mockRecord.id })
|
|
256
|
+
const {
|
|
257
|
+
mock: {
|
|
258
|
+
calls: [[[transaction, chargeJournal, paymentJournal]]]
|
|
259
|
+
}
|
|
260
|
+
} = persist
|
|
261
|
+
return { transaction, chargeJournal, paymentJournal }
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
it('for calculating transaction value', async () => {
|
|
265
|
+
const { transaction } = await setup()
|
|
266
|
+
expect(transaction.total).toBe(cost)
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
it('for calculating chargeJournal value', async () => {
|
|
270
|
+
const { chargeJournal } = await setup()
|
|
271
|
+
expect(chargeJournal.total).toBe(cost * -1)
|
|
272
|
+
})
|
|
273
|
+
|
|
274
|
+
it('for calculating paymentJournal value', async () => {
|
|
275
|
+
const { paymentJournal } = await setup()
|
|
276
|
+
expect(paymentJournal.total).toBe(cost)
|
|
277
|
+
})
|
|
278
|
+
})
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
it('passes start date and permit to getPermissionCost', async () => {
|
|
282
|
+
const mockRecord = mockFinalisedTransactionRecord()
|
|
283
|
+
const {
|
|
284
|
+
permissions: [permission]
|
|
285
|
+
} = mockRecord
|
|
286
|
+
getReferenceDataForEntityAndId.mockReturnValueOnce(MOCK_12MONTH_SENIOR_PERMIT)
|
|
287
|
+
AwsMock.DynamoDB.DocumentClient.__setResponse('get', { Item: mockRecord })
|
|
288
|
+
await processQueue({ id: mockRecord.id })
|
|
289
|
+
expect(getPermissionCost).toHaveBeenCalledWith(
|
|
290
|
+
expect.objectContaining({
|
|
291
|
+
startDate: permission.startDate,
|
|
292
|
+
permit: MOCK_12MONTH_SENIOR_PERMIT
|
|
293
|
+
})
|
|
294
|
+
)
|
|
247
295
|
})
|
|
248
296
|
|
|
249
297
|
describe('.getTransactionJournalRefNumber', () => {
|
|
@@ -5,6 +5,7 @@ import { v4 as uuidv4 } from 'uuid'
|
|
|
5
5
|
import { AWS } from '@defra-fish/connectors-lib'
|
|
6
6
|
import db from 'debug'
|
|
7
7
|
import { Permit } from '@defra-fish/dynamics-lib'
|
|
8
|
+
import { getPermissionCost } from '@defra-fish/business-rules-lib'
|
|
8
9
|
const { docClient } = AWS()
|
|
9
10
|
const debug = db('sales:transactions')
|
|
10
11
|
|
|
@@ -61,10 +62,13 @@ async function createTransactionRecord (payload) {
|
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
// Generate derived fields
|
|
64
|
-
for (const
|
|
65
|
-
const permit = await getReferenceDataForEntityAndId(Permit,
|
|
65
|
+
for (const { permitId, startDate } of record.permissions) {
|
|
66
|
+
const permit = await getReferenceDataForEntityAndId(Permit, permitId)
|
|
66
67
|
record.isRecurringPaymentSupported = record.isRecurringPaymentSupported && permit.isRecurringPaymentSupported
|
|
67
|
-
record.cost +=
|
|
68
|
+
record.cost += getPermissionCost({
|
|
69
|
+
startDate,
|
|
70
|
+
permit
|
|
71
|
+
})
|
|
68
72
|
}
|
|
69
73
|
return record
|
|
70
74
|
}
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
RecurringPayment,
|
|
12
12
|
RecurringPaymentInstruction
|
|
13
13
|
} from '@defra-fish/dynamics-lib'
|
|
14
|
-
import { DDE_DATA_SOURCE, POCL_TRANSACTION_SOURCES } from '@defra-fish/business-rules-lib'
|
|
14
|
+
import { DDE_DATA_SOURCE, getPermissionCost, POCL_TRANSACTION_SOURCES } from '@defra-fish/business-rules-lib'
|
|
15
15
|
import { getReferenceDataForEntityAndId, getGlobalOptionSetValue, getReferenceDataForEntity } from '../reference-data.service.js'
|
|
16
16
|
import { resolveContactPayload } from '../contacts.service.js'
|
|
17
17
|
import { retrieveStagedTransaction } from './retrieve-transaction.js'
|
|
@@ -57,8 +57,6 @@ export async function processQueue ({ id }) {
|
|
|
57
57
|
const contact = await resolveContactPayload(licensee)
|
|
58
58
|
const permit = await getReferenceDataForEntityAndId(Permit, permitId)
|
|
59
59
|
|
|
60
|
-
totalTransactionValue += permit.cost
|
|
61
|
-
|
|
62
60
|
const permission = await mapToPermission(
|
|
63
61
|
referenceNumber,
|
|
64
62
|
transactionRecord,
|
|
@@ -70,6 +68,11 @@ export async function processQueue ({ id }) {
|
|
|
70
68
|
isRenewal
|
|
71
69
|
)
|
|
72
70
|
|
|
71
|
+
totalTransactionValue += getPermissionCost({
|
|
72
|
+
startDate,
|
|
73
|
+
permit
|
|
74
|
+
})
|
|
75
|
+
|
|
73
76
|
permission.bindToEntity(Permission.definition.relationships.licensee, contact)
|
|
74
77
|
permission.bindToEntity(Permission.definition.relationships.permit, permit)
|
|
75
78
|
permission.bindToEntity(Permission.definition.relationships.transaction, transaction)
|