public async Task ExecuteAsync(AnonymizeBookingsCommand command, IExecutionContext executionContext) { PermissionValidationService.EnforceCustomEntityPermission <CustomEntityDeletePermission>(BookingCustomEntityDefinition.DefinitionCode, executionContext.UserContext); var query = new SearchBookingSummariesQuery { BookingState = new BookingDataModel.BookingStateType[] { BookingDataModel.BookingStateType.Closed }, Start = new DateTime(2000, 1, 1), End = DateTime.Now.AddYears(-3) }; command.AnonymizedCount = 0; foreach (KeyValuePair <int, BookingDataModel> bookingEntry in (await BookingProvider.FindBookingDataInInterval(query)).ToList()) { BookingDataModel booking = bookingEntry.Value; // Protected agains mistakes in the query by checking values again if (!booking.IsArchived && booking.BookingState == BookingDataModel.BookingStateType.Closed && booking.DepartureDate.Value.AddYears(3) < DateTime.Now) { booking.TenantName = "---"; booking.Purpose = "---"; booking.ContactName = "---"; booking.ContactEMail = "ukendt@ukendte-mailmodtagere"; booking.ContactPhone = "---"; booking.ContactAddress = "---"; booking.ContactCity = "---"; booking.Comments = "---"; foreach (var document in booking.Documents) { var deleteDocumentCommand = new DeleteDocumentCommand { Id = document.DocumentId }; await CommandExecutor.ExecuteAsync(deleteDocumentCommand); } booking.LogEntries.Clear(); booking.Documents.Clear(); booking.IsArchived = true; command.AnonymizedCount++; UpdateCustomEntityDraftVersionCommand updateCmd = new UpdateCustomEntityDraftVersionCommand { CustomEntityDefinitionCode = BookingCustomEntityDefinition.DefinitionCode, CustomEntityId = bookingEntry.Key, Title = booking.MakeTitle(), Publish = true, Model = booking }; await DomainRepository.CustomEntities().Versions().UpdateDraftAsync(updateCmd); } } }
public async Task ExecuteAsync(SendStatusMailCommand command, IExecutionContext executionContext) { DateTime startDate = DateTime.Now.AddDays(-14); DateTime endDate = DateTime.Now.AddDays(14); string calendarContent = await StatusMailProvider.BuildStatusCalendar(startDate, endDate); SearchBookingSummariesQuery query = new SearchBookingSummariesQuery { Start = new DateTime(DateTime.Now.Year, 1, 1), End = new DateTime(DateTime.Now.Year, 12, 31), //BookingState = new BookingDataModel.BookingStateType[] { BookingDataModel.BookingStateType.Requested, BookingDataModel.BookingStateType.Approved } }; var bookings = (await BookingProvider.FindBookingsInInterval(query)).Where(b => !b.IsCancelled).ToList(); int bookingCount = bookings.Count; decimal bookingTotalIncome = bookings.Sum(b => b.RentalPrice ?? 0.0M); TemplateDataModel template = await TemplateProvider.GetTemplateByName("statusmail"); Dictionary <string, object> mergeData = new Dictionary <string, object> { ["date"] = DateTime.Now.Date, ["bookingCount"] = bookingCount, ["bookingTotalIncome"] = bookingTotalIncome, ["calendar"] = calendarContent }; string mailContent = TemplateProvider.MergeText(template.Text, mergeData); MailAddress to = new MailAddress(Settings.MailReceiver); MailMessage message = new MailMessage { To = to, Subject = "Bøgevang statusopdatering", HtmlBody = mailContent }; await MailDispatchService.DispatchAsync(message); }
public async Task <JsonResult> Get([FromBody] SearchBookingSummariesQuery query) { IList <BookingSummary> bookings = await QueryExecutor.ExecuteAsync(query); return(ApiResponseHelper.SimpleQueryResponse(bookings)); }
protected async Task <IEnumerable <CacheEntry> > FindBookingsInInterval_Internal(SearchBookingSummariesQuery query) { await EnsureCacheLoaded(); if (!string.IsNullOrEmpty(query.BookingNumber)) { if (int.TryParse(query.BookingNumber, out int bookingNumber)) { var booking = Cache.FirstOrDefault(b => b.DataModel.BookingNumber == bookingNumber); if (booking == null) { return(null); } return(new CacheEntry[] { booking }); } else { return(null); } } DateTime startValue = query?.Start ?? new DateTime(2000, 1, 1); DateTime endValue = query?.End ?? new DateTime(3000, 1, 1); if (query.Year != null && query.Start == null && query.End == null) { if (int.TryParse(query.Year, out int year)) { startValue = new DateTime(year, 1, 1); endValue = new DateTime(year + 1, 1, 1); } } var filtered = Cache // Calculate interval overlap .Where(b => b.DataModel.ArrivalDate <= endValue && b.DataModel.DepartureDate >= startValue); if (query?.BookingState != null) { filtered = filtered .Where(b => query.BookingState.Contains(b.DataModel.BookingState.Value)); } if (query?.IsCancelled != null) { filtered = filtered .Where(b => b.DataModel.IsCancelled == query.IsCancelled.Value); } if (query?.OrderBy == SearchBookingSummariesQuery.OrderByType.ArrivalDate) { if (query?.SortDirection == SearchBookingSummariesQuery.SortDirectionType.Asc) { filtered = filtered.OrderBy(b => b.DataModel.ArrivalDate); } else { filtered = filtered.OrderByDescending(b => b.DataModel.ArrivalDate); } } else { if (query?.SortDirection == SearchBookingSummariesQuery.SortDirectionType.Asc) { filtered = filtered.OrderBy(b => b.Entity.CreateDate); } else { filtered = filtered.OrderByDescending(b => b.Entity.CreateDate); } } return(filtered); }
public async Task <IList <BookingSummary> > FindBookingsInInterval(SearchBookingSummariesQuery query) { return((await FindBookingsInInterval_Internal(query)).Select(b => b.Summary).ToList()); }
public async Task <IList <KeyValuePair <int, BookingDataModel> > > FindBookingDataInInterval(SearchBookingSummariesQuery query) { return((await FindBookingsInInterval_Internal(query)) .Select(b => new KeyValuePair <int, BookingDataModel>(b.Entity.CustomEntityId, b.DataModel)).ToList()); }
public async Task<IDictionary<string, object>> BuildStatusCalendarContent(DateTime startDate, DateTime endDate) { SearchBookingSummariesQuery query = new SearchBookingSummariesQuery { Start = startDate, End = endDate, BookingState = new BookingDataModel.BookingStateType[] { BookingDataModel.BookingStateType.Requested, BookingDataModel.BookingStateType.Approved } }; var bookings = await BookingProvider.FindBookingsInInterval(query); var expandedBookingDays = bookings.SelectMany(b => b.ExpandDays()).ToDictionary( b => b.Date.ToString("yyyy-MM-dd"), b => b.Booking); List<Dictionary<string, object>> dates = new List<Dictionary<string, object>>(); var today = DateTime.Now.ToString("yyyy-MM-dd"); for (DateTime day = startDate; day < endDate; day = day.AddDays(1)) { string dayString = day.ToString("yyyy-MM-dd"); Dictionary<string, object> dayData = new Dictionary<string, object>(); dayData["date"] = day; dayData["dateString"] = dayString; string rowColor = "transparent"; string dateColor = "transparent"; if (today == dayString) { rowColor = "#90EE90"; } else if (day.DayOfWeek == DayOfWeek.Saturday) { dateColor = "#D3D3D3"; } if (day.DayOfWeek == DayOfWeek.Sunday) { rowColor = "#D3D3D3"; } dayData["rowColor"] = rowColor; dayData["dateColor"] = dateColor; if (expandedBookingDays.TryGetValue(dayString, out BookingSummary booking)) { dayData["bookingNumber"] = booking.BookingNumber; dayData["bookingAlert"] = booking.AlertMessage; dayData["bookingPurpose"] = booking.Purpose; dayData["bookingContactName"] = booking.ContactName; } dates.Add(dayData); } await LoadElectricityTimeSeries(startDate, endDate, dates); Dictionary<string, object> result = new Dictionary<string, object>(); result["dates"] = dates; return result; }