Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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));
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public async Task <IList <BookingSummary> > FindBookingsInInterval(SearchBookingSummariesQuery query)
 {
     return((await FindBookingsInInterval_Internal(query)).Select(b => b.Summary).ToList());
 }
Beispiel #6
0
 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;
    }