Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Учет расписания пользователя при назначени Действий
Запись от Артем Enot Грунин размещена 13.11.2009 в 15:27
Обновил(-а) Артем Enot Грунин 19.11.2009 в 09:21 (ударно глючит движок блога)
Обновил(-а) Артем Enot Грунин 19.11.2009 в 09:21 (ударно глючит движок блога)
Теги dom, java script, unsupport
Недавно на форуме обсуждался вопрос о некоторой несправедливости CRM в отношении планирования задач и действий сервиса: Выставление сроков. Дело в том, что планирование действия сервиса происходит в соответствии с расписанием пользователя, в то время как Задачу можно назначить на пять утра в воскресенье или на обеденный перерыв. В исходном посте обсуждается назначение действий из рабочего процесса - задача несомненно важная, однако в моей практике актуалнее вопрос планирования с использованием пользовательского интерфейса. Так как же отразить адекватный список опций фремени при планировании Задач? Для этого я использовал запрос планирования QueryScheduleRequest, возвращающий набор TimeInfo - объектов содержащих данные по интервалам занятости определенного ресурса. Далее, обработал результат и по аналогии с решением в посте Формат времени сформировал список опций для выпадающего списка времени. Приведенный ниже код нужно разместить на форме задачи (тегами помечено в каких обработчиках).
Все бы еще ничего, если бы дело не пахло Microsoft: запрос возвращает данные не в виде интервалов доступности ресурса, а в виде набора пересечений: "Свободен с 9 до 18; Занят с 13 до 14". Так что потребовалась дополнительное осмысление данных перед генерацией опций для списка времени. Так же в коде учитывается длительность действия - задача должна полностью укладываться в интервал когда пользователь свободен.
Проблема: я пока не понял почему, но значения опций времени в выпадающем списке обновляется лишь однажды. Это значит, что после смены пользователя, срока и длительности задачи, в списке остаются неверные значения опций. Если кто-то знает как побороть этот баг, пожалуйста отпишитесь в каментах. Так же, после выбора даты в списке времени остается значение "0:00" (даже если такой опции теперь нет). Последнюю проблему относительно просто решить, но не хочется тратить на нее время, пока есть более сложная задача.
Буду признателен за помощь!
Код:
//<OnChange> DateTime var RESORCE_UNAVAILABLE_MSG = "Ресурс на текущий день недоступен"; var RESORCE_NOTSELECTED_MSG = "Не выбран ресурс"; var SHED_REQUEST_FAILED_MSG = "Невозможно прочитать рассписание ресурса: "; var SCHEDULING_INTERVAL_DEF = 30; var oDateTime = crmForm.all.scheduledend; var oUser = crmForm.all.ownerid; var oDuration = crmForm.all.actualdurationminutes; setUserShedule(oDateTime, oUser, oDuration); function setUserShedule(oDateTime, oUser, oDuration) { // Вычитываем ид ресурса var oUserId = oUser.DataValue != null ? oUser.DataValue[0].id : null; if (oUserId == null) { oDateTime.DataValue = null; return; } // Вычитываем день var oDate = oDateTime.DataValue; if (oDate == null) return; // Определяем шаг планирования var oScheduleInterval = oDuration.DataValue == null ? SCHEDULING_INTERVAL_DEF : oDuration.DataValue; // Вычитываем доступные опции var oTimeOptions = requestScheduleOptions(oUserId, oDate, oScheduleInterval); if (oTimeOptions == null || oTimeOptions.length == 0) { alert(RESORCE_UNAVAILABLE_MSG); // отключаем выбор времени, так же следует не давать сохранить форму oDateTime.all.time.disable(); return; } // Настраиваем контрол выбора времени setTimeOptions(oDateTime, oTimeOptions); } // oDateTime - контрол даты для настройки // oTimeOptions - массив содержащий строки опций 0:00, 00:30 и т.д. function setTimeOptions(oDateTime, oTimeOptions) { var timeField = oDateTime.all.time; var tables = timeField.getElementsByTagName("table"); if ((tables != null) && (tables.length > 0)) { var table = tables[1]; while (table.firstChild != null) { table.removeChild(table.firstChild); } for (var i = 0; i < oTimeOptions.length; i++) { var row = table.insertRow(); var cell = row.insertCell(); var time = oTimeOptions[i]; cell.setAttribute("val", time); cell.innerText = time; } } } // oUserId - идентификатор пользователя // oDate - дата на которую осуществляется планирование // oScheduleInterval - шаг между интервалами планирования в минутах function requestScheduleOptions(oUserId, oDate, oScheduleInterval) { var oTimeOptions = new Array(); // Начало суток var oStartDate = new Date(oDate); oStartDate.setHours(0); oStartDate.setMinutes(0); // Конец суток var oEndDate = new Date(oStartDate); oEndDate.setDate(oDate.getDate() + 1); // Период в UTC для запроса var oStartDateUTC = FormatDateTime(oStartDate); var oEndDateUTC = FormatDateTime(oEndDate); var oRequestXML = "<?xml version='1.0' encoding='utf-8'?>" + "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" + GenerateAuthenticationHeader() + "<soap:Body>" + "<Execute xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" + "<Request xsi:type='QueryScheduleRequest'>" + "<ResourceId>" + oUserId + "</ResourceId>" + "<Start>" + oStartDateUTC + "</Start>" + "<End>" + oEndDateUTC + "</End>" + "<TimeCodes>" + "<TimeCode>Available</TimeCode>" + "<TimeCode>Unavailable</TimeCode>" + "</TimeCodes>" + "</Request>" + "</Execute>" + "</soap:Body>" + "</soap:Envelope>"; var oXMLHTTP = new ActiveXObject("Msxml2.XMLHTTP"); oXMLHTTP.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); oXMLHTTP.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Execute"); oXMLHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); oXMLHTTP.setRequestHeader("Content-Length", oRequestXML.length); oXMLHTTP.send(oRequestXML); var responseXML = oXMLHTTP.responseXML; // Стандартная проверка на ошибки var errorCount = responseXML.selectNodes('//error').length; if (errorCount != 0) { var msg = responseXML.selectSingleNode('//description').nodeTypedValue; alert(SHED_REQUEST_FAILED_MSG + msg); return; } var oTimeInfos = responseXML.getElementsByTagName("TimeInfo"); if (oTimeInfos != null && oTimeInfos.length > 0) { var oPeriodStartArr = new Array(oTimeInfos.length); var oPeriodEndArr = new Array(oTimeInfos.length); for (var i = 0; i < oTimeInfos.length; i++) { var oTimeInfo = oTimeInfos[i]; var oTimeCode = oTimeInfo.selectSingleNode("TimeCode").text; var oStartDate = ParseUtcDate(oTimeInfo.selectSingleNode("Start").text) var oEndDate = ParseUtcDate(oTimeInfo.selectSingleNode("End").text); if (oTimeCode == "Available") { oPeriodStartArr[i] = oStartDate; oPeriodEndArr[i] = oEndDate; } else { // Время конца перерыва - время начала работы! oPeriodStartArr[i] = oEndDate; oPeriodEndArr[i] = oStartDate; } } oPeriodStartArr.sort(sortDate); oPeriodEndArr.sort(sortDate); for (var i = 0; i < oTimeInfos.length; i++) { var oPeriodStart = oPeriodStartArr[i]; var oPeriodEnd = oPeriodEndArr[i]; while (oPeriodStart < oPeriodEnd) { var oHours = oPeriodStart.getHours(); var oMinutes = oPeriodStart.getMinutes(); var oTime = ((oHours < 10) ? "0" : "") + oHours + ":" + ((oMinutes < 10) ? "0" : "") + oMinutes; oTimeOptions.push(oTime); oPeriodStart.setMinutes(oMinutes + oScheduleInterval); } } return oTimeOptions; } } function sortDate(oArg1, oArg2) { return oArg1.getTime() - oArg2.getTime(); } //</OnChange> //<OnChange> User var oDateTime = crmForm.all.scheduledend; oDateTime.FireOnChange(); //</OnChange> //<OnChange> Duration var oDateTime = crmForm.all.scheduledend; oDateTime.FireOnChange(); //</OnChange>
Проблема: я пока не понял почему, но значения опций времени в выпадающем списке обновляется лишь однажды. Это значит, что после смены пользователя, срока и длительности задачи, в списке остаются неверные значения опций. Если кто-то знает как побороть этот баг, пожалуйста отпишитесь в каментах. Так же, после выбора даты в списке времени остается значение "0:00" (даже если такой опции теперь нет). Последнюю проблему относительно просто решить, но не хочется тратить на нее время, пока есть более сложная задача.
Буду признателен за помощь!
Всего комментариев 0