public override void Execute(XTriggerArgs args, IXExecutionContext context) { DomainObjectData xobj = args.TriggeredObject; // если изменилось значение признака "Архивное", проверим отсутствие у подразделения работающих сотрудников или не архивных департаментов. bool bUpdateIsArchive = xobj.HasUpdatedProp("IsArchive"); if (bUpdateIsArchive) { bool newValue = (bool)xobj.GetUpdatedPropValue("IsArchive"); if (!xobj.IsNew && newValue) { // 1. Проверим, что все сотрудники (во всех вложенных департаментах) уволены XDbCommand cmd = context.Connection.CreateCommand(@" SELECT 1 FROM dbo.Department d_s WITH(NOLOCK) JOIN dbo.Department d WITH(NOLOCK) ON d.LIndex >= d_s.LIndex AND d.RIndex <= d_s.RIndex AND d.Organization = d_s.Organization JOIN Employee e WITH(NOLOCK) ON (d.ObjectID = e.Department) and (e.WorkEndDate is null) WHERE d_s.ObjectID = @ObjectID " ); cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, xobj.ObjectID); if (cmd.ExecuteScalar() != null) { throw new XBusinessLogicException("Департамент не может быть переведен с состояние \"Архивное\", так как содержит работающих сотрудников"); } } // добавим в датаграмму подчиненные департаменты UpdateChildDepartments(context.Connection, args.DataSet, xobj.ObjectID, newValue); } }
/// <summary> /// Обнуление нормы в случае увольнения сотрудника, либо временной нетрудоспособности. /// </summary> private void setEmployeeRate(XTriggerArgs args, string sComment, DateTime dtDate) { DomainObjectData xobjEmployeeRate = args.DataSet.CreateNew("EmployeeRate", true); xobjEmployeeRate.SetUpdatedPropValue("Employee", args.TriggeredObject.ObjectID); xobjEmployeeRate.SetUpdatedPropValue("Rate", 0); xobjEmployeeRate.SetUpdatedPropValue("Date", dtDate); xobjEmployeeRate.SetUpdatedPropValue("Comment", sComment); }
public override void Execute(XTriggerArgs args, IXExecutionContext context) { DomainObjectData xobjEventSubscription = args.TriggeredObject; // для нового объекта если не задана группа рассылки проставим текущего пользователя if (args.Action == XTriggerActions.Insert && !(xobjEventSubscription.GetUpdatedPropValue("Group") is Guid)) { xobjEventSubscription.SetUpdatedPropValue("User", ((ITUser)XSecurityManager.Instance.GetCurrentUser()).EmployeeID); } }
private void setEmployeeHistoryEvent(XTriggerArgs args, EmployeeHistoryEvents enumEvent) { DomainObjectData xobjEmployeeHistory = args.DataSet.CreateNew("EmployeeHistory", true); ITUser user = (ITUser)XSecurityManager.Instance.GetCurrentUser(); xobjEmployeeHistory.SetUpdatedPropValue("Employee", args.TriggeredObject.ObjectID); xobjEmployeeHistory.SetUpdatedPropValue("Event", enumEvent); xobjEmployeeHistory.SetUpdatedPropValue("SystemUser", user.SystemUserID); xobjEmployeeHistory.SetUpdatedPropValue("EventDate", DateTime.Now); }
public override void Execute(XTriggerArgs args, IXExecutionContext context) { DomainObjectData xobjEmployeeHistory = args.DataSet.CreateNew("EmployeeHistory", true); ITUser user = (ITUser)XSecurityManager.Instance.GetCurrentUser(); Guid uidEmployeeID = getEmployeeID(context.Connection, args.TriggeredObject.ObjectID); xobjEmployeeHistory.SetUpdatedPropValue("Employee", uidEmployeeID); xobjEmployeeHistory.SetUpdatedPropValue("Event", EmployeeHistoryEvents.ChangeSecurity); xobjEmployeeHistory.SetUpdatedPropValue("SystemUser", user.SystemUserID); xobjEmployeeHistory.SetUpdatedPropValue("EventDate", DateTime.Now); }
public override void Execute(XTriggerArgs args, IXExecutionContext context) { DomainObjectData xobjHistory = getFolderHistoryObject(args.DataSet, args.TriggeredObject); xobjHistory.SetUpdatedPropValue("Event", FolderHistoryEvents.Creating); // если не задан Инициатор, то установим текущего сотрудника if (!args.TriggeredObject.HasUpdatedProp("Initiator") || args.TriggeredObject.GetUpdatedPropValue("Initiator") == DBNull.Value) { args.TriggeredObject.SetUpdatedPropValue("Initiator", ((ITUser)XSecurityManager.Instance.GetCurrentUser()).EmployeeID); } }
public override void Execute(XTriggerArgs args, IXExecutionContext context) { DomainObjectData xobjTask = args.TriggeredObject; // для нового объекта, если не задан планировщик, или // если изменилось запланированное время при обновлении установим планировщиком задания текущего сотрудника if (xobjTask.IsNew && xobjTask.GetUpdatedPropValue("Planner") == null || !xobjTask.IsNew && xobjTask.HasUpdatedProp("PlannedTime")) { xobjTask.SetUpdatedPropValue("Planner", ((ITUser)XSecurityManager.Instance.GetCurrentUser()).EmployeeID); } }
public override void Execute(XTriggerArgs args, IXExecutionContext context) { IEnumerator enumerator = args.DataSet.GetModifiedObjectsEnumerator(true); while (enumerator.MoveNext()) { DomainObjectData xobj = (DomainObjectData)enumerator.Current; if (xobj.IsNew) { //TODO Метод ChangeObjectIdentifier(изменение идентификатора нового объекта) был убран из solution } } }
public override void Execute(XTriggerArgs args, IXExecutionContext context) { DomainObjectData xobj = args.TriggeredObject; // Признак изменения Временной нетрудоспособности bool bUpdatedTemporaryDisability = xobj.HasUpdatedProp("TemporaryDisability"); // Признак изменения Даты начала работы bool bUpdateWorkBeginDay = xobj.HasUpdatedProp("WorkBeginDate"); // Признак изменения Даты окончания работы bool bUpdateWorkEndDay = xobj.HasUpdatedProp("WorkEndDate"); // Если что-то менялось, то запишем это событие в историю if (bUpdatedTemporaryDisability) { bool oldValue = (bool)xobj.GetLoadedPropValueOrLoad(context.Connection, "TemporaryDisability"); bool newValue = (bool)xobj.GetUpdatedPropValue("TemporaryDisability"); // Если свойство действительно обновилось, то запишем в "историю" if (oldValue != newValue) { setEmployeeHistoryEvent(args, EmployeeHistoryEvents.TemporaryDisability); // Если сотрудник получил признак "Временная нетрудоспособность", то надо автоматически задать // норму рабочего времени 0 if (newValue) { setEmployeeRate(args, "Временная нетрудоспособность", DateTime.Now); } } } if (bUpdateWorkBeginDay) { setEmployeeHistoryEvent(args, EmployeeHistoryEvents.WorkBeginDay); } if (bUpdateWorkEndDay) { setEmployeeHistoryEvent(args, EmployeeHistoryEvents.WorkEndDay); // Если для сотрудника задали "Дату окончания работы", то надо автоматически задать // норму рабочего времени 0 if (xobj.GetUpdatedPropValue("WorkEndDate") != DBNull.Value) { setEmployeeRate(args, "Уволен", (DateTime)xobj.GetUpdatedPropValue("WorkEndDate")); } } }
/// <summary> /// Вызов триггера; метод вызывается Ядром треккера /// </summary> /// <param name="args"></param> /// <param name="context"></param> public override void Execute(XTriggerArgs args, IXExecutionContext context) { // Создаем новый элемент истории папки DomainObjectData xobjHistory = args.DataSet.CreateNew("FolderHistory", true); // Триггер запускается и при удалении объекта - для загрузки информации по // папке могут использоваться данные самого объекта, а если их нет - данные из БД xobjHistory.SetUpdatedPropValue("Folder", args.TriggeredObject.GetPropValueAnyhow( "Folder", DomainObjectDataSetWalkingStrategies.UseUpdatedPropsThanLoadedProps, context.Connection)); xobjHistory.SetUpdatedPropValue("Event", FolderHistoryEvents.DirectionInfoChanging); ITUser user = (ITUser)XSecurityManager.Instance.GetCurrentUser(); xobjHistory.SetUpdatedPropValue("SystemUser", user.SystemUserID); xobjHistory.SetUpdatedPropValue("EventDate", DateTime.Now); }
public override void Execute(XTriggerArgs args, IXExecutionContext context) { DomainObjectData xobj = args.TriggeredObject; Guid uidEmployeeID = Guid.Empty; // Если создается новая норма, то возьмем обновляемое свойство "Employee", иначе загрузим его if (xobj.IsNew) { uidEmployeeID = (Guid)xobj.GetUpdatedPropValue("Employee"); } else { uidEmployeeID = (Guid)xobj.GetLoadedPropValueOrLoad(context.Connection, "Employee"); } DomainObjectData xobjEmployeeHistory = args.DataSet.CreateNew("EmployeeHistory", true); ITUser user = (ITUser)XSecurityManager.Instance.GetCurrentUser(); xobjEmployeeHistory.SetUpdatedPropValue("Employee", uidEmployeeID); xobjEmployeeHistory.SetUpdatedPropValue("Event", EmployeeHistoryEvents.ChangeRate); xobjEmployeeHistory.SetUpdatedPropValue("SystemUser", user.SystemUserID); xobjEmployeeHistory.SetUpdatedPropValue("EventDate", DateTime.Now); }
public override void Execute(XTriggerArgs args, Croc.XmlFramework.Core.IXExecutionContext context) { DomainObjectData xobj = args.TriggeredObject; bool bUpdatedState = xobj.HasUpdatedProp("State"); bool bUpdateIsLocked = xobj.HasUpdatedProp("IsLocked"); if (!bUpdatedState && !bUpdateIsLocked) { return; } // если здесь значит изменилось хотя бы одно из полей: Состояние (State), Дата блокирования списаний (BlockDate) // Теперь надо зачитать предыдущие значения из БД, но только тех свойств, которые обновляются preloadProps(xobj, bUpdatedState, bUpdateIsLocked, context); if (bUpdateIsLocked) { bool oldValue = (bool)xobj.GetLoadedPropValue("IsLocked"); bool newValue = (bool)xobj.GetUpdatedPropValue("IsLocked"); if (oldValue != newValue) { // изменение признака допустимости списания DomainObjectData xobjHistory = getFolderHistoryObject(args.DataSet, xobj); xobjHistory.SetUpdatedPropValue("Event", newValue?FolderHistoryEvents.IsLockedSetToTrue:FolderHistoryEvents.IsLockedSetToFalse); } } if (bUpdatedState) { FolderStates stateOld = (FolderStates)xobj.GetLoadedPropValue("State"); FolderStates stateNew = (FolderStates)xobj.GetUpdatedPropValue("State"); if (stateOld != stateNew) { // состояние изменилось // - проверим на запрещенные переходы checkFolderStateChanging(stateOld, stateNew); DomainObjectData xobjHistory = getFolderHistoryObject(args.DataSet, xobj); FolderHistoryEvents eventType; if (stateNew == FolderStates.Closed) { eventType = FolderHistoryEvents.Closing; } else if (stateNew == FolderStates.Frozen) { eventType = FolderHistoryEvents.Frozing; } else if (stateNew == FolderStates.WaitingToClose) { eventType = FolderHistoryEvents.WaitingToClose; } else // if (stateNew == FolderStates.Open) { eventType = FolderHistoryEvents.Opening; } xobjHistory.SetUpdatedPropValue("Event", eventType); // обработаем переход в состояние "Закрыто": if (!xobj.IsNew && (stateNew == FolderStates.Closed || stateNew == FolderStates.WaitingToClose)) { // 1. Проверим, что все инциденты (во всех вложенных папках) находятся в конечных состояниях XDbCommand cmd = context.Connection.CreateCommand(@" SELECT 1 FROM Folder f_s WITH(NOLOCK) JOIN Folder f WITH(NOLOCK) ON f.LIndex >= f_s.LIndex AND f.RIndex <= f_s.RIndex AND f.Customer = f_s.Customer JOIN Incident i WITH(NOLOCK) ON f.ObjectID = i.Folder JOIN IncidentState i_st WITH(NOLOCK) ON i.State = i_st.ObjectID AND i_st.Category IN (1,2) WHERE f_s.ObjectID = @ObjectID " ); cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, xobj.ObjectID); if (cmd.ExecuteScalar() != null) { throw new XBusinessLogicException("Папка не может быть переведена в состояние \"Закрыто\" или \"Ожидание закрытия\", так как содержит незавершенные инциденты"); } } // добавим в датаграмму подчиненные папки с установленным состоянием новым состояние // Обработка папок зависит от нового состояния fillDataSetWithChildFoldersWithUpdatedState(context.Connection, args.DataSet, xobj.ObjectID, stateNew); } } }