Понравилась ли вам эта идея?
Добрый день, Владимир!
Спасибо за обратную связь, мы зарегистрировали Ваше пожелание для возможной реализации в будущих версиях.
Для изменения логики синхронизации Вам необходимо переопределить базовый метод "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); .....
В итоге главных адресом система считает последний из синхронизируемых