Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
KycInvalidation.cs
1using System;
3using System.Linq;
7
9{
13 internal static class KycInvalidation
14 {
15 public static void ApplyInvalidations(KycProcess? process, ApplicationReview? review, string? fallbackReason)
16 {
17 if (process is null || review is null)
18 return;
19 IEnumerable<string> invalidClaims = review.InvalidClaims ?? Array.Empty<string>();
20 if (!invalidClaims.Any() && !(review.InvalidPhotos?.Any() ?? false))
21 return;
22 HashSet<string> invalidSet = new(invalidClaims, StringComparer.OrdinalIgnoreCase);
23 Dictionary<string, string> reasons = BuildInvalidReasonsByMapping(review, fallbackReason);
24 foreach (KycPage Page in process.Pages)
25 {
26 foreach (ObservableKycField Field in Page.AllFields)
27 {
28 if (IsInvalid(Field, invalidSet))
29 Apply(Field, reasons, fallbackReason);
30 }
31 foreach (KycSection Section in Page.AllSections)
32 {
33 foreach (ObservableKycField Field in Section.AllFields)
34 {
35 if (IsInvalid(Field, invalidSet))
36 Apply(Field, reasons, fallbackReason);
37 }
38 }
39 }
40 }
41
42 private static bool IsInvalid(ObservableKycField Field, HashSet<string> InvalidSet)
43 {
44 return Field.Mappings.Any(m => InvalidSet.Contains(m.Key) || IsGroupedDateMatch(m.Key, InvalidSet));
45 }
46
47 private static void Apply(ObservableKycField Field, Dictionary<string, string> Reasons, string? Fallback)
48 {
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);
52 }
53
54 private static Dictionary<string, string> BuildInvalidReasonsByMapping(ApplicationReview Review, string? Fallback)
55 {
56 Dictionary<string, string> Map = new(StringComparer.OrdinalIgnoreCase);
57 foreach (ApplicationReviewClaimDetail Detail in Review.InvalidClaimDetails ?? Array.Empty<ApplicationReviewClaimDetail>())
58 {
59 if (Detail is null || string.IsNullOrWhiteSpace(Detail.Claim))
60 continue;
61 string Key = Detail.Claim.Trim();
62 string Reason = string.IsNullOrWhiteSpace(Detail.Reason) ? Fallback ?? string.Empty : Detail.Reason;
63 Map[Key] = Reason;
64 if (Key.Equals(Constants.XmppProperties.BirthDay, StringComparison.OrdinalIgnoreCase) || Key.Equals(Constants.XmppProperties.BirthMonth, StringComparison.OrdinalIgnoreCase) || Key.Equals(Constants.XmppProperties.BirthYear, StringComparison.OrdinalIgnoreCase) || Key.Equals("BDATE", StringComparison.OrdinalIgnoreCase)) Map[Constants.CustomXmppProperties.BirthDate] = Reason;
65 if (Key.StartsWith("ORGREP", StringComparison.OrdinalIgnoreCase)) Map["ORGREPBDATE"] = Reason;
66 }
67 foreach (ApplicationReviewPhotoDetail Detail in Review.InvalidPhotoDetails ?? Array.Empty<ApplicationReviewPhotoDetail>())
68 {
69 if (Detail is null)
70 continue;
71 string Key = string.IsNullOrWhiteSpace(Detail.DisplayName) ? (Detail.FileName ?? string.Empty) : Detail.DisplayName;
72 if (string.IsNullOrWhiteSpace(Key))
73 continue;
74 string Reason = string.IsNullOrWhiteSpace(Detail.Reason) ? Fallback ?? string.Empty : Detail.Reason;
75 Map[Key.Trim()] = Reason;
76 }
77 return Map;
78 }
79
80 private static bool IsGroupedDateMatch(string MappingKey, ISet<string> InvalidSet)
81 {
82 if (MappingKey.Equals(Constants.XmppProperties.BirthDay, StringComparison.OrdinalIgnoreCase) || MappingKey.Equals(Constants.XmppProperties.BirthMonth, StringComparison.OrdinalIgnoreCase) || MappingKey.Equals(Constants.XmppProperties.BirthYear, StringComparison.OrdinalIgnoreCase))
83 return InvalidSet.Contains("BDATE") || InvalidSet.Contains(Constants.XmppProperties.BirthDay) || InvalidSet.Contains(Constants.XmppProperties.BirthMonth) || InvalidSet.Contains(Constants.XmppProperties.BirthYear);
84 if (MappingKey.StartsWith("ORGREP", StringComparison.OrdinalIgnoreCase))
85 return InvalidSet.Contains("ORGREPBDATE") || InvalidSet.Contains("ORGREPBDAY") || InvalidSet.Contains("ORGREPBMONTH") || InvalidSet.Contains("ORGREPBYEAR");
86 return false;
87 }
88 }
89}
Custom XMPP Protocol Properties.
Definition: Constants.cs:322
const string BirthYear
Birth Year
Definition: Constants.cs:454
const string BirthMonth
Birth Month
Definition: Constants.cs:449
A set of never changing property constants and helpful values.
Definition: Constants.cs:24
Contains additional data about an invalid claim.
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.
Represents a page in a KYC process containing fields and sections.
Definition: KycPage.cs:20
ObservableCollection< KycSection > AllSections
Gets all sections contained in the page.
Definition: KycPage.cs:64
ObservableCollection< ObservableKycField > AllFields
Gets all fields directly contained in the page (excluding sections).
Definition: KycPage.cs:51
Represents a parsed KYC process with pages, fields, and current values.
Definition: KycProcess.cs:11
ObservableCollection< KycPage > Pages
Gets the collection of pages in the KYC process.
Definition: KycProcess.cs:26
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.
Definition: JwtFactory.cs:15