From 3bff76aac2afc8fd2bad83b9ca7e89be01e45f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Albert?= Date: Fri, 18 Oct 2024 13:52:52 +0000 Subject: [PATCH] feat(driving-license): add pickup option to submit data for 65+ (#16453) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../driving-license/src/lib/drivingLicense.service.ts | 3 +++ .../driving-license/src/lib/drivingLicense.type.ts | 11 +++++++++++ .../driving-license-submission.service.ts | 11 +++++++++++ .../src/forms/draft/subSectionDelivery.ts | 3 ++- .../src/forms/draft/subSectionSummary.ts | 2 +- .../templates/driving-license/src/lib/constants.ts | 5 ----- .../templates/driving-license/src/lib/dataSchema.ts | 2 ++ .../driving-license/src/lib/drivingLicenseTemplate.ts | 2 +- .../templates/driving-license/src/lib/types.ts | 5 +++++ .../src/lib/drivingLicenseApi.service.ts | 6 +++++- libs/clients/driving-license/src/v5/clientConfig.json | 10 ++++++++++ 11 files changed, 51 insertions(+), 9 deletions(-) diff --git a/libs/api/domains/driving-license/src/lib/drivingLicense.service.ts b/libs/api/domains/driving-license/src/lib/drivingLicense.service.ts index 9cb539b8105c..4c524d48bd26 100644 --- a/libs/api/domains/driving-license/src/lib/drivingLicense.service.ts +++ b/libs/api/domains/driving-license/src/lib/drivingLicense.service.ts @@ -15,6 +15,7 @@ import { QualitySignatureResult, NewBEDrivingLicenseInput, DrivinglicenseDuplicateValidityStatus, + PostRenewal65AndOverInput, } from './drivingLicense.type' import { CanApplyErrorCodeBFull, @@ -513,8 +514,10 @@ export class DrivingLicenseService { async renewDrivingLicense65AndOver( auth: User['authorization'], + input: PostRenewal65AndOverInput, ): Promise { const response = await this.drivingLicenseApi.postRenewLicenseOver65({ + input, auth: auth, }) return { diff --git a/libs/api/domains/driving-license/src/lib/drivingLicense.type.ts b/libs/api/domains/driving-license/src/lib/drivingLicense.type.ts index 741ca9a09017..ae76feed4c49 100644 --- a/libs/api/domains/driving-license/src/lib/drivingLicense.type.ts +++ b/libs/api/domains/driving-license/src/lib/drivingLicense.type.ts @@ -9,6 +9,17 @@ export interface DrivingLicenseType { export type DrivingLicenseApplicationType = 'B-full' | 'B-temp' | 'BE' +export interface PostRenewal65AndOverInput { + districtId?: number + pickupPlasticAtDistrict?: boolean | null + sendPlasticToPerson?: boolean | null +} + +export enum Pickup { + 'POST' = 'post', + 'DISTRICT' = 'district', +} + export interface NewDrivingLicenseInput { jurisdictionId: number needsToPresentHealthCertificate: boolean diff --git a/libs/application/template-api-modules/src/lib/modules/templates/driving-license-submission/driving-license-submission.service.ts b/libs/application/template-api-modules/src/lib/modules/templates/driving-license-submission/driving-license-submission.service.ts index 564d558d33dc..16c5436405f5 100644 --- a/libs/application/template-api-modules/src/lib/modules/templates/driving-license-submission/driving-license-submission.service.ts +++ b/libs/application/template-api-modules/src/lib/modules/templates/driving-license-submission/driving-license-submission.service.ts @@ -3,6 +3,7 @@ import { DrivingLicenseCategory, DrivingLicenseService, NewDrivingLicenseResult, + Pickup, } from '@island.is/api/domains/driving-license' import { SharedTemplateApiService } from '../../shared' @@ -148,6 +149,7 @@ export class DrivingLicenseSubmissionService extends BaseTemplateApiService { const jurisdictionId = answers.jurisdiction const teacher = answers.drivingInstructor as string const email = answers.email as string + const pickup = answers.pickup ? (answers.pickup as Pickup) : undefined const phone = formatPhoneNumber(answers.phone as string) const postHealthDeclaration = async ( @@ -173,6 +175,15 @@ export class DrivingLicenseSubmissionService extends BaseTemplateApiService { if (applicationFor === 'B-full-renewal-65') { return this.drivingLicenseService.renewDrivingLicense65AndOver( auth.authorization.replace('Bearer ', ''), + { + ...(jurisdictionId && { districtId: jurisdictionId as number }), + ...(pickup + ? { + pickupPlasticAtDistrict: pickup === Pickup.DISTRICT, + sendPlasticToPerson: pickup === Pickup.POST, + } + : {}), + }, ) } else if (applicationFor === 'B-full') { return this.drivingLicenseService.newDrivingLicense(nationalId, { diff --git a/libs/application/templates/driving-license/src/forms/draft/subSectionDelivery.ts b/libs/application/templates/driving-license/src/forms/draft/subSectionDelivery.ts index a0c5c6c733a0..04ba74f86a50 100644 --- a/libs/application/templates/driving-license/src/forms/draft/subSectionDelivery.ts +++ b/libs/application/templates/driving-license/src/forms/draft/subSectionDelivery.ts @@ -12,7 +12,8 @@ import { } from '../../lib/utils' import { Jurisdiction } from '@island.is/clients/driving-license' -import { B_FULL_RENEWAL_65, Pickup } from '../../lib/constants' +import { B_FULL_RENEWAL_65 } from '../../lib/constants' +import { Pickup } from '../../lib/types' export const subSectionDelivery = buildSubSection({ id: 'user', diff --git a/libs/application/templates/driving-license/src/forms/draft/subSectionSummary.ts b/libs/application/templates/driving-license/src/forms/draft/subSectionSummary.ts index eaf87d11492c..5ed8b00ea756 100644 --- a/libs/application/templates/driving-license/src/forms/draft/subSectionSummary.ts +++ b/libs/application/templates/driving-license/src/forms/draft/subSectionSummary.ts @@ -20,7 +20,6 @@ import { BE, CHARGE_ITEM_CODES, DELIVERY_FEE, - Pickup, YES, } from '../../lib/constants' import { @@ -29,6 +28,7 @@ import { needsHealthCertificateCondition, } from '../../lib/utils' import { formatPhoneNumber } from '@island.is/application/ui-components' +import { Pickup } from '../../lib/types' export const subSectionSummary = buildSubSection({ id: 'overview', diff --git a/libs/application/templates/driving-license/src/lib/constants.ts b/libs/application/templates/driving-license/src/lib/constants.ts index 672776f7bf29..0e4e00652e02 100644 --- a/libs/application/templates/driving-license/src/lib/constants.ts +++ b/libs/application/templates/driving-license/src/lib/constants.ts @@ -11,11 +11,6 @@ export const B_FULL_RENEWAL_65 = 'B-full-renewal-65' export const BE = 'BE' export const DELIVERY_FEE = 'deliveryFee' -export enum Pickup { - 'POST' = 'post', - 'DISTRICT' = 'district', -} - export const CHARGE_ITEM_CODES: Record = { [B_TEMP]: 'AY114', [B_FULL]: 'AY110', diff --git a/libs/application/templates/driving-license/src/lib/dataSchema.ts b/libs/application/templates/driving-license/src/lib/dataSchema.ts index ca0d7a51e105..82d68194a468 100644 --- a/libs/application/templates/driving-license/src/lib/dataSchema.ts +++ b/libs/application/templates/driving-license/src/lib/dataSchema.ts @@ -1,6 +1,7 @@ import { z } from 'zod' import { YES, NO, B_FULL_RENEWAL_65, BE, B_TEMP, B_FULL } from './constants' import { parsePhoneNumberFromString } from 'libphonenumber-js' +import { Pickup } from './types' const isValidPhoneNumber = (phoneNumber: string) => { const phone = parsePhoneNumberFromString(phoneNumber, 'IS') @@ -11,6 +12,7 @@ export const dataSchema = z.object({ type: z.array(z.enum(['car', 'trailer', 'motorcycle'])).nonempty(), approveExternalData: z.boolean().refine((v) => v), jurisdiction: z.string().min(1), + pickup: z.enum([Pickup.POST, Pickup.DISTRICT]).optional(), healthDeclaration: z.object({ usesContactGlasses: z.enum([YES, NO]), hasReducedPeripheralVision: z.enum([YES, NO]), diff --git a/libs/application/templates/driving-license/src/lib/drivingLicenseTemplate.ts b/libs/application/templates/driving-license/src/lib/drivingLicenseTemplate.ts index 18798f2828ba..007f965010fc 100644 --- a/libs/application/templates/driving-license/src/lib/drivingLicenseTemplate.ts +++ b/libs/application/templates/driving-license/src/lib/drivingLicenseTemplate.ts @@ -33,7 +33,6 @@ import { B_FULL, B_FULL_RENEWAL_65, ApiActions, - Pickup, CHARGE_ITEM_CODES, DELIVERY_FEE, } from './constants' @@ -46,6 +45,7 @@ import { m } from './messages' import { hasCompletedPrerequisitesStep } from './utils' import { GlassesCheckApi, SyslumadurPaymentCatalogApi } from '../dataProviders' import { buildPaymentState } from '@island.is/application/utils' +import { Pickup } from './types' const getCodes = (application: Application) => { const applicationFor = getValueViaPath< diff --git a/libs/application/templates/driving-license/src/lib/types.ts b/libs/application/templates/driving-license/src/lib/types.ts index 9c5d92b9a323..0bb3ffcbe046 100644 --- a/libs/application/templates/driving-license/src/lib/types.ts +++ b/libs/application/templates/driving-license/src/lib/types.ts @@ -6,6 +6,11 @@ export type HasQualityPhotoData = { } } +export enum Pickup { + 'POST' = 'post', + 'DISTRICT' = 'district', +} + export type ConditionFn = (answer: FormValue) => boolean export type DrivingLicenseCategory = { diff --git a/libs/clients/driving-license/src/lib/drivingLicenseApi.service.ts b/libs/clients/driving-license/src/lib/drivingLicenseApi.service.ts index 0f2d17f8df81..6e6d940afc59 100644 --- a/libs/clients/driving-license/src/lib/drivingLicenseApi.service.ts +++ b/libs/clients/driving-license/src/lib/drivingLicenseApi.service.ts @@ -509,12 +509,16 @@ export class DrivingLicenseApi { return handledResponse.success } - async postRenewLicenseOver65(params: { auth: string }) { + async postRenewLicenseOver65(params: { + input: v5.PostRenewal65AndOver + auth: string + }) { return await this.v5.apiDrivinglicenseV5ApplicationsRenewal65Post({ apiVersion: v5.DRIVING_LICENSE_API_VERSION_V5, apiVersion2: v5.DRIVING_LICENSE_API_VERSION_V5, jwttoken: params.auth, postRenewal65AndOver: { + ...params.input, renewalDate: new Date(), userId: v5.DRIVING_LICENSE_API_USER_ID, }, diff --git a/libs/clients/driving-license/src/v5/clientConfig.json b/libs/clients/driving-license/src/v5/clientConfig.json index 3bd7edd48d20..d9d616742eda 100644 --- a/libs/clients/driving-license/src/v5/clientConfig.json +++ b/libs/clients/driving-license/src/v5/clientConfig.json @@ -3649,6 +3649,16 @@ "type": "string", "description": "Healt certificate", "nullable": true + }, + "pickupPlasticAtDistrict": { + "type": "boolean", + "description": "Will person pick plastic up at district", + "nullable": true + }, + "sendPlasticToPerson": { + "type": "boolean", + "description": "Person requests plastic to be sent to him", + "nullable": true } }, "additionalProperties": false,