コード例 #1
0
        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>()));
            }
        }
コード例 #2
0
ファイル: Attributes.cs プロジェクト: Vialythen/AcumaticaTest
        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);
                }
            }
        }
コード例 #3
0
        // 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);
                    }
                }
            }
        }