@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra-fish/sales-api-service",
3
- "version": "1.30.0-rc.8",
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-rc.8",
39
- "@defra-fish/connectors-lib": "1.30.0-rc.8",
40
- "@defra-fish/dynamics-lib": "1.30.0-rc.8",
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": "e0fc61290939c323445d45b20f56e17416bb0b08"
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 permission of record.permissions) {
65
- const permit = await getReferenceDataForEntityAndId(Permit, permission.permitId)
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 += permit.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)