public static QueryExpression Build(GetEntryTimeRangeRequest request) { request.ArgumentNotNull(nameof(request)); var query = new QueryExpression(TimeEntry.Name) { ColumnSet = new ColumnSet(new[] { TimeEntry.Properties.Start }), Criteria = new FilterExpression { Conditions = { new ConditionExpression { AttributeName = TimeEntry.Properties.Start, Operator = ConditionOperator.Between, Values = { request.Start.Date, request.End.EndOfTheDay() } }, new ConditionExpression(TimeEntry.Properties.BookableResource, ConditionOperator.Equal, request.ResourceId) } } }; return(query); }
private DataCollection <Entity> GetTimeEntries(GetEntryTimeRangeRequest request, XrmFakedContext context) { var queryExpression = new QueryExpression(TimeEntry.Name) { ColumnSet = new ColumnSet(new[] { TimeEntry.Properties.Duration, TimeEntry.Properties.BookableResource, TimeEntry.Properties.Start, TimeEntry.Properties.End }), Criteria = new FilterExpression { Conditions = { new ConditionExpression { AttributeName = TimeEntry.Properties.Start, Operator = ConditionOperator.Between, Values = { request.Start.Date, request.End.Date.EndOfTheDay() } }, new ConditionExpression(TimeEntry.Properties.BookableResource, ConditionOperator.Equal, request.ResourceId) } } }; return(context.GetOrganizationService().RetrieveMultiple(queryExpression).Entities); }
public void CreationOnlyNonExistingTimeEntriesTest() { XrmFakedContext context = new XrmFakedContext(); Guid resourseId = Guid.NewGuid(); DateTime startDate = new DateTime(2000, 1, 1, 9, 0, 0, DateTimeKind.Utc); TimeSpan duration = TimeSpan.FromDays(2); var targetTimeEntry = EntityFactory.CreateTimeEntry(startDate, duration, resourseId); var existingEntryStart = startDate.AddDays(1); var existingEntryDuration = TimeSpan.FromHours(2); context.Initialize(new List <Entity> { EntityFactory.CreateTimeEntry(existingEntryStart, existingEntryDuration, resourseId), }); var request = new GetEntryTimeRangeRequest(startDate, startDate + duration, resourseId); var entitiesBeforeCreation = GetTimeEntries(request, context); Assert.AreEqual(1, entitiesBeforeCreation.Count); // One TimeEnrty exists, 1 should be added before existing one and 1 should be added after existing one PreOperationAndThenCreate(context, targetTimeEntry); var entitiesAfterCreation = GetTimeEntries(request, context); var timeEntries = entitiesAfterCreation.Select(e => TimeEntryDtoConverter.ConvertToDto(e)).ToArray(); Assert.AreEqual(3, timeEntries.Length); var existingTimeEntry = timeEntries[0]; Assert.AreEqual(existingTimeEntry.BookableResource.Id, resourseId); Assert.AreEqual(existingTimeEntry.Start, existingEntryStart); Assert.AreEqual(existingTimeEntry.End, existingEntryStart + existingEntryDuration); var firstNewTimeEntry = timeEntries[1]; Assert.AreEqual(firstNewTimeEntry.BookableResource.Id, resourseId); Assert.AreEqual(firstNewTimeEntry.Start, startDate.Date.AddDays(2)); Assert.AreEqual(firstNewTimeEntry.End, startDate.Date.AddDays(2).EndOfTheDay()); // a new time entry before the existing one is a changed "target" TimeEntry // the "target" TimeEntry is created last var secondNewTimeEntry = timeEntries[2]; Assert.AreEqual(secondNewTimeEntry.BookableResource.Id, resourseId); Assert.AreEqual(secondNewTimeEntry.Start, startDate); Assert.AreEqual(secondNewTimeEntry.End, startDate.EndOfTheDay()); }