validateMrzLine function

OcrMrzValidation validateMrzLine({
  1. required String line1,
  2. required String line2,
  3. required String code,
  4. required OcrMrzSetting setting,
  5. required List<String> otherLines,
  6. required String firstName,
  7. required String lastName,
  8. required String country,
  9. required String nationality,
  10. required String personalNumber,
  11. required List<NameValidationData>? nameValidations,
})

Implementation

OcrMrzValidation validateMrzLine({
  required String line1,
  required String line2,
  required String code,
  required OcrMrzSetting setting,
  required List<String> otherLines,
  required String firstName,
  required String lastName,
  required String country,
  required String nationality,
  required String personalNumber,
  required List<NameValidationData>? nameValidations,
}) {
  OcrMrzValidation validation = OcrMrzValidation();
  try {
    validation.linesLengthValid = (line2.length == 44 && line1.length == 44);

    String docCode = code;
    bool isDocCodeValid = DocumentCodeHelper.isValid(docCode);
    validation.docCodeValid = isDocCodeValid;


    String docNumber = line2.substring(0, 9);
    String docCheck = line2[9];
    bool isDocNumberValid = _computeMrzCheckDigit(docNumber) == docCheck;
    validation.docNumberValid = isDocNumberValid;

    String birthDate = line2.substring(13, 19);
    String birthCheck = line2[19];
    bool isBirthDateValid = (RegExp(r'^\d{6}$').hasMatch(birthDate) && _computeMrzCheckDigit(birthDate) == birthCheck);
    validation.birthDateValid = isBirthDateValid;

    String expiryDate = line2.substring(21, 27);
    String expiryCheck = line2[27];
    bool isExpiryDateValid = (RegExp(r'^\d{6}$').hasMatch(expiryDate) && _computeMrzCheckDigit(expiryDate) == expiryCheck);
    validation.expiryDateValid = isExpiryDateValid;

    // String personalNumber = personalNumber;
    String personalCheck = line2[42];
    final isPersonalValid = personalNumber.replaceAll('<', '').isEmpty
        ? (personalCheck == '0' || personalCheck == '<')
        : (_computeMrzCheckDigit(personalNumber) == personalCheck);
    validation.personalNumberValid = isPersonalValid;


    String finalCheck = line2[43];
    bool isFinalCheckValid = _computeMrzCheckDigit(docNumber + docCheck + birthDate + birthCheck + expiryDate + expiryCheck + personalNumber + personalCheck) == finalCheck;
    validation.finalCheckValid = isFinalCheckValid;

    bool validNames = validateNames(firstName, lastName, otherLines);
    bool isNamesValid = validNames;
    validation.nameValid = isNamesValid;
    if(!isNamesValid && nameValidations!=null){
      if(nameValidations.any((a)=>a.firstName.toLowerCase() == firstName.toLowerCase() && a.lastName.toLowerCase()==lastName.toLowerCase())){
        isNamesValid = true;
        validation.nameValid = true;
      }
    }


    bool validCountry = isValidMrzCountry(country);
    bool isValidCountry = validCountry;
    validation.countryValid = isValidCountry;

    bool validNationality = isValidMrzCountry(nationality);
    bool isValidNationality = validNationality;
    validation.nationalityValid = isValidNationality;

    return validation;
  } catch (e) {
    return validation;
  }
}