/// <summary> /// Возвращает список событий как виртуальных так и реальных. /// </summary> /// <param name="filterColl">The filter coll.</param> /// <param name="request">The request.</param> /// <returns></returns> private static IEnumerable <CalendarEventEntity> ListEvents(FilterElementCollection filterColl, CalendarEventListRequest request) { McEvent mcEvent = null; //Конструируем стандартный запрос LIST без критериев содержащих дату начала и конца события ListRequest moListRequest = (ListRequest)EventHelper.ConstructRequest <ListRequest>(request.Target, true); moListRequest.Filters = filterColl.ToArray(); moListRequest.Sorting = request.Sorting; //выполняем стандартный запрос ListResponse listResp = (ListResponse)BusinessManager.Execute(moListRequest); if (listResp != null && listResp.EntityObjects != null) { //Пробегаем по реальным events foreach (CalendarEventEntity entity in listResp.EntityObjects) { mcEvent = EventHelper.LoadCalEvent(entity.PrimaryKeyId.Value); if (mcEvent.IsReccuring) { iCalDateTime dtReccurBase = mcEvent.DTStart; //Пробегаем по виртуальным events foreach (Occurrence occur in mcEvent.GetOccurrences(mcEvent.DTStart, mcEvent.RecurrenceSeriesEndDate)) { //Создаем виртуальные события VirtualEventId vEventId = (VirtualEventId)entity.PrimaryKeyId; vEventId.RecurrenceId = EventHelper.iCalDateTime2Recurrence(dtReccurBase, occur.Period.StartTime); //Set virtual id mcEvent.UID = vEventId.ToString(); //Set recurrence-ID mcEvent.Recurrence_ID = occur.Period.StartTime; mcEvent.DTStart = occur.Period.StartTime; mcEvent.DTEnd = occur.Period.EndTime; EntityObjectHierarchy recurrenceEntity = EventHelper.ConstructEntityHierarchy(mcEvent); CalendarEventEntity occurEventEntity = recurrenceEntity.InnerEntity as CalendarEventEntity; if (occurEventEntity != null) { yield return(occurEventEntity); } } } else { yield return(entity); } } } }
/// <summary> /// Возвращает список CalendarEventResourceEtity в которых есть ресурс c заданным principalId /// </summary> /// <param name="principalId">The principal id.</param> /// <returns></returns> private static List <CalendarEventResourceEntity> GetListCalendarResourceByPrincipalId(int principalId) { List <CalendarEventResourceEntity> retVal = new List <CalendarEventResourceEntity>(); //Конструируем стандартный запрос LIST для ресурсов ListRequest moListRequest = (ListRequest)EventHelper.ConstructRequest <ListRequest>(new CalendarEventResourceEntity(), true); moListRequest.Filters = new FilterElement[] { new FilterElement(CalendarEventResourceEntity.FieldPrincipalId, FilterElementType.Equal, principalId) }; //выполняем стандартный запрос ListResponse listResp = (ListResponse)BusinessManager.Execute(moListRequest); if (listResp != null && listResp.EntityObjects != null) { retVal.AddRange(Array.ConvertAll <EntityObject, CalendarEventResourceEntity>(listResp.EntityObjects, delegate(EntityObject entity) { return(entity as CalendarEventResourceEntity); })); } return(retVal); }
/// <summary> /// Updates the resources. /// </summary> /// <param name="request">The request.</param> public static void UpdateResources(CalendarEventUpdateResourcesRequest request) { if (request == null) { throw new ArgumentNullException("request"); } ListRequest listRequest = null; ListResponse listResponse = null; //Get the event primary key from target PrimaryKeyId eventId = request.Target.PrimaryKeyId.Value; //Возможные новые pk Dictionary <PrimaryKeyId, PrimaryKeyId> primaryKeyMap = null; List <ResourceActionWrapper> resourceActions = new List <ResourceActionWrapper>(); //Determine update or create actions foreach (EntityObject entityObject in request.EntityObjects) { if (entityObject.MetaClassName == CalendarEventResourceEntity.ClassName) { //Assign eventId properties entityObject[CalendarEventResourceEntity.FieldEventId] = eventId; listRequest = (ListRequest)EventHelper.ConstructRequest <ListRequest>(entityObject, false); listRequest.Filters = ConstructFilterByEntity(entityObject); listResponse = (ListResponse)BusinessManager.Execute(listRequest); //BusinessManager.List(entityObject.MetaClassName, ConstructFilterByEntity(entityObject)); if (listResponse.EntityObjects.Length != 0) { //Update disable //foreach (EntityObject existEntity in listResponse.EntityObjects) //{ // entityObject.PrimaryKeyId = existEntity.PrimaryKeyId; // resourceActions.Add(new ResourceActionWrapper(entityObject, new UpdateRequest())); //} } else { resourceActions.Add(new ResourceActionWrapper(entityObject, new CreateRequest())); } } } //Determine delete action listRequest = (ListRequest)EventHelper.ConstructRequest <ListRequest>(new CalendarEventResourceEntity(), false); listRequest.Filters = new FilterElement[] { new FilterElement(CalendarEventResourceEntity.FieldEventId, FilterElementType.Equal, eventId) }; listResponse = (ListResponse)BusinessManager.Execute(listRequest); foreach (CalendarEventResourceEntity resourceEntity in listResponse.EntityObjects) { EntityComparer entityComp = new EntityComparer(resourceEntity, CalendarEventResourceEntity.ComparedProperties); if (Array.Find <EntityObject>(request.EntityObjects, entityComp.CompareEntity) == null) { resourceActions.Add(new ResourceActionWrapper(resourceEntity, new DeleteRequest())); } } //Пытаемся разбить event на exception if (resourceActions.Count != 0) { bool exceptionCreated; primaryKeyMap = EventHelper.PrepareChangeData((VirtualEventId)eventId, out exceptionCreated); } //Execute action foreach (ResourceActionWrapper resourceAction in resourceActions) { //получаем возможно новый pk event eventId = EventHelper.FindDestiantionId(primaryKeyMap, eventId); //получаем возможно новый pk resource if (resourceAction.ResourceEntity.PrimaryKeyId != null) { resourceAction.ResourceEntity.PrimaryKeyId = EventHelper.FindDestiantionId(primaryKeyMap, resourceAction.ResourceEntity.PrimaryKeyId.Value); } //записываем возможно изменившийся pk event-a resourceAction.ResourceEntity[CalendarEventResourceEntity.FieldEventId] = eventId; //вызываем запросы на модификацию BusinessManager.Execute(resourceAction.ResourceActionRequest); } }