Skip to content

Commit

Permalink
Add taxDoc as optional field in database
Browse files Browse the repository at this point in the history
  • Loading branch information
sophialittlejohn committed Sep 8, 2023
1 parent 8571369 commit 8bd38a3
Show file tree
Hide file tree
Showing 8 changed files with 41 additions and 46 deletions.
5 changes: 5 additions & 0 deletions onboarding-api/src/controllers/emails/signAndSendDocuments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ export const signAndSendDocumentsController = async (

const { poolSteps, globalSteps, investorType, name, email, ...user } = await fetchUser(wallet)
const { metadata } = await new NetworkSwitch(wallet.network).getPoolById(poolId)

if (metadata.onboarding?.requireTaxInfo && !user.taxDocument) {
throw new HttpError(400, 'Tax info required')
}

if (
investorType === 'individual' &&
metadata?.onboarding?.kycRestrictedCountries?.includes(user.countryOfCitizenship)
Expand Down
2 changes: 1 addition & 1 deletion onboarding-api/src/controllers/kyb/verifyBusiness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ export const verifyBusinessController = async (
confirmOwners: { completed: false, timeStamp: null },
verifyIdentity: { completed: false, timeStamp: null },
verifyAccreditation: { completed: false, timeStamp: null },
verifyTaxInfo: { completed: false, timeStamp: null },
},
poolSteps: {},
taxDocument: null,
}

if (!(jurisdictionCode.slice(0, 2) in KYB_COUNTRY_CODES)) {
Expand Down
20 changes: 4 additions & 16 deletions onboarding-api/src/controllers/user/getTaxInfo.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,11 @@
import { Request, Response } from 'express'
import { onboardingBucket } from '../../database'
import { HttpError, reportHttpError } from '../../utils/httpError'
import { fetchTaxInfo } from '../../utils/fetchTaxInfo'
import { reportHttpError } from '../../utils/httpError'

export const getTaxInfoController = async (req: Request, res: Response) => {
try {
const {
wallet: { address },
} = req

const taxInfo = await onboardingBucket.file(`tax-information/${address}.pdf`)

const [taxInfoExists] = await taxInfo.exists()

if (!taxInfoExists) {
throw new HttpError(404, 'Tax info not found')
}

const pdf = await taxInfo.download()
return res.send({ taxInfo: pdf[0] })
const taxInfo = await fetchTaxInfo(req.wallet)
return res.send({ taxInfo })
} catch (e) {
const error = reportHttpError(e)
return res.status(error.code).send({ error: error.message })
Expand Down
12 changes: 3 additions & 9 deletions onboarding-api/src/controllers/user/startKyc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,19 +76,13 @@ export const startKycController = async (req: Request<any, any, InferType<typeof
countryOfCitizenship: body.countryOfCitizenship,
countryOfResidency: body.countryOfResidency,
globalSteps: {
verifyIdentity: {
completed: false,
timeStamp: null,
},
verifyEmail: {
completed: false,
timeStamp: null,
},
verifyIdentity: { completed: false, timeStamp: null },
verifyEmail: { completed: false, timeStamp: null },
verifyAccreditation: { completed: false, timeStamp: null },
verifyTaxInfo: { completed: false, timeStamp: null },
},
poolSteps: {},
email: body.email as string,
taxDocument: null,
}
await validateAndWriteToFirestore(wallet, newUser, 'individual')
}
Expand Down
21 changes: 12 additions & 9 deletions onboarding-api/src/controllers/user/uploadTaxInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,21 @@ export const uploadTaxInfoController = async (req: Request, res: Response) => {
const { wallet } = req
const user = await fetchUser(wallet)

await writeToOnboardingBucket(Uint8Array.from(req.body), `tax-information/${wallet.address}.pdf`)
let taxDocument = ''
if (user?.taxDocument) {
const taxDoc = user.taxDocument.split('/')
const version = taxDoc[taxDoc.length - 1].split('.')[0].split('_')[1] ?? '0'
const newVersion = Number(version) + 1
taxDocument = `tax-information/${wallet.address}_${newVersion}.pdf`
} else {
taxDocument = `tax-information/${wallet.address}.pdf`
}

const updatedUser: Subset<OnboardingUser> = {
globalSteps: {
verifyTaxInfo: {
completed: true,
timeStamp: new Date().toISOString(),
},
},
taxDocument: `${process.env.ONBOARDING_STORAGE_BUCKET}/${taxDocument}`,
}

await validateAndWriteToFirestore(wallet, updatedUser, user.investorType, ['globalSteps.verifyTaxInfo'])
await writeToOnboardingBucket(Uint8Array.from(req.body), taxDocument)
await validateAndWriteToFirestore(wallet, updatedUser, user.investorType, ['taxDocument'])

const freshUserData = await fetchUser(wallet)
return res.status(200).send({ ...freshUserData })
Expand Down
8 changes: 3 additions & 5 deletions onboarding-api/src/database/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,6 @@ const globalStepsSchema = object({
completed: bool(),
timeStamp: string().nullable(),
}),
verifyTaxInfo: object({
completed: bool(),
timeStamp: string().nullable(),
}),
verifyAccreditation: object({
completed: bool(),
timeStamp: string().nullable(),
Expand Down Expand Up @@ -109,6 +105,7 @@ export const entityUserSchema = object({
poolSteps: poolStepsSchema,
manualKybReference: string().nullable().default(null),
address: string().nullable().default(null),
taxDocument: string().nullable().default(null),
})

export const individualUserSchema = object({
Expand All @@ -120,9 +117,10 @@ export const individualUserSchema = object({
dateOfBirth: string().required(),
countryOfCitizenship: string().required(), // TODO: validate with list of countries
countryOfResidency: string().required(), // TODO: validate with list of countries
globalSteps: globalStepsSchema.pick(['verifyIdentity', 'verifyAccreditation', 'verifyTaxInfo', 'verifyEmail']),
globalSteps: globalStepsSchema.pick(['verifyIdentity', 'verifyAccreditation', 'verifyEmail']).optional(),
poolSteps: poolStepsSchema,
address: string().nullable().default(null),
taxDocument: string().nullable().default(null),
})

export type EntityUser = InferType<typeof entityUserSchema>
Expand Down
2 changes: 1 addition & 1 deletion onboarding-api/src/emails/sendDocumentsMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export const sendDocumentsMessage = async (
const taxInfoPDF = metadata.onboarding.taxInfoRequired ? await fetchTaxInfo(wallet) : null
if (taxInfoPDF) {
attachments.push({
content: taxInfoPDF[0].toString('base64'),
content: taxInfoPDF.toString('base64'),
filename: 'tax-info.pdf',
type: 'application/pdf',
disposition: 'attachment',
Expand Down
17 changes: 12 additions & 5 deletions onboarding-api/src/utils/fetchTaxInfo.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
import { Request } from 'express'
import { onboardingBucket } from '../database'
import { fetchUser } from './fetchUser'
import { HttpError } from './httpError'

export const fetchTaxInfo = async (wallet: Request['wallet']) => {
const taxInfoFile = await onboardingBucket.file(`tax-information/${wallet.address}.pdf`)
const [taxInfoExists] = await taxInfoFile.exists()
const user = await fetchUser(wallet)
const path = user?.taxDocument
? `${user.taxDocument.split('/').at(-2)}/${user.taxDocument.split('/').at(-1)}`
: `tax-information/${wallet.address}.pdf`
const taxInfo = await onboardingBucket.file(path)

const [taxInfoExists] = await taxInfo.exists()

if (!taxInfoExists) {
throw new HttpError(400, 'Tax info not found')
throw new HttpError(404, 'Tax info not found')
}
const taxInfoPDF = await taxInfoFile.download()
return taxInfoPDF

const taxInfoPDF = await taxInfo.download()
return taxInfoPDF[0]
}

0 comments on commit 8bd38a3

Please sign in to comment.