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