@defra-fish/sales-api-service
Version:
Rod Licensing Sales API
110 lines (89 loc) • 3.96 kB
JavaScript
import { isSenior, SERVICE_LOCAL_TIME } from '@defra-fish/business-rules-lib'
import moment from 'moment-timezone'
import { addSenior } from '../concession.service.js'
import { findPermit } from '../permit.service.js'
// Replicated from GAFL - need to decide whether to move
const cacheDateFormat = 'YYYY-MM-DD'
const licenceToStart = {
AFTER_PAYMENT: 'after-payment',
ANOTHER_DATE: 'another-date'
}
export const preparePermissionDataForRenewal = async existingPermission => {
const dateData = prepareDateData(existingPermission)
const concessions = await prepareConcessionsData(existingPermission, dateData)
return {
...prepareBasePermissionData(existingPermission),
...dateData,
licensee: prepareLicenseeData(existingPermission),
concessions,
permitId: await preparePermit(existingPermission)
}
}
const prepareBasePermissionData = existingPermission => ({
isRenewal: true,
licenceLength: '12M', // Always for renewals
licenceType: existingPermission.permit.permitSubtype.label,
numberOfRods: existingPermission.permit.numberOfRods.toString(),
isLicenceForYou: true
})
const prepareLicenseeData = existingPermission => {
const licenseeData = Object.assign(copyFilteredLicenseeData(existingPermission), prepareCountryData(existingPermission))
// Delete any licensee objects which are null
Object.entries(licenseeData)
.filter(e => e[1] === null)
.map(e => e[0])
.forEach(k => delete licenseeData[k])
Object.assign(licenseeData, prepareContactMethodData(existingPermission))
return licenseeData
}
const prepareDateData = existingPermission => {
const endDateMoment = moment.utc(existingPermission.endDate).tz(SERVICE_LOCAL_TIME)
const renewedHasExpired = !endDateMoment.isAfter(moment().tz(SERVICE_LOCAL_TIME))
const dateData = renewedHasExpired ? dateDataIfExpired() : dateDataIfNotExpired(endDateMoment)
dateData.renewedEndDate = endDateMoment.toISOString()
return dateData
}
// Retain existing data except country and shortTermPreferredMethodOfConfirmation
const copyFilteredLicenseeData = existingPermission =>
(({ country: _country, shortTermPreferredMethodOfConfirmation: _shortTermPreferredMethodOfConfirmation, ...l }) => l)(
existingPermission.licensee
)
const prepareCountryData = existingPermission => ({
country: existingPermission.licensee.country.label,
countryCode: existingPermission.licensee.country.description
})
const prepareContactMethodData = existingPermission => ({
preferredMethodOfNewsletter: existingPermission.licensee.preferredMethodOfNewsletter.label,
preferredMethodOfConfirmation: existingPermission.licensee.preferredMethodOfConfirmation.label,
preferredMethodOfReminder: existingPermission.licensee.preferredMethodOfReminder.label
})
const getLicenceStartDate = licenceEndDate => moment(licenceEndDate).add(1, 'minute').seconds(0).tz(SERVICE_LOCAL_TIME)
const dateDataIfExpired = () => ({
renewedHasExpired: true,
licenceToStart: licenceToStart.AFTER_PAYMENT,
licenceStartDate: moment().tz(SERVICE_LOCAL_TIME).format(cacheDateFormat),
licenceStartTime: 0
})
const dateDataIfNotExpired = endDateMoment => {
const licenceStartDate = getLicenceStartDate(endDateMoment)
return {
renewedHasExpired: false,
licenceToStart: licenceToStart.ANOTHER_DATE,
licenceStartDate: licenceStartDate.format(cacheDateFormat),
licenceStartTime: licenceStartDate.hours()
}
}
const preparePermit = async existingPermission => {
const permit = await findPermit(existingPermission)
return permit.id
}
const prepareConcessionsData = async (existingPermission, dateData) => {
delete existingPermission.licensee.noLicenceRequired
const ageAtLicenceStartDate = moment(dateData.licenceStartDate)
.add(1, 'year')
.diff(moment(existingPermission.licensee.birthDate), 'years')
if (isSenior(ageAtLicenceStartDate)) {
await addSenior(existingPermission)
}
return existingPermission.concessions
}