public async Task OpenAirClientGetTimesheets_ShouldParseResult() { var options = new OpenAirOptions("http://localhost/", "MM", "K", "R", "P"); var handler = new MockHttpMessageHandler() .Set("<?xml version=\"1.0\" standalone=\"yes\"?><response><Auth status=\"0\"></Auth ><Read status=\"0\"><Timesheet><status>A</status><userid>722</userid><name>02/25/19 to 03/03/19 PTO</name><total>8.00</total><starts><Date><hour/><minute/><timezone/><second/><month>02</month><day>25</day><year>2019</year></Date></starts><notes>PTO</notes></Timesheet></Read ></response>"); var client = new OpenAirClient(() => handler, options); var date = new DateTime(2000, 10, 10); var results = await client.GetTimesheetsAsync(date, date); var content = Encoding.UTF8.GetString(handler[0].RequestContent); Assert.AreEqual("<request API_version=\"1.0\" client=\"MM\" client_ver=\"1.0\" namespace=\"default\" key=\"K\"><Auth><Login><company>MM</company><user>R</user><password>P</password></Login></Auth><Read type=\"Timesheet\" filter=\"newer-than,older-than\" field=\"starts,starts\" method=\"all\" limit=\"0,1000\"><Date><month>10</month><day>10</day><year>2000</year></Date><Date><month>10</month><day>10</day><year>2000</year></Date><_Return><status/><name /><total/><notes /><userid /><starts /></_Return></Read></request>", content); Assert.AreEqual(1, results.Count); var first = results.First(); Assert.AreEqual(722, first.UserId); Assert.AreEqual(2, first.StartDate.Date.Month); Assert.AreEqual(25, first.StartDate.Date.Day); Assert.AreEqual(2019, first.StartDate.Date.Year); }
/// <inheritdoc/> public async Task <IReadOnlyList <Timesheet> > GetUnsubmittedTimesheetsAsync(DateTime date) { var requiredHours = date.DayOfWeek == DayOfWeek.Saturday ? 40 : (int)date.DayOfWeek * 8; var toweek = date.AddDays(-(double)date.DayOfWeek); var timesheets = await _client.GetTimesheetsAsync( toweek.AddDays(-7), date.AddDays(1)); var unsubmittedTimesheets = timesheets .Where(it => it.Status == "A" || it.Status == "S") .GroupBy(it => it.UserId) .Select(it => new { UserId = it.Key, Name = it.FirstOrDefault()?.Name, Total = it.Where(sheet => sheet.StartDate.Date > toweek).Sum(sheet => sheet.Total) }) .Where(it => it.Total < requiredHours) .ToArray(); var users = await GetUsersWithDepartmentAsync(unsubmittedTimesheets.Select(it => it.UserId)); var result = unsubmittedTimesheets .Select(it => new { timesheet = it, user = users.FirstOrDefault(user => user.OpenAirUserId == it.UserId) }) .Where(it => it.user != null) .Select(it => new Timesheet { Name = it.timesheet.Name, UserName = FormatDisplayName(it.user.Name), UserEmail = it.user.Email, DepartmentName = it.user.Department.Name, Total = it.timesheet.Total }); return(result.ToArray()); }