protected virtual IEnumerable duplicates() { var currentSetup = Base.Caches[typeof(CRSetup)].Current as CRSetup; if (currentSetup == null) { yield break; } var possibleDuplicates = dbView.SelectMulti(); foreach (PXResult rec in possibleDuplicates) { CRGrams gram = rec.GetItem <CRGrams>(); CRDuplicateGrams duplicateGram = rec.GetItem <CRDuplicateGrams>(); DuplicateContact duplicateContact = rec.GetItem <DuplicateContact>(); Standalone.CRLead duplicateLead = rec.GetItem <Standalone.CRLead>(); var dupRecord = new CRDuplicateRecord() { ContactID = gram.EntityID, ValidationType = gram.ValidationType, DuplicateContactID = duplicateGram.EntityID, Score = gram.Score, DuplicateContactType = duplicateContact?.ContactType, DuplicateBAccountID = duplicateContact?.BAccountID, DuplicateRefContactID = duplicateLead?.RefContactID, }; CRDuplicateRecord cached = (CRDuplicateRecord)Base.Caches[typeof(CRDuplicateRecord)].Locate(dupRecord); if (cached == null) { Base.Caches[typeof(CRDuplicateRecord)].Hold(dupRecord); dupRecord.Selected = false; } else { dupRecord.Selected = cached.Selected; } yield return(new PXResult <CRDuplicateRecord, Contact, DuplicateContact, BAccountR>( dupRecord, rec.GetItem <Contact>(), duplicateContact, rec.GetItem <BAccountR>())); } }
public IEnumerable GetRecords() { PXCache sourceCache = _Graph.Caches[SourceEntityID.DeclaringType]; var currentEntity = PXView.Currents?.FirstOrDefault() ?? sourceCache.Current; if (currentEntity == null) { yield break; } int?currentID = (int?)sourceCache.GetValue(currentEntity, SourceEntityID.Name); foreach (PXResult rec in View.SelectMulti(currentID)) { CRGrams gram = rec.GetItem <CRGrams>(); CRDuplicateGrams duplicateGram = rec.GetItem <CRDuplicateGrams>(); BAccountR duplicateAccount = rec.GetItem <BAccountR>(); CRLead duplicateLead = rec.GetItem <CRLead>(); var dupRecord = new CRDuplicateRecord() { ContactID = gram.EntityID, ValidationType = gram.ValidationType, DuplicateContactID = duplicateGram.EntityID, Score = gram.Score, DuplicateContactType = ContactTypesAttribute.BAccountProperty, DuplicateBAccountID = duplicateAccount?.BAccountID, DuplicateRefContactID = duplicateLead?.RefContactID, }; CRDuplicateRecord cached = (CRDuplicateRecord)_Graph.Caches[typeof(CRDuplicateRecord)].Locate(dupRecord); if (cached?.Selected == true || duplicateAccount.DefContactID == currentID) { yield return(duplicateAccount); } } }
// copy-paste from base internal IEnumerable DoCreateGramms(DuplicateDocument document) { var main = graph.Caches[typeof(DuplicateDocument)].GetMain(document); string[] types = document.ContactType == ContactTypesAttribute.BAccountProperty ? AccountTypes : ContactTypes; foreach (string validationType in types) { PXCache cache = graph.Caches[main.GetType()]; PXCache lCache = graph.Caches[typeof(Location)]; Location defLocation = null; if (document.BAccountID != null) { BAccount bAccount = PXSelect <BAccount, Where <BAccount.bAccountID, Equal <Required <Contact.bAccountID> > > > .Select(graph, document.BAccountID); if (bAccount != null && bAccount.DefLocationID != null) { defLocation = PXSelect <Location, Where <Location.bAccountID, Equal <Required <Location.bAccountID> >, And <Location.locationID, Equal <Required <BAccount.defLocationID> > > > > .Select(graph, bAccount.BAccountID, bAccount.DefLocationID); } } string type = validationType; decimal total = 0, totalZero = 0; foreach (var rule in Definition.TypeRules[type]) { if (type == ValidationTypesAttribute.Account && defLocation != null) { if (lCache.GetValue(defLocation, rule.MatchingField) == null && cache.GetValue(main, rule.MatchingField) == null) { totalZero += rule.ScoreWeight.GetValueOrDefault(); } else { total += rule.ScoreWeight.GetValueOrDefault(); } } else { if (cache.GetValue(main, rule.MatchingField) == null) { totalZero += rule.ScoreWeight.GetValueOrDefault(); } else { total += rule.ScoreWeight.GetValueOrDefault(); } } } if (total == 0) { continue; } foreach (CRValidationRules rule in Definition.TypeRules[type]) { string fieldName = rule.MatchingField; string transformRule = rule.TransformationRule; Decimal sw = rule.ScoreWeight ?? 0; if (sw == 0) { continue; } if (sw > 0 && totalZero > 0) { sw += totalZero * (sw / total); } var value = cache.GetValue(main, fieldName); if (type == ValidationTypesAttribute.Account && value == null) { value = lCache.GetValue(defLocation, fieldName); } if (value == null) { continue; } if (transformRule.Equals(TransformationRulesAttribute.SplitWords)) { int?id = document.ContactID; value = value.ToString().ToLower(); string[] words = value.ToString().Split(); foreach (string word in words) { Decimal score = Decimal.Round(sw / words.Length, 4); if (score <= 0) { continue; } CRGrams gram = new CRGrams { EntityID = id, ValidationType = validationType, FieldName = fieldName, FieldValue = word, Score = score }; yield return(gram); } } else { value = value.ToString().ToLower(); if (transformRule.Equals(TransformationRulesAttribute.DomainName)) { if (value.ToString().Contains('@')) { value = value.ToString().Split('@')[1]; } else { try { value = new UriBuilder(value.ToString()).Host; if (value.ToString().Split('.')[0].Equals("www")) { value = value.ToString().Substring(value.ToString().IndexOf('.') + 1); } } catch (UriFormatException) { //Do nothing } } } CRGrams gram = new CRGrams { FieldValue = value.ToString(), EntityID = document.ContactID, ValidationType = validationType, FieldName = fieldName, Score = Decimal.Round(sw, 4) }; yield return(gram); } } } }