validateNames method

(bool, String, MrzName) validateNames(
  1. Iterable<String> lines,
  2. OcrMrzSetting setting,
  3. List<NameValidationData> names
)

Implementation

(bool, String, MrzName) validateNames(Iterable<String> lines, OcrMrzSetting setting, List<NameValidationData> names) {
  if (setting.nameValidationMode == NameValidationMode.none) {
    return (true, 'none', this);
  } else if (setting.nameValidationMode == NameValidationMode.exact) {
    if (names.isNotEmpty) {
      final nameValidation = names.firstWhereOrNull((a) => noKcomparison(a, firstname: firstName, lastname: lastName));

      if (nameValidation != null) {
        MrzName fixed = nameValidation.toMrzName();
        return (true, 'exact provided_list', fixed);
      } else {
        final similarName = findMostSimilarByNameData(names, firstname: firstName, lastname: lastName);
        if (similarName != null) {
          MrzName fixed = similarName.toMrzName();
          return (true, 'similar provided_list', fixed);
        }
      }
    }

    List<String> words = [];
    for (var l in lines) {
      words.addAll(extractWords(l).map((a) => a.toLowerCase()));
    }
    final isFirstNameValid = firstName.trim().isEmpty || firstName.toLowerCase().split(" ").every((a) => words.contains(a.toLowerCase()));
    final isLastNameValid = lastName.trim().isEmpty || lastName.toLowerCase().split(" ").every((a) => words.contains(a.toLowerCase()));

    final res = isLastNameValid && isFirstNameValid;
    if (res) {
      return (true, 'ocr_lines', this);
    }

    // final nameValidation = name.any((a)=>"${a.firstName} ${a.lastName} ${a.middleName??''}".toUpperCase().split(" ").contains(firstName.toUpperCase()) || "${a.firstName} ${a.lastName} ${a.middleName??''}".toUpperCase().split(" ").contains(lastName.toUpperCase()));

    return (false, 'failed', this);
  } else {
    List<String> words = [];
    for (var l in lines) {
      words.addAll(extractWords(l).map((a) => a.toLowerCase()));
    }
    final isFirstNameValid = firstName.trim().isEmpty || firstName.toLowerCase().split(" ").every((a) => words.any((b) => b.contains(a.toLowerCase())));
    final isLastNameValid = lastName.trim().isEmpty || lastName.toLowerCase().split(" ").every((a) => words.any((b) => b.contains(a.toLowerCase())));
    final res = isLastNameValid && isFirstNameValid;
    if (res) {
      return (true, 'ocr_lines', this);
    }

    final nameValidation = names.any(
      (a) =>
          "${a.firstName} ${a.lastName} ${a.middleName ?? ''}".toUpperCase().split(" ").any((b) => firstName.split(" ").every((fn)=>b.contains(fn.toUpperCase()))) ||
          "${a.firstName} ${a.lastName} ${a.middleName ?? ''}".toUpperCase().split(" ").any((b) => lastName.split(" ").every((ln)=>b.contains(ln.toUpperCase()))),
    );
    if (nameValidation) {
      return (true, 'provided_list', this);
    }else{
      if (names.isNotEmpty) {
        final nameValidation = names.firstWhereOrNull((a) => noKcomparisonContain(a, firstname: firstName, lastname: lastName));

        if (nameValidation != null) {
          MrzName fixed = nameValidation.toMrzName();
          return (true, 'contain provided_list', fixed);
        } else {
          final similarName = findMostSimilarByNameData(names, firstname: firstName, lastname: lastName);
          if (similarName != null) {
            MrzName fixed = similarName.toMrzName();
            return (true, 'contain similar provided_list', fixed);
          }
        }
      }

    }

    return (false, 'failed', this);
  }
}