Понравилась ли вам эта идея?
Добрый день, Владимир!
Спасибо за обратную связь, мы зарегистрировали Ваше пожелание для возможной реализации в будущих версиях.
Для изменения логики синхронизации Вам необходимо переопределить базовый метод "syncMasterEntityWithDetail" (например, данный метод для детали "Средства связи" находится в схеме "BaseCommunicationDetail" (пакет "NUI").
В итоге сделали так.
В объект AddressType добавили boolean поле UsrSync (присваиваем True только юридическому адресу, так как его хотим по умолчанию синхронизировать с Account)
В процессе объекта AccountAddress заместили метод синхронизации
[csharp]
var accountId = Entity.GetTypedColumnValue("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()
};
var addresses = addressESQ.GetEntityCollection(UserConnection, options);
if (addresses.Count > 0) {
if (addresses[0].GetTypedColumnValue(idColumn.Name).Equals(Entity.PrimaryColumnValue) &&
!Entity.GetTypedColumnValue("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();
}
}
.....
[/csharp]
В процессе объекта Account заместили метод SynchronizeAddress
[csharp]
var accountId = Entity.PrimaryColumnValue;
var addressTypeId = Entity.GetColumnValue("AddressTypeId");
var address = Entity.GetTypedColumnValue("Address");
var cityId = Entity.GetColumnValue("CityId");
var regionId = Entity.GetColumnValue("RegionId");
var countryId = Entity.GetColumnValue("CountryId");
var zip = Entity.GetTypedColumnValue("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");
var primaryColumn = addressESQ.AddColumn("Primary");
addressESQ.AddAllSchemaColumns();
Сортируем адреса по признаку Primary, чтобы первым был основной адрес
primaryColumn.OrderByDesc();
//createdOnColumn.OrderByAsc();
var accountFilter = addressESQ.CreateFilterWithParameters(
FilterComparisonType.Equal, "Account", accountId);
.....
[/csharp]
В итоге главных адресом система считает последний из синхронизируемых