Подскажите пожалуйста может кто-то пользуется хорошим справочником по адресам(страна,город,улица) или знает где его можно загрузить/ получать дынные по вебсервису. Сейчас пользуемся данными из гугл карт, но может кто-то знает альтернативные варианты.
На данный момент официальным решением от компании Terrasoft является использование адресов сервиса OpenStreetMap. Вы можете подобрать альтернативные инструменты для работы с адресами в Вашем приложении Creatio на MarketPlace. Примеры таких инструментов:
В настоящий момент основным адресом становится последний введенный, что в основном нелогично, так как юридический адрес (который во многих случаях является основным) заводится первым.Предлагаю в справочнике типов адресов указать, может ли этот тип являться основным. И уже из таких адресов выбирать последний.
Или же предоставить пользователю решать, какой из адресов контрагента/контакта будет основным.
Спасибо за обратную связь, мы зарегистрировали Ваше пожелание для возможной реализации в будущих версиях.
Для изменения логики синхронизации Вам необходимо переопределить базовый метод "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){returntrue;}
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);
.....
В итоге главных адресом система считает последний из синхронизируемых