Симптомы
Вопрос по обработке часовых поясов.
В карточке торговой точки есть поля "Воемя доставки от" и "Время доставки до" с типом Время. При создании точки на планшете ставим в них 17:00 и 18:00, в базу они синхронизируются как 14:00 и 15:00. Более того, после синхронизации и на планшете в этих полях оказываются значения 14:00 и 15:00.
В интерфейсе веб-версии они тоже видны как 14:00 и 15:00
Причина
Исправлено в версии 7.8
Решение
Ниже предоставлен фикс, исправляющие проблему без переноса серверных изменений 7.8 по часовым поясам.
Порядок действий следующий:
- создать схему UsrSyncExtension (тип «Модуль») в пользовательском пакете;
- добавить в нее следующий код:
var sysAdminUnitStore = Ext.create("Ext.data.Store", {model: "SysAdminUnit"});
sysAdminUnitStore.setProxy("odata");
sysAdminUnitStore.load({
queryConfig: Ext.create("Terrasoft.QueryConfig", {
modelName: "SysAdminUnit",
autoSetProxy: false,
columns: ["TimeZoneId"]
}),
filters: Ext.create("Terrasoft.Filter", {
property: "Contact",
value: Terrasoft.CurrentUserInfo.contactId
}),
callback: function(records, operation, success) {
if (success === true && records.length > 0) {
var firstRecord = records[0];
var timeZoneCode = firstRecord.get("TimeZoneId");
if (!Ext.isEmpty(timeZoneCode)) {
var timeZoneStore = Ext.create("Ext.data.Store", {model: "TimeZone"});
timeZoneStore.setProxy("odata");
timeZoneStore.load({
queryConfig: Ext.create("Terrasoft.QueryConfig", {
modelName: "TimeZone",
autoSetProxy: false,
columns: ["Offset"]
}),
filters: Ext.create("Terrasoft.Filter", {
property: "Code",
value: timeZoneCode
}),
callback: function(timeZoneRecords, timeZoneOperation, timeZoneSuccess) {
if (timeZoneSuccess === true && timeZoneRecords.length > 0) {
var timeZoneRecord = timeZoneRecords[0];
var offset = timeZoneRecord.get("Offset");
var offsetValue = 0;
if (!Ext.isEmpty(offset)) {
offset = offset.replace("GMT", "");
if (!Ext.isEmpty(offset)) {
var sign = (offset.substring(0, 1) === "-") ? 1 : -1;
var hours = parseInt(offset.substr(1, 2));
var minutes = parseInt(offset.substr(4, 2));
offsetValue = sign * (hours * 60 + minutes);
}
}
Terrasoft.Configuration.CurrentUserTimeZoneOffset = offsetValue;
}
},
scope: this
});
}
}
},
scope: this
});
if (!Terrasoft.Configuration.processColumn) {
Terrasoft.Configuration.processColumn = Terrasoft.OData.ResponseParser.processColumn;
}
Terrasoft.OData.ResponseParser.processColumn = function(data, queryConfig, record, columnName) {
var model = record.self;
var columnConfig = model.ColumnConfigs.get(columnName);
var columnValue = data[columnName];
if ((columnConfig.columnType === Terrasoft.ColumnTypes.date ||
columnConfig.columnType === Terrasoft.ColumnTypes.datetime) &&
!Ext.isEmpty(Terrasoft.Configuration.CurrentUserTimeZoneOffset)) {
if (columnValue.indexOf("/") !== -1) {
var timeZoneOffset = Terrasoft.Configuration.CurrentUserTimeZoneOffset;
columnValue = new Date(parseInt(columnValue.substr(6)));
columnValue = new Date(columnValue.getTime() + timeZoneOffset * 60 * 1000);
} else {
columnValue = Terrasoft.util.convertISOStringToDate(columnValue);
}
record.set(columnName, columnValue);
} else {
Ext.callback(Terrasoft.Configuration.processColumn, Terrasoft.OData.ResponseParser, arguments);
}
};
- добавить в текущий пакет манифест мобильного приложения (манифест соответствующего рабочего места) и в нем прописать схему UsrSyncExtension, а именно добавить ее в SyncExtensions и CustomSchemas:
"SyncExtensions": [
"UsrSyncExtension"
],
"CustomSchemas": [
"UsrSyncExtension"
],
Что делает вышеуказанный код:
- получает из SysAdminUnit часовой пояс текущего пользователя;
- при получении дат во время синхронизации использует этот часовой пояс.