public static void ProcessHandler(int handlerId, string argument, int hookId, int?objectId, Guid?objectUid, DateTime dateValue) { ObjectTypes objectType = ObjectTypes.UNDEFINED; DateTypes dateType = DateTypes.Undefined; if (handlerId == (int)DateTypeHandlers.SendReminder) { // Напоминать только о тех датах, которые еще не наступили. if (dateValue >= DateTime.UtcNow) { bool sendReminder = false; int userId = -1; using (IDataReader reader = DbSchedule2.GetReminderSubscriptionByHookId(hookId)) { if (reader.Read()) { sendReminder = true; if (reader["UserId"] != DBNull.Value) { userId = (int)reader["UserId"]; // O.R. [2010-04-01]: Don't process inactive user if (User.GetUserActivity(userId) != User.UserActivity.Active) { sendReminder = false; } } objectType = (ObjectTypes)reader["ObjectTypeId"]; dateType = (DateTypes)reader["DateTypeId"]; } } // Не напоминать о досрочно запущенных или досрочно завершённых объектах [2007-02-16] if (sendReminder) { sendReminder = ConfirmNotification(objectType, dateType, objectId, objectUid); } if (sendReminder) { SubscriptionTypes subscriptionType = (SubscriptionTypes)int.Parse(argument, CultureInfo.InvariantCulture); switch (subscriptionType) { case SubscriptionTypes.Global: ProcessGlobalSubscription(hookId, dateType, objectType, objectId, objectUid); break; case SubscriptionTypes.Personal: ProcessPersonalSubscription(hookId, dateType, userId, objectType, objectId, objectUid); break; case SubscriptionTypes.PersonalForObject: ProcessPersonalSubscriptionForObject(hookId, dateType, userId, objectType, objectId, objectUid); break; } } } } else if (handlerId == (int)DateTypeHandlers.RaiseSystemEvent) { bool raiseEvent = false; using (IDataReader reader = DbSchedule2.GetHook(hookId)) { if (reader.Read()) { raiseEvent = true; objectType = (ObjectTypes)reader["ObjectTypeId"]; dateType = (DateTypes)reader["DateTypeId"]; } } if (raiseEvent) { // Не уведомлять о досрочно запущенных или досрочно завершённых объектах [2008-07-29] raiseEvent = ConfirmNotification(objectType, dateType, objectId, objectUid); if (raiseEvent) { SystemEventTypes EventType = (SystemEventTypes)int.Parse(argument); if (objectId.HasValue) { SystemEvents.AddSystemEvents(EventType, objectId.Value); } else if (objectUid.HasValue) { SystemEvents.AddSystemEvents(EventType, objectUid.Value); } } if (objectType == ObjectTypes.Task) { Task.RecalculateAllStates(Task.GetProject(objectId.Value)); } else if (objectType == ObjectTypes.ToDo) { ToDo.RecalculateState(objectId.Value); } else if (objectType == ObjectTypes.CalendarEntry) { CalendarEntry.RecalculateState(objectId.Value); } } } else if (handlerId == (int)DateTypeHandlers.BatchAlert) { if (objectId.HasValue) { Alerts2.SendBatch(objectId.Value, dateValue); } } else if (handlerId == (int)DateTypeHandlers.LdapSync) { if (objectId.HasValue) { Ldap.Synchronize(objectId.Value, dateValue); } } }
internal static void UpdateTimeline(int eventId, DateTime startDate, DateTime finishDate, bool checkAccess) { if (checkAccess) { VerifyCanUpdate(eventId); } int TimeZoneId = Security.CurrentUser.TimeZoneId; startDate = DBCommon.GetUTCDate(TimeZoneId, startDate); finishDate = DBCommon.GetUTCDate(TimeZoneId, finishDate); int projectId = -1; bool hasRecurrence = false; using (IDataReader reader = CalendarEntry.GetEvent(eventId, false)) { if (reader.Read()) { if (reader["ProjectId"] != DBNull.Value) { projectId = (int)reader["ProjectId"]; } hasRecurrence = ((int)reader["HasRecurrence"] == 1); } } // O.R. [2009-12-18] Dates for recurrent events should be chnaged in recurrence editing. if (hasRecurrence) { return; } TimeSpan ts = finishDate.Subtract(startDate); int taskTime = (int)ts.TotalMinutes; using (DbTransaction tran = DbTransaction.Begin()) { int retVal = DbCalendarEntry2.UpdateTimeline(eventId, startDate, finishDate, taskTime); if (retVal > 0) { SystemEvents.AddSystemEvents(SystemEventTypes.CalendarEntry_Updated_Timeline, eventId); if (!hasRecurrence) { if (retVal == 1 || retVal == 3) { Schedule.UpdateDateTypeValue(DateTypes.CalendarEntry_StartDate, eventId, startDate); } if (retVal == 2 || retVal == 3) { Schedule.UpdateDateTypeValue(DateTypes.CalendarEntry_FinishDate, eventId, finishDate); } } else { // O.R.[2009-09-29]: Recalculate events dates for scheduling Schedule.DeleteDateTypeValue(DateTypes.CalendarEntry_StartDate, eventId); Schedule.DeleteDateTypeValue(DateTypes.CalendarEntry_FinishDate, eventId); int ReminderInterval; Hashtable ret = CalendarEntry.GetEventInstances(eventId, out ReminderInterval); foreach (DateTime dtStart in ret.Keys) { DateTime dtEnd = (DateTime)ret[dtStart]; if (dtStart > DateTime.UtcNow && dtEnd > DateTime.UtcNow) { DbSchedule2.AddNewDateTypeValue((int)DateTypes.CalendarEntry_StartDate, eventId, dtStart); DbSchedule2.AddNewDateTypeValue((int)DateTypes.CalendarEntry_FinishDate, eventId, dtEnd); } } } // O.R: Recalculating project TaskTime if (projectId > 0) { TimeTracking.RecalculateProjectTaskTime(projectId); } } CalendarEntry.RecalculateState(eventId); tran.Commit(); } }