private static void ProcessValidation(PXGraph graph, Contact record, ValidationFilter Filter) { Type itemType = record.GetType(); PXCache cache = PXGraph.CreateInstance <PXGraph>().Caches[itemType]; Type graphType; object copy = cache.CreateCopy(record); PXPrimaryGraphAttribute.FindPrimaryGraph(cache, ref copy, out graphType); if (graphType == null) { throw new PXException(Messages.UnableToFindGraph); } graph = PXGraph.CreateInstance(graphType); graph.Views[graph.PrimaryView].Cache.Current = copy; CRDuplicateEntities <PXGraph, Contact> .RunActionWithAppliedAutomation( graph, copy, nameof(CRDuplicateEntities <PXGraph, Contact> .CheckForDuplicates)); DuplicateDocument document = graph.Caches[typeof(DuplicateDocument)].Current as DuplicateDocument; record.DuplicateStatus = document?.DuplicateStatus; record.DuplicateFound = document?.DuplicateFound; var maxScore = graph .Caches[typeof(CRDuplicateRecord)] .Cached .Cast <CRDuplicateRecord>() .Max(_ => _?.Score) ?? 0; if (record.DuplicateStatus == DuplicateStatusAttribute.PossibleDuplicated && record.ContactType == ContactTypesAttribute.Lead //&& record.Status == LeadStatusesAttribute.New && Filter.CloseNoActivityLeads == true && maxScore > Filter.CloseThreshold) { CRActivity activity = PXSelect <CRActivity, Where <CRActivity.refNoteID, Equal <Required <Contact.noteID> > > > .SelectWindowed(graph, 0, 1, record.NoteID); if (activity == null) { CRDuplicateEntities <PXGraph, Contact> .RunActionWithAppliedAutomation( graph, copy, nameof(CRDuplicateEntities <PXGraph, Contact> .CloseAsDuplicate)); } } }
private static void ProcessValidation(ValidationFilter Filter, Contact record) { PXPrimaryGraphCollection primaryGraph = new PXPrimaryGraphCollection(new PXGraph()); PXGraph graph = primaryGraph[record]; if (graph == null) { throw new PXException(Messages.UnableToFindGraph); } PXView view = graph.Views[graph.PrimaryView]; int startRow = 0, totalRows = 0; List <object> list_contact = view.Select(null, null, new object[] { record.ContactID }, new string[] { typeof(Contact.contactID).Name }, null, null, ref startRow, 1, ref totalRows); if (list_contact == null || list_contact.Count < 1) { throw new PXException(Messages.ContactNotFound); } Contact contact = PXResult.Unwrap <Contact>(list_contact[0]); contact.DuplicateFound = true; //Find duplicates view PXView viewDuplicates = graph.Views.ToArray().First(v => v.Value.Cache.GetItemType() == typeof(CRDuplicateRecord)).Value; if (viewDuplicates == null) { throw new PXException(Messages.DuplicateViewNotFound); } viewDuplicates.Clear(); List <object> duplicates = viewDuplicates.SelectMulti(); contact = (Contact)view.Cache.CreateCopy(contact); string prevStatus = contact.DuplicateStatus; contact.DuplicateStatus = DuplicateStatusAttribute.Validated; Decimal?score = 0; contact.DuplicateFound = duplicates.Count > 0; foreach (PXResult <CRDuplicateRecord, Contact, Contact2> r in duplicates) { Contact2 duplicate = r; CRDuplicateRecord contactScore = r; int duplicateWeight = ContactMaint.GetContactWeight(duplicate); int currentWeight = ContactMaint.GetContactWeight(contact); if (duplicateWeight > currentWeight || (duplicateWeight == currentWeight && duplicate.ContactID < contact.ContactID)) { contact.DuplicateStatus = DuplicateStatusAttribute.PossibleDuplicated; if (contactScore.Score > score) { score = contactScore.Score; } } } view.Cache.Update(contact); if (contact.DuplicateStatus == DuplicateStatusAttribute.PossibleDuplicated && contact.ContactType == ContactTypesAttribute.Lead && contact.Status == LeadStatusesAttribute.New && Filter.CloseNoActivityLeads == true && score > Filter.CloseThreshold) { CRActivity activity = PXSelect <CRActivity, Where <CRActivity.contactID, Equal <Required <Contact.contactID> > > > .SelectWindowed(graph, 0, 1, contact.ContactID); if (activity == null) { PXAction action = graph.Actions["Action"]; PXAdapter adapter = new PXAdapter(view); adapter.StartRow = 0; adapter.MaximumRows = 1; adapter.Searches = new object[] { contact.ContactID }; adapter.Menu = Messages.CloseAsDuplicate; adapter.SortColumns = new[] { typeof(Contact.contactID).Name }; foreach (Contact c in action.Press(adapter)) { ; } prevStatus = null; } } view.Cache.RestoreCopy(record, view.Cache.Current); if (prevStatus != contact.DuplicateStatus) { graph.Actions.PressSave(); } }
public void ValidationFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e) { ValidationFilter filter = (ValidationFilter)e.Row; Contacts.SetProcessDelegate(record => ProcessValidation(filter, record)); }
private static void ProcessValidation(ValidationFilter filter, Contact record) { BusinessAccountMaint graph = PXGraph.CreateInstance <BusinessAccountMaint>(); PXView view = graph.BAccount.View; int startRow = 0, totalRows = 0; BAccount baccount = null; Contact contact = null; if (record.ContactType == ContactTypesAttribute.BAccountProperty && record.BAccountID != null) { List <object> list_baccount = view.Select(null, null, new object[] { record.BAccountID }, new string[] { typeof(BAccount.bAccountID).Name }, null, null, ref startRow, 1, ref totalRows); if (list_baccount != null && list_baccount.Count >= 1) { baccount = PXResult.Unwrap <BAccount>(list_baccount[0]); } } if (baccount == null || baccount.DefContactID != record.ContactID) { throw new PXException(Messages.ContactNotFound); } contact = graph.DefContact.Current = graph.DefContact.SelectWindowed(0, 1); contact.DuplicateFound = true; PXView viewDuplicates = graph.Duplicates.View; if (viewDuplicates == null) { throw new PXException(Messages.DuplicateViewNotFound); } viewDuplicates.Clear(); List <object> duplicates = viewDuplicates.SelectMulti(); contact = (Contact)graph.DefContact.Cache.CreateCopy(contact); contact.DuplicateStatus = DuplicateStatusAttribute.Validated; Decimal?score = 0; foreach (PXResult <CRDuplicateRecord, Contact, CRLeadContactValidationProcess.Contact2> r in duplicates) { CRLeadContactValidationProcess.Contact2 duplicate = r; CRDuplicateRecord contactScore = r; int duplicateWeight = ContactMaint.GetContactWeight(duplicate); int currentWeight = ContactMaint.GetContactWeight(contact); if (duplicateWeight > currentWeight || (duplicateWeight == currentWeight && duplicate.ContactID < contact.ContactID)) { contact.DuplicateStatus = DuplicateStatusAttribute.PossibleDuplicated; if (contactScore.Score > score) { score = contactScore.Score; } } } graph.DefContact.Cache.Update(contact); graph.DefContact.Cache.RestoreCopy(record, contact); graph.Actions.PressSave(); }
public void ValidationFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e) { ValidationFilter filter = (ValidationFilter)e.Row; Contacts.SetProcessDelegate((PXGraph graph, ContactAccount record) => ProcessValidation(graph, record, filter)); }
private static void ProcessValidation(BusinessAccountMaint graph, Contact record, ValidationFilter Filter) { Type itemType = record.GetType(); PXCache cache = PXGraph.CreateInstance <PXGraph>().Caches[itemType]; Type graphType; object copy = cache.CreateCopy(record); PXPrimaryGraphAttribute.FindPrimaryGraph(cache, ref copy, out graphType); graph.Views[graph.PrimaryView].Cache.Current = copy as BAccount; CRDuplicateEntities <PXGraph, BAccount> .RunActionWithAppliedAutomation( graph, copy, nameof(CRDuplicateEntities <PXGraph, BAccount> .CheckForDuplicates)); }