diff --git a/src/models/adr-certificate-details.ts b/src/models/adr-certificate-details.ts new file mode 100644 index 00000000..bad6f370 --- /dev/null +++ b/src/models/adr-certificate-details.ts @@ -0,0 +1,49 @@ +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; + +// define AdrCertificateDetails' high-level attributes data types +export interface AdrCertificateDetails { + adrPassCertificateDetails?: AdrPassCertificateDetails; +} + +// define Enums +export type certificateIdEnum = + | "PASS" + | "REPLACEMENT"; + +// define AdrCertificateDetails' sub-attributes data types +export type AdrPassCertificateDetails = AdrPassCertificateDetailsItems[]; + +export interface AdrPassCertificateDetailsItems { + createdByName?: string; + certificateType?: string; + generatedTimestamp?: string; + certificateId?: string; + } + +// function to parse AdrCertificateDetails' high-level and sub attributes + return AdrCertificateDetails object +export const parseAdrCertificateDetails = ( + certificateDetails?: DynamoDbImage + ): Maybe => { + if (!certificateDetails) { + return undefined; + } + + const adrPassCertificateDetailsImage: DynamoDbImage = certificateDetails.getList( + "adrPassCertificateDetails" + )!; + const adrPassCertificateDetails: AdrPassCertificateDetails = []; + + for (const key of adrPassCertificateDetailsImage.getKeys()) { + const adrPassCertificateDetailsItemImage = adrPassCertificateDetailsImage.getMap(key)!; + adrPassCertificateDetails.push({ + createdByName: adrPassCertificateDetailsItemImage.getString("createdByName"), + certificateType: adrPassCertificateDetailsItemImage.getString("certificateType"), + generatedTimestamp: adrPassCertificateDetailsItemImage.getString("generatedTimestamp"), + certificateId: adrPassCertificateDetailsItemImage.getString("certificateId") as certificateIdEnum, + }); + } + return { + adrPassCertificateDetails + }; +}; diff --git a/src/models/adr-details.ts b/src/models/adr-details.ts index 7767feea..36db7db8 100644 --- a/src/models/adr-details.ts +++ b/src/models/adr-details.ts @@ -1,6 +1,7 @@ import { DynamoDbImage, parseStringArray } from "../services/dynamodb-images"; import { Maybe } from "./optionals"; +// define AdrDetails' high-level attributes data types export interface AdrDetails { vehicleDetails?: VehicleDetails; listStatementApplicable?: boolean; @@ -9,24 +10,101 @@ export interface AdrDetails { brakeDeclarationsSeen?: boolean; brakeDeclarationIssuer?: string; brakeEndurance?: boolean; - weight?: string; - compatibilityGroupJ?: boolean; + weight?: number; + newCertificateRequested?: boolean; + compatibilityGroupJ?: compatibilityGroupJEnum; documents?: string[]; - permittedDangerousGoods?: string[]; - additionalExaminerNotes?: string; + permittedDangerousGoods?: permittedDangerousGoodsEnum[]; + additionalExaminerNotes?: AdditionalExaminerNotes; applicantDetails?: ApplicantDetails; - memosApply?: string[]; + dangerousGoods?: boolean; + memosApply?: memosApplyEnum[]; + m145Statement?: boolean; additionalNotes?: AdditionalNotes; adrTypeApprovalNo?: string; adrCertificateNotes?: string; tank?: Tank; } +// define Enums +export type VehicleDetailsTypeEnum = + | "Artic tractor" + | "Rigid box body" + | "Rigid sheeted load" + | "Rigid tank" + | "Rigid skeletal" + | "Rigid battery" + | "Full drawbar box body" + | "Full drawbar sheeted load" + | "Full drawbar tank" + | "Full drawbar skeletal" + | "Full drawbar battery" + | "Centre axle box body" + | "Centre axle sheeted load" + | "Centre axle tank" + | "Centre axle skeletal" + | "Centre axle battery" + | "Semi trailer box body" + | "Semi trailer sheeted load" + | "Semi trailer tank" + | "Semi trailer skeletal" + | "Semi trailer battery"; + +export type Tc2TypeEnum = "initial"; + +export type Tc3TypeEnum = + | "intermediate" + | "periodic" + | "exceptional"; + +export type permittedDangerousGoodsEnum = + | "FP <61 (FL)" + | "AT" + | "Class 5.1 Hydrogen Peroxide (OX)" + | "MEMU" + | "Carbon Disulphide" + | "Hydrogen" + | "Explosives (type 2)" + | "Explosives (type 3)"; + +export type compatibilityGroupJEnum = + | "I" + | "E"; + +export type additionalNotesNumberEnum = + | "1" + | "1A" + | "2" + | "3" + | "V1B" + | "T1B"; + +// export type additionalNotesguidanceNotesEnum = "New certificate requested" | "M145 Statement" + +export type substancesPermittedEnum = + | "Substances permitted under the tank code and any special provisions specified in 9 may be carried" + | "Substances (Class UN number and if necessary packing group and proper shipping name) may be carried"; + +export type memosApplyEnum = "07/09 3mth leak ext "; + +export type tankStatementSelectEnum = + | "Statement" + | "Product list"; + +// define AdrDetails' sub-attributes data types export interface VehicleDetails { - type?: string; + type?: VehicleDetailsTypeEnum; approvalDate?: string; } +export type AdditionalExaminerNotes = AdditionalExaminerNotesItems[]; + +export interface AdditionalExaminerNotesItems { + note?: string; + createdAtDate?: string; + lastUpdatedBy?: string; +} + export interface ApplicantDetails { name?: string; street?: string; @@ -36,8 +114,8 @@ export interface ApplicantDetails { } export interface AdditionalNotes { - number?: string[]; - guidanceNotes?: string[]; + number?: additionalNotesNumberEnum[]; + // guidanceNotes?: additionalNotesguidanceNotesEnum[]; } export interface Tank { @@ -57,7 +135,8 @@ export interface TankDetails { } export interface TankStatement { - substancesPermitted?: string; + select?: tankStatementSelectEnum; + substancesPermitted?: substancesPermittedEnum; statement?: string; productListRefNo?: string; productListUnNo?: string[]; @@ -65,23 +144,21 @@ export interface TankStatement { } export interface Tc2Details { - tc2Type?: Tc2Type; + tc2Type?: Tc2TypeEnum; tc2IntermediateApprovalNo?: string; tc2IntermediateExpiryDate?: string; } -export type Tc2Type = "initial"; export type Tc3Details = Tc3DetailsItem[]; export interface Tc3DetailsItem { - tc3Type?: Tc3Type; + tc3Type?: Tc3TypeEnum; tc3PeriodicNumber?: string; tc3PeriodicExpiryDate?: string; } -export type Tc3Type = "intermediate" | "periodic" | "exceptional"; - +// function to parse AdrDetails' high-level and sub attributes + return AdrDetails object export const parseAdrDetails = ( adrDetails?: DynamoDbImage ): Maybe => { @@ -93,10 +170,10 @@ export const parseAdrDetails = ( "additionalNotes" )!; const additionalNotes: AdditionalNotes = { - number: parseStringArray(additionalNotesImage.getList("number")), - guidanceNotes: parseStringArray( - additionalNotesImage.getList("guidanceNotes") - ), + number: parseStringArray(additionalNotesImage.getList("number")) as additionalNotesNumberEnum[], + // guidanceNotes: parseStringArray( + // additionalNotesImage.getList("guidanceNotes") + // ) as additionalNotesguidanceNotesEnum[], }; const applicantDetailsImage: DynamoDbImage = adrDetails.getMap( @@ -114,7 +191,7 @@ export const parseAdrDetails = ( "vehicleDetails" )!; const vehicleDetails: VehicleDetails = { - type: vehicleDetailsImage.getString("type"), + type: vehicleDetailsImage.getString("type") as VehicleDetailsTypeEnum, approvalDate: vehicleDetailsImage.getString("approvalDate"), }; @@ -124,7 +201,7 @@ export const parseAdrDetails = ( const tc2DetailsImage: DynamoDbImage = tankDetailsImage.getMap("tc2Details")!; const tc2Details: Tc2Details = { - tc2Type: tc2DetailsImage.getString("tc2Type") as Tc2Type, + tc2Type: tc2DetailsImage.getString("tc2Type") as Tc2TypeEnum, tc2IntermediateApprovalNo: tc2DetailsImage.getString( "tc2IntermediateApprovalNo" ), @@ -141,7 +218,7 @@ export const parseAdrDetails = ( for (const key of tc3DetailsImage.getKeys()) { const tc3DetailsItemImage = tc3DetailsImage.getMap(key)!; tc3Details.push({ - tc3Type: tc3DetailsItemImage.getString("tc3Type") as Tc3Type, + tc3Type: tc3DetailsItemImage.getString("tc3Type") as Tc3TypeEnum, tc3PeriodicNumber: tc3DetailsItemImage.getString("tc3PeriodicNumber"), tc3PeriodicExpiryDate: tc3DetailsItemImage.getString( "tc3PeriodicExpiryDate" @@ -151,7 +228,7 @@ export const parseAdrDetails = ( const tankDetails: TankDetails = { tankManufacturer: tankDetailsImage.getString("tankManufacturer"), - yearOfManufacture: 0, + yearOfManufacture: tankDetailsImage.getNumber("yearOfManufacture"), tankCode: tankDetailsImage.getString("tankCode"), specialProvisions: tankDetailsImage.getString("specialProvisions"), tankManufacturerSerialNo: tankDetailsImage.getString( @@ -164,7 +241,8 @@ export const parseAdrDetails = ( const tankStatementImage: DynamoDbImage = tankImage.getMap("tankStatement")!; const tankStatement: TankStatement = { - substancesPermitted: tankStatementImage.getString("substancesPermitted"), + substancesPermitted: tankStatementImage.getString("substancesPermitted") as substancesPermittedEnum, + select: tankStatementImage.getString("select") as tankStatementSelectEnum, statement: tankStatementImage.getString("statement"), productListRefNo: tankStatementImage.getString("productListRefNo"), productListUnNo: parseStringArray( @@ -178,6 +256,22 @@ export const parseAdrDetails = ( tankStatement, }; + + const additionalExaminerNotesImage: DynamoDbImage = adrDetails.getList( + "additionalExaminerNotes" + )!; + const additionalExaminerNotes: AdditionalExaminerNotes = []; + + for (const key of additionalExaminerNotesImage.getKeys()) { + const additionalExaminerNotesItemImage = additionalExaminerNotesImage.getMap(key)!; + additionalExaminerNotes.push({ + note: additionalExaminerNotesItemImage.getString("note"), + createdAtDate: additionalExaminerNotesItemImage.getString("createdAtDate"), + lastUpdatedBy: additionalExaminerNotesItemImage.getString("lastUpdatedBy"), + }); + } + + return { vehicleDetails, listStatementApplicable: adrDetails.getBoolean("listStatementApplicable"), @@ -186,15 +280,18 @@ export const parseAdrDetails = ( brakeDeclarationsSeen: adrDetails.getBoolean("brakeDeclarationsSeen"), brakeDeclarationIssuer: adrDetails.getString("brakeDeclarationIssuer"), brakeEndurance: adrDetails.getBoolean("brakeEndurance"), - weight: adrDetails.getString("weight"), - compatibilityGroupJ: adrDetails.getBoolean("compatibilityGroupJ"), + weight: adrDetails.getNumber("weight"), + newCertificateRequested: adrDetails.getBoolean("newCertificateRequested"), + compatibilityGroupJ: adrDetails.getString("compatibilityGroupJ") as compatibilityGroupJEnum, documents: parseStringArray(adrDetails.getList("documents")), permittedDangerousGoods: parseStringArray( adrDetails.getList("permittedDangerousGoods") - ), - additionalExaminerNotes: adrDetails.getString("additionalExaminerNotes"), + ) as permittedDangerousGoodsEnum[], + additionalExaminerNotes, applicantDetails, - memosApply: parseStringArray(adrDetails.getList("memosApply")), + dangerousGoods: adrDetails.getBoolean("dangerousGoods"), + memosApply: parseStringArray(adrDetails.getList("memosApply")) as memosApplyEnum[], + m145Statement: adrDetails.getBoolean("m145Statement"), additionalNotes, adrTypeApprovalNo: adrDetails.getString("adrTypeApprovalNo"), adrCertificateNotes: adrDetails.getString("adrCertificateNotes"), diff --git a/src/models/tech-record.ts b/src/models/tech-record.ts index 29aa1c06..063b73f2 100644 --- a/src/models/tech-record.ts +++ b/src/models/tech-record.ts @@ -14,7 +14,8 @@ import { Microfilm, parseMicrofilm } from "./microfilm"; import { parsePlates, Plates } from "./plates"; import { BodyType, parseBodyType } from "./body-type"; import { Dimensions, parseDimensions } from "./dimensions"; -import { AdrDetails } from "./adr-details"; +import { AdrDetails, parseAdrDetails } from "./adr-details"; +import { AdrCertificateDetails, parseAdrCertificateDetails } from "./adr-certificate-details"; import { parseVehicleClass, VehicleClass } from "./vehicle-class"; import { Brakes, parseBrakes } from "./brakes"; import { Axles, parseAxles } from "./axles"; @@ -114,6 +115,7 @@ export interface TechRecord { noOfAxles?: number; brakeCode?: string; adrDetails?: AdrDetails; + adrCertificateDetails?: AdrCertificateDetails; createdByName?: string; createdById?: string; lastUpdatedByName?: string; @@ -270,7 +272,8 @@ const parseTechRecord = (image: DynamoDbImage): TechRecord => { notes: image.getString("notes"), noOfAxles: image.getNumber("noOfAxles"), brakeCode: image.getString("brakeCode"), - adrDetails: undefined, // intentional - not implemented. parseAdrDetails(image.getMap("adrDetails")) + adrDetails: parseAdrDetails(image.getMap("adrDetails")), + adrCertificateDetails: parseAdrCertificateDetails(image.getMap("certificateDetails")), createdByName: image.getString("createdByName"), createdById: image.getString("createdById"), lastUpdatedByName: image.getString("lastUpdatedByName"), diff --git a/tests/resources/Dockerfile b/tests/resources/Dockerfile index b6d6a326..a6553155 100644 --- a/tests/resources/Dockerfile +++ b/tests/resources/Dockerfile @@ -1,5 +1,5 @@ # Match Aurora MySQL version as closely as possible -FROM mysql:5.7.12 +FROM mysql:8.0.32 ENV MYSQL_DATABASE=CVSBNOP \ MYSQL_ROOT_PASSWORD=12345 diff --git a/tests/resources/dynamodb-image-technical-record-with-adr.json b/tests/resources/dynamodb-image-technical-record-with-adr.json new file mode 100644 index 00000000..f1dcf717 --- /dev/null +++ b/tests/resources/dynamodb-image-technical-record-with-adr.json @@ -0,0 +1,851 @@ +{ + "systemNumber": { + "S": "SYSTEM-NUMBER-1" + }, + "partialVin": { + "S": "PARTIAL-VIN" + }, + "primaryVrm": { + "S": "VRM-1" + }, + "secondaryVrms": { + "L": [ + { + "S": "SECONDARY-VRM" + } + ] + }, + "vin": { + "S": "VIN-1" + }, + "trailerId": { + "S": "TRL-1" + }, + "techRecord": { + "L": [ + { + "M": { + "adrDetails": { + "M": { + "additionalExaminerNotes": { + "L": [ + { + "M": { + "note": { + "S": "additionalExaminerNotes_note_1" + }, + "createdAtDate": { + "S": "2023-05-30" + }, + "lastUpdatedBy": { + "S": "additionalExaminerNotes_lastUpdatedBy_1" + } + } + } + ] + }, + "additionalNotes": { + "M": { + "number": { + "L": [ + {"S": "1"}, + {"S": "T1B"} + ] + } + } + }, + "adrCertificateNotes": { + "S": "adrCertificateNotes_1" + }, + "adrTypeApprovalNo": { + "S": "adrTypeApprovalNo_1" + }, + "applicantDetails": { + "M": { + "name": { + "S": "adrDetails_applicantDetails_name_1" + }, + "street": { + "S": "adrDetails_applicantDetails_street_1" + }, + "town": { + "S": "adrDetails_applicantDetails_town_1" + }, + "city": { + "S": "adrDetails_applicantDetails_city_1" + }, + "postcode": { + "S": "adrDetails_applicantDetails_postcode_1" + } + } + }, + "batteryListNumber": { + "S": "batteryListNumber_1" + }, + "brakeDeclarationIssuer": { + "S": "brakeDeclarationIssuer_1" + }, + "brakeDeclarationsSeen": { + "BOOL": true + }, + "brakeEndurance": { + "BOOL": false + }, + "compatibilityGroupJ": { + "S": "I" + }, + "dangerousGoods": { + "BOOL": false + }, + "declarationsSeen": { + "BOOL": false + }, + "documents": { + "L": [ + { + "S": "documents_1" + }, + { + "S": "documents_2" + }, + { + "S": "documents_3" + } + ] + }, + "listStatementApplicable": { + "BOOL": true + }, + "m145Statement": { + "BOOL": true + }, + "newCertificateRequested": { + "BOOL": false + }, + + "memosApply": { + "L": [ + { + "S": "07/09 3mth leak ext" + } + ] + }, + "permittedDangerousGoods": { + "L": [ + { + "S": "FP <61 (FL)" + }, + { + "S": "Carbon Disulphide" + }, + { + "S": "Hydrogen" + } + ] + }, + "tank": { + "M": { + "tankDetails": { + "M": { + "tankManufacturer": { + "S": "tankManufacturer_1" + }, + "yearOfManufacture": { + "N": "1234" + }, + "tankCode": { + "S": "tankCode_1" + }, + "specialProvisions": { + "S": "specialProvisions_1" + }, + "tankManufacturerSerialNo": { + "S": "1234" + }, + "tankTypeAppNo": { + "S": "9876" + }, + "tc2Details": { + "M": { + "tc2Type": { + "S": "initial" + }, + "tc2IntermediateApprovalNo": { + "S": "12345" + }, + "tc2IntermediateExpiryDate": { + "S": "2024-06-01" + } + } + }, + "tc3Details": { + "L": [ + { + "M": { + "tc3Type": { + "S": "intermediate" + }, + "tc3PeriodicNumber": { + "S": "98765" + }, + "tc3PeriodicExpiryDate": { + "S": "2024-06-01" + } + } + } + ] + } + } + }, + "tankStatement": { + "M": { + "select":{ + "S": "Product list" + }, + "substancesPermitted": { + "S": "Substances permitted under the tank code and any special provisions specified in 9 may be carried" + }, + "statement": { + "S": "statement_1" + }, + "productListRefNo": { + "S": "123456" + }, + "productListUnNo": { + "L": [ + { + "S": "123123" + }, + { + "S": "987987" + }, + { + "S": "135790" + } + ] + }, + "productList": { + "S": "productList_1" + } + } + } + } + }, + "vehicleDetails": { + "M": { + "type": { + "S": "Artic tractor" + }, + "approvalDate": { + "S": "2023-06-12" + } + } + }, + "weight": { + "N": "6789" + } + } + }, + "recordCompleteness": { + "S": "88888888" + }, + "createdAt": { + "S": "2020-01-01T00:00:00.055Z" + }, + "lastUpdatedAt": { + "S": "2020-01-01T00:00:00.000000Z" + }, + "make": { + "S": "MAKE" + }, + "model": { + "S": "MODEL" + }, + "functionCode": { + "S": "1" + }, + "fuelPropulsionSystem": { + "S": "DieselPetrol" + }, + "offRoad": { + "BOOL": true + }, + "numberOfWheelsDriven": { + "N": "1" + }, + "euVehicleCategory": { + "S": "m1" + }, + "emissionsLimit": { + "N": "1" + }, + "departmentalVehicleMarker": { + "BOOL": true + }, + "authIntoService": { + "M": { + "cocIssueDate": { + "S": "2020-01-01" + }, + "dateAuthorised": { + "S": "2020-02-02" + }, + "datePending": { + "S": "2020-03-03" + }, + "dateReceived": { + "S": "2020-04-04" + }, + "dateRejected": { + "S": "2020-05-05" + } + } + }, + "lettersOfAuth": { + "M": { + "letterType": { + "S": "Trailer authorization" + }, + "letterDateRequested": { + "S": "2020-01-01" + }, + "letterContents": { + "S": "LETTER-CONTENTS" + } + } + }, + "alterationMarker": { + "BOOL": true + }, + "approvalType": { + "S": "NTA" + }, + "approvalTypeNumber": { + "S": "1" + }, + "variantNumber": { + "S": "1" + }, + "variantVersionNumber": { + "S": "1" + }, + "grossEecWeight": { + "N": "1" + }, + "trainEecWeight": { + "N": "1" + }, + "maxTrainEecWeight": { + "N": "1" + }, + "applicantDetails": { + "M": { + "name": { + "S": "NAME" + }, + "address1": { + "S": "ADDRESS-1" + }, + "address2": { + "S": "ADDRESS-2" + }, + "postTown": { + "S": "POST-TOWN" + }, + "address3": { + "S": "ADDRESS-3" + }, + "postCode": { + "S": "POST-CODE" + }, + "emailAddress": { + "S": "EMAIL-ADDRESS" + }, + "telephoneNumber": { + "S": "TELEPHONE-NUMBER" + } + } + }, + "purchaserDetails": { + "M": { + "name": { + "S": "NAME" + }, + "address1": { + "S": "ADDRESS-1" + }, + "address2": { + "S": "ADDRESS-2" + }, + "postTown": { + "S": "POST-TOWN" + }, + "address3": { + "S": "ADDRESS-3" + }, + "postCode": { + "S": "POST-CODE" + }, + "emailAddress": { + "S": "EMAIL-ADDRESS" + }, + "telephoneNumber": { + "S": "TELEPHONE-NUMBER" + }, + "faxNumber": { + "S": "FAX-NUMBER" + }, + "purchaserNotes": { + "S": "PURCHASER-NOTES" + } + } + }, + "manufacturerDetails": { + "M": { + "name": { + "S": "NAME" + }, + "address1": { + "S": "ADDRESS-1" + }, + "address2": { + "S": "ADDRESS-2" + }, + "postTown": { + "S": "POST-TOWN" + }, + "address3": { + "S": "ADDRESS-3" + }, + "postCode": { + "S": "POST-CODE" + }, + "emailAddress": { + "S": "EMAIL-ADDRESS" + }, + "telephoneNumber": { + "S": "TELEPHONE-NUMBER" + }, + "faxNumber": { + "S": "FAX-NUMBER" + }, + "manufacturerNotes": { + "S": "MANUFACTURER-NOTES" + } + } + }, + "microfilm": { + "M": { + "microfilmDocumentType": { + "S": "PSV Miscellaneous" + }, + "microfilmRollNumber": { + "S": "1" + }, + "microfilmSerialNumber": { + "S": "1" + } + } + }, + "plates": { + "L": [ + { + "M": { + "plateSerialNumber": { + "S": "1" + }, + "plateIssueDate": { + "S": "2020-01-01" + }, + "plateReasonForIssue": { + "S": "Free replacement" + }, + "plateIssuer": { + "S": "PLATE-ISSUER" + }, + "toEmailAddress": { + "S": "TO-EMAIL-ADDRESS" + } + } + } + ] + }, + "chassisMake": { + "S": "CHASSIS-MAKE" + }, + "chassisModel": { + "S": "CHASSIS-MODEL" + }, + "bodyMake": { + "S": "BODY-MAKE" + }, + "bodyModel": { + "S": "BODY-MODEL" + }, + "modelLiteral": { + "S": "MODEL-LITERAL" + }, + "bodyType": { + "M": { + "code": { + "S": "a" + }, + "description": { + "S": "articulated" + } + } + }, + "manufactureYear": { + "N": "2020" + }, + "regnDate": { + "S": "2020-01-01" + }, + "firstUseDate": { + "S": "2020-01-01" + }, + "coifDate": { + "S": "2020-01-01" + }, + "ntaNumber": { + "S": "NTA-NUMBER" + }, + "coifSerialNumber": { + "S": "88888888" + }, + "coifCertifierName": { + "S": "COIF-CERTIFIER-NAME" + }, + "conversionRefNo": { + "S": "1010101010" + }, + "seatsLowerDeck": { + "N": "1" + }, + "seatsUpperDeck": { + "N": "1" + }, + "standingCapacity": { + "N": "1" + }, + "speedRestriction": { + "N": "1" + }, + "speedLimiterMrk": { + "BOOL": true + }, + "tachoExemptMrk": { + "BOOL": true + }, + "dispensations": { + "S": "DISPENSATIONS" + }, + "remarks": { + "S": "REMARKS" + }, + "reasonForCreation": { + "S": "REASON-FOR-CREATION" + }, + "statusCode": { + "S": "STATUS-CODE" + }, + "unladenWeight": { + "N": "1" + }, + "grossKerbWeight": { + "N": "1" + }, + "grossLadenWeight": { + "N": "1" + }, + "grossGbWeight": { + "N": "1" + }, + "grossDesignWeight": { + "N": "1" + }, + "trainGbWeight": { + "N": "1" + }, + "trainDesignWeight": { + "N": "1" + }, + "maxTrainGbWeight": { + "N": "1" + }, + "maxTrainDesignWeight": { + "N": "1" + }, + "maxLoadOnCoupling": { + "N": "1" + }, + "frameDescription": { + "S": "Channel section" + }, + "tyreUseCode": { + "S": "22" + }, + "roadFriendly": { + "BOOL": true + }, + "drawbarCouplingFitted": { + "BOOL": true + }, + "euroStandard": { + "S": "euroStd" + }, + "suspensionType": { + "S": "1" + }, + "couplingType": { + "S": "1" + }, + "dimensions": { + "M": { + "axleSpacing": { + "L": [ + { + "M": { + "axles": { + "S": "1-2" + }, + "value": { + "N": "1" + } + } + } + ] + }, + "length": { + "N": "1" + }, + "height": { + "N": "1" + }, + "width": { + "N": "1" + } + } + }, + "frontAxleTo5thWheelMin": { + "N": "1" + }, + "frontAxleTo5thWheelMax": { + "N": "1" + }, + "frontVehicleTo5thWheelCouplingMin": { + "N": "1" + }, + "frontVehicleTo5thWheelCouplingMax": { + "N": "1" + }, + "frontAxleToRearAxle": { + "N": "1" + }, + "rearAxleToRearTrl": { + "N": "1" + }, + "couplingCenterToRearAxleMin": { + "N": "1" + }, + "couplingCenterToRearAxleMax": { + "N": "1" + }, + "couplingCenterToRearTrlMin": { + "N": "1" + }, + "couplingCenterToRearTrlMax": { + "N": "1" + }, + "centreOfRearmostAxleToRearOfTrl": { + "N": "1" + }, + "notes": { + "S": "NOTES" + }, + "noOfAxles": { + "N": "1" + }, + "brakeCode": { + "S": "1" + }, + "createdByName": { + "S": "CREATED-BY-NAME-2" + }, + "createdById": { + "S": "CREATED-BY-ID-2" + }, + "lastUpdatedByName": { + "S": "LAST-UPDATED-BY-NAME-2" + }, + "lastUpdatedById": { + "S": "LAST-UPDATED-BY-ID-2" + }, + "updateType": { + "S": "adrUpdate" + }, + "vehicleClass": { + "M": { + "code": { + "S": "2" + }, + "description": { + "S": "motorbikes over 200cc or with a sidecar" + } + } + }, + "vehicleSubclass": { + "L": [ + { + "S": "1" + } + ] + }, + "vehicleType": { + "S": "psv" + }, + "vehicleSize": { + "S": "small" + }, + "numberOfSeatbelts": { + "S": "NUMBER-OF-SEATBELTS" + }, + "seatbeltInstallationApprovalDate": { + "S": "2020-01-01" + }, + "vehicleConfiguration": { + "S": "rigid" + }, + "brakes": { + "M": { + "brakeCodeOriginal": { + "S": "333" + }, + "brakeCode": { + "S": "666666" + }, + "dataTrBrakeOne": { + "S": "DATA-TR-BRAKE-ONE" + }, + "dataTrBrakeTwo": { + "S": "DATA-TR-BRAKE-TWO" + }, + "dataTrBrakeThree": { + "S": "DATA-TR-BRAKE-THREE" + }, + "retarderBrakeOne": { + "S": "electric" + }, + "retarderBrakeTwo": { + "S": "electric" + }, + "dtpNumber": { + "S": "666666" + }, + "brakeForceWheelsNotLocked": { + "M": { + "serviceBrakeForceA": { + "N": "1" + }, + "secondaryBrakeForceA": { + "N": "1" + }, + "parkingBrakeForceA": { + "N": "1" + } + } + }, + "brakeForceWheelsUpToHalfLocked": { + "M": { + "serviceBrakeForceB": { + "N": "1" + }, + "secondaryBrakeForceB": { + "N": "1" + }, + "parkingBrakeForceB": { + "N": "1" + } + } + }, + "loadSensingValve": { + "BOOL": true + }, + "antilockBrakingSystem": { + "BOOL": true + } + } + }, + "axles": { + "L": [ + { + "M": { + "axleNumber": { + "N": "1" + }, + "parkingBrakeMrk": { + "BOOL": true + }, + "weights": { + "M": { + "kerbWeight": { + "N": "1" + }, + "ladenWeight": { + "N": "1" + }, + "gbWeight": { + "N": "1" + }, + "eecWeight": { + "N": "1" + }, + "designWeight": { + "N": "1" + } + } + }, + "tyres": { + "M": { + "tyreSize": { + "S": "TYRE-SIZE" + }, + "plyRating": { + "S": "22" + }, + "fitmentCode": { + "S": "double" + }, + "dataTrAxles": { + "N": "1" + }, + "speedCategorySymbol": { + "S": "a7" + }, + "tyreCode": { + "N": "1" + } + } + }, + "brakes": { + "M": { + "brakeActuator": { + "N": "1" + }, + "leverLength": { + "N": "1" + }, + "springBrakeParking": { + "BOOL": true + } + } + } + } + } + ] + } + } + } + ] + } +} diff --git a/tests/unit/models/tech-record-document.unitTest.ts b/tests/unit/models/tech-record-document.unitTest.ts index c6db6fd7..d610b884 100644 --- a/tests/unit/models/tech-record-document.unitTest.ts +++ b/tests/unit/models/tech-record-document.unitTest.ts @@ -3,11 +3,11 @@ import { TechRecordDocument, } from "../../../src/models/tech-record-document"; import { DynamoDbImage } from "../../../src/services/dynamodb-images"; -import { default as techRecordDocumentJson } from "../../resources/dynamodb-image-technical-record.json"; +import { default as techRecordDocumentJson } from "../../resources/dynamodb-image-technical-record-with-adr.json"; import { castToImageShape } from "../../utils"; describe("parseTechRecordDocument()", () => { - it("should successfully parse a DynamoDB image into a TechRecordDocument", () => { + it("should successfully parse a DynamoDB image with ADR into a TechRecordDocument", () => { const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); const techRecordDocument: TechRecordDocument = parseTechRecordDocument( @@ -52,9 +52,73 @@ describe("parseTechRecordDocument()", () => { "333" ); expect(techRecordDocument.techRecord![0].axles![0].axleNumber).toEqual(1); + + // ADR Details attributes + expect(techRecordDocument.techRecord![0].adrDetails?.additionalExaminerNotes![0].note).toEqual("additionalExaminerNotes_note_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.additionalExaminerNotes![0].createdAtDate).toEqual("2023-05-30"); + expect(techRecordDocument.techRecord![0].adrDetails?.additionalExaminerNotes![0].lastUpdatedBy).toEqual("additionalExaminerNotes_lastUpdatedBy_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.additionalNotes?.number![0]).toEqual("1"); + expect(techRecordDocument.techRecord![0].adrDetails?.additionalNotes?.number![1]).toEqual("T1B"); + + expect(techRecordDocument.techRecord![0].adrDetails?.adrCertificateNotes).toEqual("adrCertificateNotes_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.adrTypeApprovalNo).toEqual("adrTypeApprovalNo_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.applicantDetails?.name).toEqual("adrDetails_applicantDetails_name_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.batteryListNumber).toEqual("batteryListNumber_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.brakeDeclarationIssuer).toEqual("brakeDeclarationIssuer_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.brakeDeclarationsSeen).toEqual(true); + expect(techRecordDocument.techRecord![0].adrDetails?.brakeEndurance).toEqual(false); + expect(techRecordDocument.techRecord![0].adrDetails?.compatibilityGroupJ).toEqual("I"); + expect(techRecordDocument.techRecord![0].adrDetails?.dangerousGoods).toEqual(false); + expect(techRecordDocument.techRecord![0].adrDetails?.declarationsSeen).toEqual(false); + + expect(techRecordDocument.techRecord![0].adrDetails?.documents![0]).toEqual("documents_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.documents![1]).toEqual("documents_2"); + + expect(techRecordDocument.techRecord![0].adrDetails?.listStatementApplicable).toEqual(true); + expect(techRecordDocument.techRecord![0].adrDetails?.m145Statement).toEqual(true); + expect(techRecordDocument.techRecord![0].adrDetails?.newCertificateRequested).toEqual(false); + + expect(techRecordDocument.techRecord![0].adrDetails?.memosApply![0]).toEqual("07/09 3mth leak ext"); + + expect(techRecordDocument.techRecord![0].adrDetails?.permittedDangerousGoods![0]).toEqual("FP <61 (FL)"); + expect(techRecordDocument.techRecord![0].adrDetails?.permittedDangerousGoods![1]).toEqual("Carbon Disulphide"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankManufacturer).toEqual("tankManufacturer_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.yearOfManufacture).toEqual(1234); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankCode).toEqual("tankCode_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.specialProvisions).toEqual("specialProvisions_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankManufacturerSerialNo).toEqual("1234"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankTypeAppNo).toEqual("9876"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc2Details?.tc2Type).toEqual("initial"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc2Details?.tc2IntermediateApprovalNo).toEqual("12345"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc2Details?.tc2IntermediateExpiryDate).toEqual("2024-06-01"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc3Details![0].tc3Type).toEqual("intermediate"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc3Details![0].tc3PeriodicNumber).toEqual("98765"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc3Details![0].tc3PeriodicExpiryDate).toEqual("2024-06-01"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.select).toEqual("Product list"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.statement).toEqual("statement_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productListRefNo).toEqual("123456"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productList).toEqual("productList_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productListUnNo![0]).toEqual("123123"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productListUnNo![1]).toEqual("987987"); + + expect(techRecordDocument.techRecord![0].adrDetails?.vehicleDetails?.type).toEqual("Artic tractor"); + expect(techRecordDocument.techRecord![0].adrDetails?.vehicleDetails?.approvalDate).toEqual("2023-06-12"); + + expect(techRecordDocument.techRecord![0].adrDetails?.weight).toEqual(6789); + }); - it("should successfully parse a DynamoDB image, with no authIntoService, into a TechRecordDocument", () => { + it("should successfully parse a DynamoDB image, with ADR, with no authIntoService, into a TechRecordDocument", () => { // @ts-ignore delete techRecordDocumentJson.techRecord.L[0].M.authIntoService; const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); @@ -99,5 +163,69 @@ describe("parseTechRecordDocument()", () => { "333" ); expect(techRecordDocument.techRecord![0].axles![0].axleNumber).toEqual(1); + + // ADR Details attributes + expect(techRecordDocument.techRecord![0].adrDetails?.additionalExaminerNotes![0].note).toEqual("additionalExaminerNotes_note_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.additionalExaminerNotes![0].createdAtDate).toEqual("2023-05-30"); + expect(techRecordDocument.techRecord![0].adrDetails?.additionalExaminerNotes![0].lastUpdatedBy).toEqual("additionalExaminerNotes_lastUpdatedBy_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.additionalNotes?.number![0]).toEqual("1"); + expect(techRecordDocument.techRecord![0].adrDetails?.additionalNotes?.number![1]).toEqual("T1B"); + + expect(techRecordDocument.techRecord![0].adrDetails?.adrCertificateNotes).toEqual("adrCertificateNotes_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.adrTypeApprovalNo).toEqual("adrTypeApprovalNo_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.applicantDetails?.name).toEqual("adrDetails_applicantDetails_name_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.batteryListNumber).toEqual("batteryListNumber_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.brakeDeclarationIssuer).toEqual("brakeDeclarationIssuer_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.brakeDeclarationsSeen).toEqual(true); + expect(techRecordDocument.techRecord![0].adrDetails?.brakeEndurance).toEqual(false); + expect(techRecordDocument.techRecord![0].adrDetails?.compatibilityGroupJ).toEqual("I"); + expect(techRecordDocument.techRecord![0].adrDetails?.dangerousGoods).toEqual(false); + expect(techRecordDocument.techRecord![0].adrDetails?.declarationsSeen).toEqual(false); + + expect(techRecordDocument.techRecord![0].adrDetails?.documents![0]).toEqual("documents_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.documents![1]).toEqual("documents_2"); + + expect(techRecordDocument.techRecord![0].adrDetails?.listStatementApplicable).toEqual(true); + expect(techRecordDocument.techRecord![0].adrDetails?.m145Statement).toEqual(true); + expect(techRecordDocument.techRecord![0].adrDetails?.newCertificateRequested).toEqual(false); + + expect(techRecordDocument.techRecord![0].adrDetails?.memosApply![0]).toEqual("07/09 3mth leak ext"); + + expect(techRecordDocument.techRecord![0].adrDetails?.permittedDangerousGoods![0]).toEqual("FP <61 (FL)"); + expect(techRecordDocument.techRecord![0].adrDetails?.permittedDangerousGoods![1]).toEqual("Carbon Disulphide"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankManufacturer).toEqual("tankManufacturer_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.yearOfManufacture).toEqual(1234); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankCode).toEqual("tankCode_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.specialProvisions).toEqual("specialProvisions_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankManufacturerSerialNo).toEqual("1234"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tankTypeAppNo).toEqual("9876"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc2Details?.tc2Type).toEqual("initial"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc2Details?.tc2IntermediateApprovalNo).toEqual("12345"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc2Details?.tc2IntermediateExpiryDate).toEqual("2024-06-01"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc3Details![0].tc3Type).toEqual("intermediate"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc3Details![0].tc3PeriodicNumber).toEqual("98765"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankDetails?.tc3Details![0].tc3PeriodicExpiryDate).toEqual("2024-06-01"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.select).toEqual("Product list"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.statement).toEqual("statement_1"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productListRefNo).toEqual("123456"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productList).toEqual("productList_1"); + + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productListUnNo![0]).toEqual("123123"); + expect(techRecordDocument.techRecord![0].adrDetails?.tank?.tankStatement?.productListUnNo![1]).toEqual("987987"); + + expect(techRecordDocument.techRecord![0].adrDetails?.vehicleDetails?.type).toEqual("Artic tractor"); + expect(techRecordDocument.techRecord![0].adrDetails?.vehicleDetails?.approvalDate).toEqual("2023-06-12"); + + expect(techRecordDocument.techRecord![0].adrDetails?.weight).toEqual(6789); + }); });