@dvsa/smc-encounter-schema
Version:
Schemas required for Encounter submission as well as custom validators ## Developing ### Pre-requisites
1 lines • 16.3 kB
JavaScript
'use strict';var classTransformer=require('class-transformer'),classValidator=require('class-validator');var Q=Object.defineProperty;var nr=Object.getOwnPropertyDescriptor;var t=(o,e)=>Q(o,"name",{value:e,configurable:true});var r=(o,e,i,l)=>{for(var g=l>1?void 0:l?nr(e,i):e,h=o.length-1,C;h>=0;h--)(C=o[h])&&(g=(l?C(e,i,g):C(g))||g);return l&&g&&Q(e,i,g),g};var v=class o{static{t(this,"CurrentEncounterLevel");}static instance;level;officerType;requestType;constructor(){this.level=1,this.officerType="ANY",this.requestType="C";}static getInstance(){return o.instance||(o.instance=new o),o.instance}getEncounterType(){return this.level}setEncounterType(e){this.level=e;}getExaminerOfficerType(){return this.officerType}setExaminerOfficerType(e){this.officerType=e;}getRequestType(){return this.requestType}setRequestType(e){this.requestType=e;}isDeletedEncounter(){return this.requestType==="D"}};var U=class{validate(e,i){let l=i.constraints[0],g=v.getInstance(),h=g.getEncounterType(),C=g.getExaminerOfficerType();return l.level===0||l.exceptions?.includes(h)||l.level!==void 0&&l.level>h||l.roles?.length&&!l.roles.includes(C)&&!l.roles.includes("ANY")?true:e==null?false:typeof e=="string"?l.allowEmpty?true:e.trim().length>0:Array.isArray(e)?e.length===0?false:e.every((J,Cr)=>J==null?false:Object.entries(J).every(([Rr,j])=>typeof j=="string"?j.trim().length>0:j!=null)):true}};t(U,"MandatoryFieldConstraint"),U=r([classValidator.ValidatorConstraint({name:"MandatoryField",async:false})],U);function n(o,e){return (i,l)=>{classValidator.registerDecorator({name:"MandatoryField",target:i.constructor,propertyName:l,constraints:[o],options:e,validator:U});}}t(n,"MandatoryField");var _=class{validate(e,i){return e==null?true:/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(e)}defaultMessage(e){return `${e.property} must match format YYYY-MM-DD HH:mm:ss`}};t(_,"UKDateFormatValidator"),_=r([classValidator.ValidatorConstraint({name:"ValidateUKDateFormat",async:false})],_);function A(o){return (e,i)=>{classValidator.registerDecorator({name:"ValidateUKDateFormat",target:e.constructor,propertyName:i,options:o,validator:_});}}t(A,"ValidateUKDateFormat");var b=class{validate(e,i){let l=i.object,g=/(^[A-Za-z9]{5}\d[0156]\d([0][1-9]|[12]\d|3[01])\d[A-Za-z9]{2}\d[A-Za-z]{2}$)|(^[0-9]{8}$)/,C=l?.nationality?.irlCode?.toUpperCase();return (C==="GB"||C==="UK")&&l?.licenceIssueNo!=null&&e!=null?g.test(e):true}defaultMessage(){return "Driver licence number for GB/UK does not match the expected format."}};t(b,"IsValidLicenceNumberForUKConstraint"),b=r([classValidator.ValidatorConstraint({name:"IsValidLicenceNumberForUK",async:false})],b);function G(o){return (e,i)=>{classValidator.registerDecorator({target:e.constructor,propertyName:i,options:o,validator:b});}}t(G,"IsValidLicenceNumberForUK");function F(o){return (e,i)=>{classValidator.registerDecorator({name:"isNullableString",target:e.constructor,propertyName:i,options:o,validator:{validate(l,g){return l===null||typeof l=="string"},defaultMessage(l){return `${l.property} must be a string or null`}}});}}t(F,"IsNullableString");function N(){return classTransformer.Transform(({value:o})=>typeof o=="string"?o.toUpperCase():o)}t(N,"ToUpperCase");var O=class{static{t(this,"CommonPostAddress");}postTown;postcode};r([classValidator.Matches(/^(?!-|\s)(?!.*[&‘’',.-]{2})[A-Za-z0-9&‘’',. -]{0,20}$/,{message:"Must match pattern",groups:["createEncounter"]}),classValidator.MaxLength(20,{message:"Must be no more than 20 characters in length",groups:["createEncounter"]}),N(),n({level:4},{groups:["createEncounter"]})],O.prototype,"postTown",2),r([classValidator.IsOptional(),classValidator.Matches(/^[A-Za-z0-9 -]*$/,{message:"Must match pattern",groups:["createEncounter"]}),classValidator.MaxLength(8,{message:"Must be no more than 8 characters in length",groups:["createEncounter"]}),N()],O.prototype,"postcode",2);var T=class T extends O{static{t(this,"Address");}static REG_EX_ADDRESS_LINE=/^(?!-|\\s)(?!.*[&‘’',.-]{2})[A-Za-z0-9&‘’',. -]{0,60}$/;addressLine1;addressLine2;addressLine3;addressLine4;ukResident};r([classValidator.Matches(T.REG_EX_ADDRESS_LINE,{message:"Must match pattern",groups:["createEncounter"]}),classValidator.MaxLength(60,{message:"Must be no more than 60 characters in length",groups:["createEncounter"]}),N(),n({level:4},{groups:["createEncounter"]})],T.prototype,"addressLine1",2),r([classValidator.IsOptional(),classValidator.Matches(T.REG_EX_ADDRESS_LINE,{message:"Must match pattern",groups:["createEncounter"]}),classValidator.MaxLength(60,{message:"Must be no more than 60 characters in length",groups:["createEncounter"]}),N()],T.prototype,"addressLine2",2),r([classValidator.IsOptional(),classValidator.Matches(T.REG_EX_ADDRESS_LINE,{message:"Must match pattern",groups:["createEncounter"]}),classValidator.MaxLength(60,{message:"Must be no more than 60 characters in length",groups:["createEncounter"]}),N()],T.prototype,"addressLine3",2),r([classValidator.IsOptional(),classValidator.Matches(T.REG_EX_ADDRESS_LINE,{message:"Must match pattern",groups:["createEncounter"]}),classValidator.MaxLength(60,{message:"Must be no more than 60 characters in length",groups:["createEncounter"]}),N()],T.prototype,"addressLine4",2),r([classValidator.IsOptional(),N()],T.prototype,"ukResident",2);var H=T;var a=class{static{t(this,"Nationality");}drivingLicenceAuthority;irlCountry;vehicleIndicator;cardIssuingAuthorityInd;intelligenceSubjectInd;intRegNumberCode;nonVosa;irlCode;deletionMarker;foreignOpNationalityInd;inrNationalityInd};r([n({level:4},{groups:["createEncounter"]})],a.prototype,"drivingLicenceAuthority",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"irlCountry",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"vehicleIndicator",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"cardIssuingAuthorityInd",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"intelligenceSubjectInd",2),r([classValidator.IsOptional()],a.prototype,"intRegNumberCode",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"nonVosa",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"irlCode",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"deletionMarker",2),r([n({level:4},{groups:["createEncounter"]})],a.prototype,"foreignOpNationalityInd",2),r([classValidator.IsOptional()],a.prototype,"inrNationalityInd",2);function tr(o){return (e,i)=>{classValidator.registerDecorator({name:"isNullableNumber",target:e.constructor,propertyName:i,options:o,validator:{validate(l,g){return l===null||typeof l=="number"},defaultMessage(l){return `${l.property} must be a number or null`}}});}}t(tr,"IsNullableNumber");var m=class extends O{static{t(this,"RteArea");}code;areaDescription;address1;address2;address3;address4;email;enforcementArea};r([classValidator.IsOptional()],m.prototype,"code",2),r([classValidator.IsOptional()],m.prototype,"areaDescription",2),r([classValidator.IsOptional()],m.prototype,"address1",2),r([classValidator.IsOptional()],m.prototype,"address2",2),r([classValidator.IsOptional()],m.prototype,"address3",2),r([classValidator.IsOptional()],m.prototype,"address4",2),r([classValidator.IsOptional()],m.prototype,"email",2),r([classValidator.IsOptional()],m.prototype,"enforcementArea",2);var E=class{static{t(this,"GenericContact");}manager;costCentre;csiGeneratedNumber;userId;firstName;surname;email;rarCode;status;gvtsMarker;examinerType;ehrEmployeeId;workTelephone;mobileTelephone;version;rteArea};r([classValidator.IsOptional()],E.prototype,"manager",2),r([classValidator.IsOptional()],E.prototype,"costCentre",2),r([classValidator.IsOptional()],E.prototype,"csiGeneratedNumber",2),r([classValidator.IsOptional()],E.prototype,"userId",2),r([classValidator.IsOptional()],E.prototype,"firstName",2),r([classValidator.IsOptional()],E.prototype,"surname",2),r([classValidator.IsOptional()],E.prototype,"email",2),r([tr()],E.prototype,"rarCode",2),r([F()],E.prototype,"status",2),r([F()],E.prototype,"gvtsMarker",2),r([classValidator.IsOptional()],E.prototype,"examinerType",2),r([classValidator.IsOptional()],E.prototype,"ehrEmployeeId",2),r([classValidator.IsOptional()],E.prototype,"workTelephone",2),r([classValidator.IsOptional()],E.prototype,"mobileTelephone",2),r([F()],E.prototype,"version",2),r([classValidator.ValidateIf((e,i)=>i!=null),classValidator.ValidateNested(),classTransformer.Type(()=>m)],E.prototype,"rteArea",2);var f=class{static{t(this,"PaymentReversalReason");}code;description;sequenceNum;deletionMarker;usageInd};r([classValidator.IsOptional()],f.prototype,"code",2),r([classValidator.IsOptional()],f.prototype,"description",2),r([classValidator.IsOptional()],f.prototype,"sequenceNum",2),r([classValidator.IsOptional()],f.prototype,"deletionMarker",2),r([classValidator.IsOptional()],f.prototype,"usageInd",2);var c=class{static{t(this,"PaymentStatus");}code;description;sequenceNum;deletionMarker;cashFlag;callCentreFlag;chequeFlag};r([classValidator.IsOptional()],c.prototype,"description",2),r([classValidator.IsOptional()],c.prototype,"sequenceNum",2),r([classValidator.IsOptional()],c.prototype,"deletionMarker",2),r([classValidator.IsOptional()],c.prototype,"cashFlag",2),r([classValidator.IsOptional()],c.prototype,"callCentreFlag",2),r([classValidator.IsOptional()],c.prototype,"chequeFlag",2);var p=class{static{t(this,"ActualPayment");}paymentDate;inputDate;amount;paymentMethod;sortCode;chequeNumber;reversalDate;recorder;reverser;pvrCode;clientGuid;callCentreReference;paymentStatus};r([A({groups:["createEncounter"]})],p.prototype,"paymentDate",2),r([A({groups:["createEncounter"]})],p.prototype,"inputDate",2),r([classValidator.IsOptional()],p.prototype,"sortCode",2),r([classValidator.IsOptional()],p.prototype,"chequeNumber",2),r([classValidator.IsOptional(),A({groups:["createEncounter"]})],p.prototype,"reversalDate",2),r([classValidator.ValidateIf((e,i)=>i!=null),classValidator.ValidateNested(),classTransformer.Type(()=>E)],p.prototype,"recorder",2),r([classValidator.ValidateIf((e,i)=>i!=null),classValidator.ValidateNested(),classTransformer.Type(()=>E)],p.prototype,"reverser",2),r([classValidator.ValidateIf((e,i)=>i!=null),classValidator.ValidateNested(),classTransformer.Type(()=>f)],p.prototype,"pvrCode",2),r([classValidator.IsOptional()],p.prototype,"clientGuid",2),r([classValidator.IsOptional()],p.prototype,"callCentreReference",2),r([classValidator.ValidateIf((e,i)=>i!=null),classValidator.ValidateNested(),classTransformer.Type(()=>c)],p.prototype,"paymentStatus",2);var y=class{static{t(this,"DetailsOrigin");}driverDetailsOriginCode;originDescription;deletionMarker};r([n({level:4},{groups:["createEncounter"]})],y.prototype,"driverDetailsOriginCode",2),r([n({level:4},{groups:["createEncounter"]})],y.prototype,"originDescription",2),r([n({level:4},{groups:["createEncounter"]})],y.prototype,"deletionMarker",2);var Z=class{static{t(this,"LicenceCategory");}categoryCode;deletionMarker};r([n({level:4},{groups:["createEncounter"]})],Z.prototype,"categoryCode",2),r([n({level:4},{groups:["createEncounter"]})],Z.prototype,"deletionMarker",2);var x=class{static{t(this,"LicenceType");}licenceTypeCode;licenceTypeDescription;deletionMarker};r([n({level:4},{groups:["createEncounter"]})],x.prototype,"licenceTypeCode",2),r([n({level:4},{groups:["createEncounter"]})],x.prototype,"licenceTypeDescription",2),r([n({level:4},{groups:["createEncounter"]})],x.prototype,"deletionMarker",2);var s=class{static{t(this,"Drivers");}detailsOnNotice;partOfEncounter;theSourceDriverType;driverOnNotice;birthPlace;dateOfBirth;forename;surname;lastUpdate;licenceIssueNo;registeredKeeper;address;phoneNumber;detailsOrigin;nationality;licenceType;licenceCategory;sex;driverType;amount;passportNumber;occupation;driverLicNum;documentPath;linkedNoticeId;driverCardNumber;drivingLicenceStatus;drivingLicenceIssueDate;odrExhibitNumber;generatedNumber;agencyDriver;actualPayments};r([n({level:4},{groups:["createEncounter"]})],s.prototype,"detailsOnNotice",2),r([n({level:4},{groups:["createEncounter"]})],s.prototype,"partOfEncounter",2),r([n({level:4},{groups:["createEncounter"]})],s.prototype,"theSourceDriverType",2),r([classValidator.IsOptional()],s.prototype,"driverOnNotice",2),r([classValidator.IsOptional(),classValidator.MaxLength(35,{groups:["createEncounter"]}),classValidator.Matches(/^(?!-|\\s)(?!.*[‘’',.-]{2})[A-Za-z‘’',. -]*$/,{message:"Birth Place must consist of characters A-Z, hyphen, full-stop or apostrophe",groups:["createEncounter"]})],s.prototype,"birthPlace",2),r([A({groups:["createEncounter"]}),n({level:4,exceptions:[2]},{groups:["createEncounter"]})],s.prototype,"dateOfBirth",2),r([classValidator.MaxLength(35,{groups:["createEncounter"]}),classValidator.Matches(/^(?!-|\\s)(?!.*[‘’',.-]{2})[A-Za-z‘’',. -]*$/,{message:"forename must consist of characters space, A-Z, hyphen or apostrophe.",groups:["createEncounter"]}),n({level:4},{groups:["createEncounter"]})],s.prototype,"forename",2),r([classValidator.MaxLength(35,{groups:["createEncounter"]}),classValidator.Matches(/^(?!-|\\s)(?!.*[‘’',.-]{2})[A-Za-z‘’',. -]*$/,{message:"surname must consist of characters space, A-Z, hyphen or apostrophe.",groups:["createEncounter"]}),n({level:4},{groups:["createEncounter"]})],s.prototype,"surname",2),r([A({groups:["createEncounter"]}),n({level:4},{groups:["createEncounter"]})],s.prototype,"lastUpdate",2),r([classValidator.IsOptional(),classValidator.Matches(/^(?:[0-9]|[1-9][0-9]{1,3}|[12][0-9]{4}|30000)$/,{message:"licenceIssueNo must be a numeric string between 0 and 30000",groups:["createEncounter"]})],s.prototype,"licenceIssueNo",2),r([classValidator.IsOptional()],s.prototype,"registeredKeeper",2),r([classValidator.ValidateIf(()=>v.getInstance().getExaminerOfficerType()==="TRAFFIC"),classValidator.ValidateNested(),classTransformer.Type(()=>H),n({roles:["TRAFFIC"]},{groups:["createEncounter"]})],s.prototype,"address",2),r([classValidator.IsOptional(),classValidator.MaxLength(35,{groups:["createEncounter"]}),classValidator.Matches(/\d{0,35}| {0,35}/,{groups:["createEncounter"]})],s.prototype,"phoneNumber",2),r([classValidator.ValidateNested(),classTransformer.Type(()=>y),n({level:4},{groups:["createEncounter"]})],s.prototype,"detailsOrigin",2),r([classValidator.IsOptional(),classValidator.ValidateNested(),classTransformer.Type(()=>a)],s.prototype,"nationality",2),r([classValidator.IsOptional(),classValidator.ValidateNested(),classTransformer.Type(()=>x)],s.prototype,"licenceType",2),r([classValidator.IsOptional(),classValidator.ValidateNested(),classTransformer.Type(()=>Z)],s.prototype,"licenceCategory",2),r([n({level:4},{groups:["createEncounter"]})],s.prototype,"sex",2),r([n({level:4},{groups:["createEncounter"]})],s.prototype,"driverType",2),r([classTransformer.Transform(({value:e})=>e!==null?Number.parseInt(e,10):null),n({level:4},{groups:["createEncounter"]})],s.prototype,"amount",2),r([classValidator.IsOptional(),classValidator.MaxLength(12,{groups:["createEncounter"]}),classValidator.Matches(/^[a-zA-Z0-9]*$/,{message:"PassportNumber must consist of characters space, A-Z or 0-9.",groups:["createEncounter"]})],s.prototype,"passportNumber",2),r([classValidator.IsOptional(),classValidator.MaxLength(50,{groups:["createEncounter"]})],s.prototype,"occupation",2),r([classValidator.IsOptional(),classValidator.MaxLength(16,{groups:["createEncounter"]}),classValidator.Matches(/^(?!-|\\s)(?!.*[&‘’\\',.()\/-]{2})[A-Za-z0-9 &‘’\\',.()\/-]*$/,{groups:["createEncounter"]}),G({groups:["createEncounter"]})],s.prototype,"driverLicNum",2),r([classValidator.IsOptional()],s.prototype,"documentPath",2),r([classValidator.IsOptional()],s.prototype,"linkedNoticeId",2),r([classValidator.IsOptional()],s.prototype,"driverCardNumber",2),r([classValidator.IsOptional()],s.prototype,"drivingLicenceStatus",2),r([F(),A({groups:["createEncounter"]})],s.prototype,"drivingLicenceIssueDate",2),r([classValidator.IsOptional()],s.prototype,"odrExhibitNumber",2),r([classValidator.IsOptional()],s.prototype,"generatedNumber",2),r([classValidator.IsOptional()],s.prototype,"agencyDriver",2),r([classValidator.IsOptional(),classValidator.ValidateNested({each:true}),classTransformer.Type(()=>p)],s.prototype,"actualPayments",2);exports.Drivers=s;