feat: add formatter
This commit is contained in:
parent
d79d77cb87
commit
c59d163a54
1 changed files with 70 additions and 48 deletions
118
src/utils/mrz.ts
118
src/utils/mrz.ts
|
|
@ -5,7 +5,14 @@ type MRZ = {
|
||||||
zone: string[];
|
zone: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
const FIELD_LIST = {
|
type Field = { field: string; format?: (value: string) => string };
|
||||||
|
type FieldList = Record<string, Field>;
|
||||||
|
|
||||||
|
const DEFAULT_FIELD = {
|
||||||
|
documentType: { field: 'doc_type' },
|
||||||
|
documentSubType: { field: 'doc_subtype' },
|
||||||
|
documentNo: { field: 'doc_number' },
|
||||||
|
documentNoCheck: { field: 'doc_number_check' },
|
||||||
name: {
|
name: {
|
||||||
field: 'full_name',
|
field: 'full_name',
|
||||||
format: (value: string) => value.replace(/0/, 'O'),
|
format: (value: string) => value.replace(/0/, 'O'),
|
||||||
|
|
@ -14,63 +21,76 @@ const FIELD_LIST = {
|
||||||
field: 'country',
|
field: 'country',
|
||||||
format: (value: string) => value.replace(/0/, 'O'),
|
format: (value: string) => value.replace(/0/, 'O'),
|
||||||
},
|
},
|
||||||
|
nationality: {
|
||||||
|
field: 'country',
|
||||||
|
format: (value: string) => value.replace(/0/, 'O'),
|
||||||
|
},
|
||||||
|
gender: { field: 'sex' },
|
||||||
birthDate: {
|
birthDate: {
|
||||||
field: 'birth_date',
|
field: 'birth_date',
|
||||||
format: (value: string) => moment(value, 'YYMMDD').format('YYYY-MM-DD'),
|
format: (value: string) => moment(value, 'YYMMDD').format('YYYY-MM-DD'),
|
||||||
},
|
},
|
||||||
|
birthDateCheck: { field: 'birth_date_check' },
|
||||||
expireDate: {
|
expireDate: {
|
||||||
field: 'expire_date',
|
field: 'expire_date',
|
||||||
format: (value: string) => moment(value, 'YYMMDD').format('YYYY-MM-DD'),
|
format: (value: string) => moment(value, 'YYMMDD').format('YYYY-MM-DD'),
|
||||||
},
|
},
|
||||||
};
|
expireDateCheck: { field: 'expire_date_check' },
|
||||||
|
optionalData: {
|
||||||
|
field: 'optional_data',
|
||||||
|
format: (value: string) => moment(value, 'YYMMDD').format('YYYY-MM-DD'),
|
||||||
|
},
|
||||||
|
optionalDataCheck: { field: 'optional_data_check' },
|
||||||
|
lineCheck: { field: 'line_check' },
|
||||||
|
} satisfies FieldList;
|
||||||
|
|
||||||
const MRZ_TD_1 = [
|
const MRZ_TD_1 = [
|
||||||
new RegExp(
|
new RegExp(
|
||||||
[
|
[
|
||||||
`(?<doc_type>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.documentType.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<doc_subtype>[A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.documentSubType.field}>[A-Z<]{1})`,
|
||||||
`(?<${FIELD_LIST.country.field}>[0-9A-Z<]{3})`,
|
`(?<${DEFAULT_FIELD.country.field}>[0-9A-Z<]{3})`,
|
||||||
`(?<doc_number>[0-9A-Z<]{9})`,
|
`(?<${DEFAULT_FIELD.documentNo.field}>[0-9A-Z<]{9})`,
|
||||||
`(?<doc_number_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.documentNoCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<optional_data>[0-9A-Z<]{15})`,
|
`(?<${DEFAULT_FIELD.optionalData.field}>[0-9A-Z<]{15})`,
|
||||||
].join(''),
|
].join(''),
|
||||||
),
|
),
|
||||||
new RegExp(
|
new RegExp(
|
||||||
[
|
[
|
||||||
`(?<${FIELD_LIST.birthDate.field}>[0-9A-Z<]{6})`,
|
`(?<${DEFAULT_FIELD.birthDate.field}>[0-9A-Z<]{6})`,
|
||||||
`(?<birth_date_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.birthDateCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<sex>[mfMF<]{1})`,
|
`(?<${DEFAULT_FIELD.gender.field}>[mfMF<]{1})`,
|
||||||
`(?<${FIELD_LIST.expireDate.field}>[0-9A-Z<]{6})`,
|
`(?<${DEFAULT_FIELD.expireDate.field}>[0-9A-Z<]{6})`,
|
||||||
`(?<expire_date_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.expireDateCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<nationality>[0-9A-Z<]{3})`,
|
`(?<${DEFAULT_FIELD.nationality.field}>[0-9A-Z<]{3})`,
|
||||||
`(?<optional_data>[A-Z0-9<]{11})`,
|
`(?<${DEFAULT_FIELD.optionalData.field}>[A-Z0-9<]{11})`,
|
||||||
`(?<line_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.lineCheck.field}>[0-9A-Z<]{1})`,
|
||||||
].join(''),
|
].join(''),
|
||||||
),
|
),
|
||||||
new RegExp([`(?<${FIELD_LIST.name.field}>[A-Z<]{30})`].join('')),
|
new RegExp([`(?<${DEFAULT_FIELD.name.field}>[A-Z<]{30})`].join('')),
|
||||||
];
|
];
|
||||||
const MRZ_TD_2 = [
|
const MRZ_TD_2 = [
|
||||||
new RegExp(
|
new RegExp(
|
||||||
[
|
[
|
||||||
`(?<doc_type>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.documentType.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<doc_subtype>[A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.documentSubType.field}>[A-Z<]{1})`,
|
||||||
`(?<${FIELD_LIST.country.field}>[0-9A-Z<]{3})`,
|
`(?<${DEFAULT_FIELD.country.field}>[0-9A-Z<]{3})`,
|
||||||
`(?<${FIELD_LIST.name.field}>[A-Z<]{31})`,
|
`(?<${DEFAULT_FIELD.name.field}>[A-Z<]{31})`,
|
||||||
].join(''),
|
].join(''),
|
||||||
),
|
),
|
||||||
|
|
||||||
new RegExp(
|
new RegExp(
|
||||||
[
|
[
|
||||||
`(?<doc_number>[0-9A-Z<]{9})`,
|
`(?<${DEFAULT_FIELD.documentNo.field}>[0-9A-Z<]{9})`,
|
||||||
`(?<doc_numbercheck>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.documentNoCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<nationality>[0-9A-Z<]{3})`,
|
`(?<${DEFAULT_FIELD.nationality.field}>[0-9A-Z<]{3})`,
|
||||||
`(?<${FIELD_LIST.birthDate.field}>[0-9A-Z<]{6})`,
|
`(?<${DEFAULT_FIELD.birthDate.field}>[0-9A-Z<]{6})`,
|
||||||
`(?<birth_date_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.birthDateCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<sex>[mfMF]{1})`,
|
`(?<${DEFAULT_FIELD.gender.field}>[mfMF]{1})`,
|
||||||
`(?<${FIELD_LIST.expireDate.field}>[0-9A-Z<]{6})`,
|
`(?<${DEFAULT_FIELD.expireDate.field}>[0-9A-Z<]{6})`,
|
||||||
`(?<expire_date_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.expireDateCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<optional_data>[A-Z0-9<]{7})`,
|
`(?<${DEFAULT_FIELD.optionalData.field}>[A-Z0-9<]{7})`,
|
||||||
`(?<line_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.lineCheck.field}>[0-9A-Z<]{1})`,
|
||||||
].join(''),
|
].join(''),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
@ -78,26 +98,26 @@ const MRZ_TD_2 = [
|
||||||
const MRZ_TD_3 = [
|
const MRZ_TD_3 = [
|
||||||
new RegExp(
|
new RegExp(
|
||||||
[
|
[
|
||||||
`(?<doc_type>[A-Z0-9<]{1})`,
|
`(?<${DEFAULT_FIELD.documentType.field}>[A-Z0-9<]{1})`,
|
||||||
`(?<doc_subtype>[A-Z0-9<]{1})`,
|
`(?<${DEFAULT_FIELD.documentSubType.field}>[A-Z0-9<]{1})`,
|
||||||
`(?<${FIELD_LIST.country.field}>[0-9A-Z<]{3})`,
|
`(?<${DEFAULT_FIELD.country.field}>[0-9A-Z<]{3})`,
|
||||||
`(?<${FIELD_LIST.name.field}>[A-Z0-9<]{39})`,
|
`(?<${DEFAULT_FIELD.name.field}>[A-Z0-9<]{39})`,
|
||||||
].join(''),
|
].join(''),
|
||||||
),
|
),
|
||||||
|
|
||||||
new RegExp(
|
new RegExp(
|
||||||
[
|
[
|
||||||
`(?<doc_number>[0-9A-Z<]{9})`,
|
`(?<${DEFAULT_FIELD.documentNo.field}>[0-9A-Z<]{9})`,
|
||||||
`(?<doc_number_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.documentNoCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<nationality>[0-9A-Z<]{3})`,
|
`(?<${DEFAULT_FIELD.nationality.field}>[0-9A-Z<]{3})`,
|
||||||
`(?<${FIELD_LIST.birthDate.field}>[0-9A-Z<]{6})`,
|
`(?<${DEFAULT_FIELD.birthDate.field}>[0-9A-Z<]{6})`,
|
||||||
`(?<birth_date_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.birthDateCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<sex>[mfMF<]{1})`,
|
`(?<${DEFAULT_FIELD.gender.field}>[mfMF<]{1})`,
|
||||||
`(?<${FIELD_LIST.expireDate.field}>[0-9A-Z<]{6})`,
|
`(?<${DEFAULT_FIELD.expireDate.field}>[0-9A-Z<]{6})`,
|
||||||
`(?<expire_date_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.expireDateCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<optional_data>[A-Z0-9<]{14})`,
|
`(?<${DEFAULT_FIELD.optionalData.field}>[A-Z0-9<]{14})`,
|
||||||
`(?<optional_data_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.optionalDataCheck.field}>[0-9A-Z<]{1})`,
|
||||||
`(?<line_check>[0-9A-Z<]{1})`,
|
`(?<${DEFAULT_FIELD.lineCheck.field}>[0-9A-Z<]{1})`,
|
||||||
].join(''),
|
].join(''),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
@ -110,8 +130,10 @@ function mrzCleanResult(obj: Record<string, string>) {
|
||||||
.trim();
|
.trim();
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const value of Object.values(FIELD_LIST)) {
|
for (const value of Object.values(DEFAULT_FIELD)) {
|
||||||
if (obj[value.field]) obj[value.field] = value.format(obj[value.field]);
|
if (obj[value.field] && 'format' in value) {
|
||||||
|
obj[value.field] = value.format(obj[value.field]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue