13 internal static class KycInvalidation
17 if (process is
null || review is
null)
19 IEnumerable<string> invalidClaims = review.InvalidClaims ?? Array.Empty<
string>();
20 if (!invalidClaims.Any() && !(review.
InvalidPhotos?.Any() ??
false))
22 HashSet<string> invalidSet =
new(invalidClaims, StringComparer.OrdinalIgnoreCase);
23 Dictionary<string, string> reasons = BuildInvalidReasonsByMapping(review, fallbackReason);
28 if (IsInvalid(Field, invalidSet))
29 Apply(Field, reasons, fallbackReason);
35 if (IsInvalid(Field, invalidSet))
36 Apply(Field, reasons, fallbackReason);
44 return Field.
Mappings.Any(m => InvalidSet.Contains(m.Key) || IsGroupedDateMatch(m.Key, InvalidSet));
47 private static void Apply(
ObservableKycField Field, Dictionary<string, string> Reasons,
string? Fallback)
49 Field.IsValid =
false;
50 string?
Reason = Field.
Mappings.Select(m => Reasons.TryGetValue(m.Key, out
string? R) ? R :
null).FirstOrDefault(r => r is not
null);
51 Field.ValidationText = !
string.IsNullOrWhiteSpace(Reason) ?
Reason : (Fallback ??
string.Empty);
54 private static Dictionary<string, string> BuildInvalidReasonsByMapping(
ApplicationReview Review,
string? Fallback)
56 Dictionary<string, string> Map =
new(StringComparer.OrdinalIgnoreCase);
59 if (Detail is
null ||
string.IsNullOrWhiteSpace(Detail.
Claim))
61 string Key = Detail.
Claim.Trim();
62 string Reason =
string.IsNullOrWhiteSpace(Detail.
Reason) ? Fallback ?? string.Empty : Detail.
Reason;
65 if (Key.StartsWith(
"ORGREP", StringComparison.OrdinalIgnoreCase)) Map[
"ORGREPBDATE"] = Reason;
71 string Key =
string.IsNullOrWhiteSpace(Detail.
DisplayName) ? (Detail.FileName ??
string.Empty) : Detail.
DisplayName;
72 if (
string.IsNullOrWhiteSpace(Key))
74 string Reason =
string.IsNullOrWhiteSpace(Detail.
Reason) ? Fallback ?? string.Empty : Detail.
Reason;
80 private static bool IsGroupedDateMatch(
string MappingKey, ISet<string> InvalidSet)
84 if (MappingKey.StartsWith(
"ORGREP", StringComparison.OrdinalIgnoreCase))
85 return InvalidSet.Contains(
"ORGREPBDATE") || InvalidSet.Contains(
"ORGREPBDAY") || InvalidSet.Contains(
"ORGREPBMONTH") || InvalidSet.Contains(
"ORGREPBYEAR");
Custom XMPP Protocol Properties.
const string BirthDate
Full birthday
XMPP Protocol Properties.
const string BirthYear
Birth Year
const string BirthDay
Birth Day
const string BirthMonth
Birth Month
A set of never changing property constants and helpful values.
Contains additional data about an invalid claim.
string Claim
The claim identifier.
string Reason
The textual reason explaining the invalidation.
Captures the result of an application review returned from backend services.
ApplicationReviewPhotoDetail[] InvalidPhotoDetails
Optional details about invalid photos.
string[] InvalidPhotos
Invalid photo identifiers reported by the service.
ApplicationReviewClaimDetail[] InvalidClaimDetails
Optional details about invalid claims.
Contains additional data about an invalid photo.
string Reason
Textual reason for the invalidation.
string DisplayName
Display name presented to users.
Represents a page in a KYC process containing fields and sections.
ObservableCollection< KycSection > AllSections
Gets all sections contained in the page.
ObservableCollection< ObservableKycField > AllFields
Gets all fields directly contained in the page (excluding sections).
Represents a parsed KYC process with pages, fields, and current values.
ObservableCollection< KycPage > Pages
Gets the collection of pages in the KYC process.
The base KYC field model. Use as-is for generic fields, or subclass for custom logic.
ObservableCollection< KycMapping > Mappings
Mappings to apply output.
Reason
Reason a token is not valid.