При добавлении нового средства связи оно автоматически попадает в профиль контакта.
Как изменить это поведение. Нужно чтобы попадало только если поле пустое.
Нравится
Ух, у меня получилось только костылями это решить. Возможно пригодится этот код, или возьмете идеи из него. Работает только с 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…