Вопрос

Изменить коробочное поведение для поля "Средства связи"

При добавлении нового средства связи оно автоматически попадает в профиль контакта.

 

Как изменить это поведение. Нужно чтобы попадало только если поле пустое.

 

Нравится

2 комментария
Лучший ответ

Ух, у меня получилось только костылями это решить. Возможно пригодится этот код, или возьмете идеи из него. Работает только с email контактов.

 

Создать замещающий объект ContactCommunication, Добавить новое логическое поле UsrIsPrimary в объект (основное средство связи). Добавить в этом объекте код, которые перекроет коробочную логику. А еще нужно будет пробежаться скриптом по базе и добавить свойство UsrIsPrimary для тех email, которые сейчас находятся в контакте. Может быть есть более элегантный способ решить проблему, но в свое время я смог додуматься только до такого.

 public override void ActualizePrimaryState()
        {
            base.ActualizePrimaryState();
 
            var contactId = Entity.GetTypedColumnValue<Guid>("ContactId");
            var communicationTypeId = Entity.GetTypedColumnValue<Guid>("CommunicationTypeId").ToString();
            bool isCurrentTypeEmail = communicationTypeId.Equals(CommunicationTypeConsts.EmailId);
 
            var contactESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
            contactESQ.AddAllSchemaColumns();
            var contact = contactESQ.GetEntity(UserConnection, contactId);
            bool emailChanged = contact.GetTypedColumnValue<bool>("UsrEmailChanged");
            string email = contact.GetTypedColumnValue<string>("Email");
            if (contact != null && isCurrentTypeEmail && (emailChanged || string.IsNullOrEmpty(email)))
            {
                Entity.SetColumnValue("UsrIsPrimary", true);
 
                var update = new Update(UserConnection, "ContactCommunication")
                .Set("UsrIsPrimary", Column.Parameter(false))
                .Where("UsrIsPrimary").IsEqual(Column.Parameter(true))
                .And("ContactId").IsEqual(Column.Parameter(contactId))
                .And("Id").IsNotEqual(Column.Parameter(contactId))
                .And("CommunicationTypeId").IsEqual(Column.Parameter(CommunicationTypeConsts.EmailId)
                );
                update.Execute();
            }
        }
 
        public virtual KeyValuePair<string, bool> GetPrimaryContactEmail(Guid contactId)
        {
            KeyValuePair<string, bool> result = new KeyValuePair<string, bool>(string.Empty, false);
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "ContactCommunication");
            esq.RowCount = 1;
            EntitySchemaQueryColumn nonActualColumn = esq.AddColumn("NonActual").OrderByAsc(1);
            EntitySchemaQueryColumn isPrimatyColumn = esq.AddColumn("UsrIsPrimary").OrderByDesc(2);
            EntitySchemaQueryColumn orderByDescColumn = esq.AddColumn("CreatedOn").OrderByDesc(3);
            EntitySchemaQueryColumn numberColumn = esq.AddColumn("Number");
            esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact", contactId));
            esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "CommunicationType",
                CommunicationTypeConsts.EmailId));
            EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
            foreach (Entity entity in entityCollection)
            {
                return new KeyValuePair<string, bool>(entity.GetTypedColumnValue<string>(numberColumn.Name),
                     entity.GetTypedColumnValue<bool>(nonActualColumn.Name));
            }
            return result;
        }
 
        public override void SetNewContactCommunication() {
            var contactCommunicationId = Entity.GetTypedColumnValue<Guid>("Id");
            var contactId = Entity.GetTypedColumnValue<Guid>("ContactId");
			var contactESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
			contactESQ.AddAllSchemaColumns();
			var contact = contactESQ.GetEntity(UserConnection, contactId);
			if (contact != null) {
				var communicationTypeId = Entity.GetTypedColumnValue<Guid>("CommunicationTypeId").ToString();
				var number = Entity.GetTypedColumnValue<string>("Number");
				var socialColumnValue = Entity.GetTypedColumnValue<string>("SocialMediaId");
				var isPrimary = Entity.GetTypedColumnValue<bool>("IsCreatedBySynchronization");
				var typeColumnName = string.Empty;
				var socialColumnName = string.Empty;
				switch (communicationTypeId) {
					case CommunicationTypeConsts.LinkedInId:
				 		typeColumnName = "LinkedIn";
						socialColumnName = "LinkedInId";
						break;
					case CommunicationTypeConsts.TwitterId:
						typeColumnName = "Twitter";
						socialColumnName = "TwitterId";
						break;
					case CommunicationTypeConsts.FacebookId:
						typeColumnName = "Facebook";
						socialColumnName = "FacebookId";
						break;
					case CommunicationTypeConsts.EmailId:
						typeColumnName = "Email";
						break;
					case CommunicationTypeConsts.SkypeId:
				 		typeColumnName = "Skype";
						break;
					case CommunicationTypeConsts.HomePhoneId:
						typeColumnName = "HomePhone";
						break;
					case CommunicationTypeConsts.MobilePhoneId:
						typeColumnName = "MobilePhone";
						break;
					case CommunicationTypeConsts.WorkPhoneId:
						typeColumnName = "Phone";
						break;
					case CommunicationTypeConsts.WebId:
						typeColumnName = "Web";
						break;
				}
				if (!typeColumnName.Equals(string.Empty)) {
					bool isCanEdit = GetCanEditColumn("Contact", typeColumnName);
					if (!isCanEdit) {
						return;
					}
					bool isCurrentTypeEmail = communicationTypeId.Equals(CommunicationTypeConsts.EmailId);
					bool isOldTypeEmail = OldCommunicationTypeId.ToString().Equals(CommunicationTypeConsts.EmailId);
					bool isCurrentTypeWeb = communicationTypeId.Equals(CommunicationTypeConsts.WebId);
					bool isNotEmailOrWeb = !isCurrentTypeEmail && !isCurrentTypeWeb;
					if (!(isCurrentTypeEmail || isOldTypeEmail) && !isNotEmailOrWeb) {
						return;
					}
					string currentContactCommunicationValue = contact.GetTypedColumnValue<string>(typeColumnName);
					var update = new Update(UserConnection, "Contact") as Update;
					if (isCurrentTypeEmail || isOldTypeEmail) {
							KeyValuePair<string, bool> kvp = GetPrimaryContactEmail(contactId);
							if(!currentContactCommunicationValue.Equals(kvp.Key)) {
								var currentEmail = contact.GetTypedColumnValue<string>("Email");
                                bool emailChanged = contact.GetTypedColumnValue<bool>("UsrEmailChanged");
                            if (string.IsNullOrEmpty(currentEmail) || emailChanged) {
									update.Set("Email", Column.Parameter(kvp.Key));
                                    update.Set("UsrEmailChanged", Column.Parameter(false));
                                }
							}
							update.Set("IsNonActualEmail", Column.Parameter(kvp.Value));
					}
					if (isNotEmailOrWeb) {
						if (!currentContactCommunicationValue.Equals(number) && isPrimary) {
							update.Set(typeColumnName, Column.Parameter(number));
							if (!socialColumnName.Equals(string.Empty)) {
								update.Set(socialColumnName, Column.Parameter(socialColumnValue));
							}
						} else if (!isOldTypeEmail) {
							return;
						}
					}
					update.Set("ModifiedOn", Column.Parameter(DateTime.UtcNow));
					update.Where("Id").IsEqual(Column.Parameter(contactId));
					update.Execute();
				}
			}
		}

 

Еще добавить в Contact поле UsrEmailChanged

В карточку контакта следующий код, честно говоря не помню для чего это было сделано.

        attributes: {              
                "UsrEmailChanged":
                {
                    dependencies: [
                        {
                            columns: ["Email"],
                            methodName: "emailChanged"
                        }
                    ]
                },
        },

    methods: {
            onEntityInitialized: function() {
                this.callParent(arguments);
                if(this.$UsrEmailChanged) {
                    this.$UsrEmailChanged = false;
                }
            },

            emailChanged: function() {
                this.$UsrEmailChanged = true;
            },
        },

Ух, у меня получилось только костылями это решить. Возможно пригодится этот код, или возьмете идеи из него. Работает только с email контактов.

 

Создать замещающий объект ContactCommunication, Добавить новое логическое поле UsrIsPrimary в объект (основное средство связи). Добавить в этом объекте код, которые перекроет коробочную логику. А еще нужно будет пробежаться скриптом по базе и добавить свойство UsrIsPrimary для тех email, которые сейчас находятся в контакте. Может быть есть более элегантный способ решить проблему, но в свое время я смог додуматься только до такого.

 public override void ActualizePrimaryState()
        {
            base.ActualizePrimaryState();
 
            var contactId = Entity.GetTypedColumnValue<Guid>("ContactId");
            var communicationTypeId = Entity.GetTypedColumnValue<Guid>("CommunicationTypeId").ToString();
            bool isCurrentTypeEmail = communicationTypeId.Equals(CommunicationTypeConsts.EmailId);
 
            var contactESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
            contactESQ.AddAllSchemaColumns();
            var contact = contactESQ.GetEntity(UserConnection, contactId);
            bool emailChanged = contact.GetTypedColumnValue<bool>("UsrEmailChanged");
            string email = contact.GetTypedColumnValue<string>("Email");
            if (contact != null && isCurrentTypeEmail && (emailChanged || string.IsNullOrEmpty(email)))
            {
                Entity.SetColumnValue("UsrIsPrimary", true);
 
                var update = new Update(UserConnection, "ContactCommunication")
                .Set("UsrIsPrimary", Column.Parameter(false))
                .Where("UsrIsPrimary").IsEqual(Column.Parameter(true))
                .And("ContactId").IsEqual(Column.Parameter(contactId))
                .And("Id").IsNotEqual(Column.Parameter(contactId))
                .And("CommunicationTypeId").IsEqual(Column.Parameter(CommunicationTypeConsts.EmailId)
                );
                update.Execute();
            }
        }
 
        public virtual KeyValuePair<string, bool> GetPrimaryContactEmail(Guid contactId)
        {
            KeyValuePair<string, bool> result = new KeyValuePair<string, bool>(string.Empty, false);
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "ContactCommunication");
            esq.RowCount = 1;
            EntitySchemaQueryColumn nonActualColumn = esq.AddColumn("NonActual").OrderByAsc(1);
            EntitySchemaQueryColumn isPrimatyColumn = esq.AddColumn("UsrIsPrimary").OrderByDesc(2);
            EntitySchemaQueryColumn orderByDescColumn = esq.AddColumn("CreatedOn").OrderByDesc(3);
            EntitySchemaQueryColumn numberColumn = esq.AddColumn("Number");
            esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact", contactId));
            esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "CommunicationType",
                CommunicationTypeConsts.EmailId));
            EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
            foreach (Entity entity in entityCollection)
            {
                return new KeyValuePair<string, bool>(entity.GetTypedColumnValue<string>(numberColumn.Name),
                     entity.GetTypedColumnValue<bool>(nonActualColumn.Name));
            }
            return result;
        }
 
        public override void SetNewContactCommunication() {
            var contactCommunicationId = Entity.GetTypedColumnValue<Guid>("Id");
            var contactId = Entity.GetTypedColumnValue<Guid>("ContactId");
			var contactESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
			contactESQ.AddAllSchemaColumns();
			var contact = contactESQ.GetEntity(UserConnection, contactId);
			if (contact != null) {
				var communicationTypeId = Entity.GetTypedColumnValue<Guid>("CommunicationTypeId").ToString();
				var number = Entity.GetTypedColumnValue<string>("Number");
				var socialColumnValue = Entity.GetTypedColumnValue<string>("SocialMediaId");
				var isPrimary = Entity.GetTypedColumnValue<bool>("IsCreatedBySynchronization");
				var typeColumnName = string.Empty;
				var socialColumnName = string.Empty;
				switch (communicationTypeId) {
					case CommunicationTypeConsts.LinkedInId:
				 		typeColumnName = "LinkedIn";
						socialColumnName = "LinkedInId";
						break;
					case CommunicationTypeConsts.TwitterId:
						typeColumnName = "Twitter";
						socialColumnName = "TwitterId";
						break;
					case CommunicationTypeConsts.FacebookId:
						typeColumnName = "Facebook";
						socialColumnName = "FacebookId";
						break;
					case CommunicationTypeConsts.EmailId:
						typeColumnName = "Email";
						break;
					case CommunicationTypeConsts.SkypeId:
				 		typeColumnName = "Skype";
						break;
					case CommunicationTypeConsts.HomePhoneId:
						typeColumnName = "HomePhone";
						break;
					case CommunicationTypeConsts.MobilePhoneId:
						typeColumnName = "MobilePhone";
						break;
					case CommunicationTypeConsts.WorkPhoneId:
						typeColumnName = "Phone";
						break;
					case CommunicationTypeConsts.WebId:
						typeColumnName = "Web";
						break;
				}
				if (!typeColumnName.Equals(string.Empty)) {
					bool isCanEdit = GetCanEditColumn("Contact", typeColumnName);
					if (!isCanEdit) {
						return;
					}
					bool isCurrentTypeEmail = communicationTypeId.Equals(CommunicationTypeConsts.EmailId);
					bool isOldTypeEmail = OldCommunicationTypeId.ToString().Equals(CommunicationTypeConsts.EmailId);
					bool isCurrentTypeWeb = communicationTypeId.Equals(CommunicationTypeConsts.WebId);
					bool isNotEmailOrWeb = !isCurrentTypeEmail && !isCurrentTypeWeb;
					if (!(isCurrentTypeEmail || isOldTypeEmail) && !isNotEmailOrWeb) {
						return;
					}
					string currentContactCommunicationValue = contact.GetTypedColumnValue<string>(typeColumnName);
					var update = new Update(UserConnection, "Contact") as Update;
					if (isCurrentTypeEmail || isOldTypeEmail) {
							KeyValuePair<string, bool> kvp = GetPrimaryContactEmail(contactId);
							if(!currentContactCommunicationValue.Equals(kvp.Key)) {
								var currentEmail = contact.GetTypedColumnValue<string>("Email");
                                bool emailChanged = contact.GetTypedColumnValue<bool>("UsrEmailChanged");
                            if (string.IsNullOrEmpty(currentEmail) || emailChanged) {
									update.Set("Email", Column.Parameter(kvp.Key));
                                    update.Set("UsrEmailChanged", Column.Parameter(false));
                                }
							}
							update.Set("IsNonActualEmail", Column.Parameter(kvp.Value));
					}
					if (isNotEmailOrWeb) {
						if (!currentContactCommunicationValue.Equals(number) && isPrimary) {
							update.Set(typeColumnName, Column.Parameter(number));
							if (!socialColumnName.Equals(string.Empty)) {
								update.Set(socialColumnName, Column.Parameter(socialColumnValue));
							}
						} else if (!isOldTypeEmail) {
							return;
						}
					}
					update.Set("ModifiedOn", Column.Parameter(DateTime.UtcNow));
					update.Where("Id").IsEqual(Column.Parameter(contactId));
					update.Execute();
				}
			}
		}

 

Еще добавить в Contact поле UsrEmailChanged

В карточку контакта следующий код, честно говоря не помню для чего это было сделано.

        attributes: {              
                "UsrEmailChanged":
                {
                    dependencies: [
                        {
                            columns: ["Email"],
                            methodName: "emailChanged"
                        }
                    ]
                },
        },

    methods: {
            onEntityInitialized: function() {
                this.callParent(arguments);
                if(this.$UsrEmailChanged) {
                    this.$UsrEmailChanged = false;
                }
            },

            emailChanged: function() {
                this.$UsrEmailChanged = true;
            },
        },

Мы дополнение сделали, возможно, кому-то пригодится
https://marketplace.terrasoft.ru/template/upravlenie-osnovnymi-sredstva…

Показать все комментарии