Идея
Одобрена

Изменить логику синхронизации адресов

В настоящий момент основным адресом становится последний введенный, что в основном нелогично, так как юридический адрес (который во многих случаях является основным) заводится первым.Предлагаю в справочнике типов адресов указать, может ли этот тип являться основным. И уже из таких адресов выбирать последний. Или же предоставить пользователю решать, какой из адресов контрагента/контакта будет основным.
2 комментария

Добрый день, Владимир!

Спасибо за обратную связь, мы зарегистрировали Ваше пожелание для возможной реализации в будущих версиях.

Для изменения логики синхронизации Вам необходимо переопределить базовый метод "syncMasterEntityWithDetail" (например, данный метод для детали "Средства связи" находится в схеме "BaseCommunicationDetail" (пакет "NUI").

В итоге сделали так.

В объект AddressType добавили boolean поле UsrSync (присваиваем True только юридическому адресу, так как его хотим по умолчанию синхронизировать с Account)

В процессе объекта AccountAddress заместили метод синхронизации

var accountId = Entity.GetTypedColumnValue<Guid>("AccountId");
var addressESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "AccountAddress");
var idColumn = addressESQ.AddColumn(addressESQ.RootSchema.GetPrimaryColumnName()); 
// сортируем по признаку синхронизации
addressESQ.AddColumn("AddressType.UsrSync").OrderByDesc();
//
addressESQ.AddColumn("CreatedOn").OrderByAsc();
addressESQ.Filters.Add(addressESQ.CreateFilterWithParameters(
	FilterComparisonType.Equal, "Account", accountId));
var options = new EntitySchemaQueryOptions {
	PageableDirection = PageableSelectDirection.First,
	PageableRowCount = 1,
	PageableConditionValues = new Dictionary<string, object>()
};
 
 
 
 
var addresses = addressESQ.GetEntityCollection(UserConnection, options);
if (addresses.Count > 0) {
	if (addresses[0].GetTypedColumnValue<Guid>(idColumn.Name).Equals(Entity.PrimaryColumnValue) &&
			!Entity.GetTypedColumnValue<bool>("Primary")) {
 
// 	если данному адресу надо установить Primary, то сбрасываем признак Primary у всех остальных		
		    var update = new Update(context.UserConnection, "AccountAddress")
			.Set("Primary",Column.Parameter(false))
			.Where("AccountId").IsEqual(Column.Parameter(accountId)) as Update;
		update.Execute();
//
		Entity.SetColumnValue("Primary", true);
		Entity.Save();
	}
}
.....

В процессе объекта Account заместили метод SynchronizeAddress

var accountId = Entity.PrimaryColumnValue;
var addressTypeId = Entity.GetColumnValue("AddressTypeId");
var address = Entity.GetTypedColumnValue<string>("Address");
var cityId = Entity.GetColumnValue("CityId");
var regionId = Entity.GetColumnValue("RegionId");
var countryId = Entity.GetColumnValue("CountryId");
var zip = Entity.GetTypedColumnValue<string>("Zip");
bool isEmptyAddressTypeId = addressTypeId == null;
bool isEmptyAddress = address.IsNullOrEmpty();
bool isEmptyCityId = cityId == null;
bool isEmptyRegionId = regionId == null;
bool isEmptyCountryId = countryId == null;
bool isEmptyZip = zip.IsNullOrEmpty();
if (isEmptyAddressTypeId && isEmptyAddress && isEmptyCityId && isEmptyRegionId && isEmptyCountryId && isEmptyZip) {
	return true;
}
var addressESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "AccountAddress");
var createdOnColumn = addressESQ.AddColumn("CreatedOn");
<strong>var primaryColumn = addressESQ.AddColumn("Primary");</strong>
addressESQ.AddAllSchemaColumns();
Сортируем адреса по признаку Primary, чтобы первым был основной адрес
primaryColumn.OrderByDesc();
//createdOnColumn.OrderByAsc();
var accountFilter = addressESQ.CreateFilterWithParameters(
	FilterComparisonType.Equal, "Account", accountId);
.....

В итоге главных адресом система считает последний из синхронизируемых

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