/// <summary> /// <paramref name="start"/> 일부터 <paramref name="offset"/> 만큼의 일수가 지난 후의 날짜를 구합니다. /// </summary> /// <param name="start">기준 일자</param> /// <param name="offset">오프셋</param> /// <returns>기준일자로부터 오프셋만큼 떨어진 일자</returns> public DayRange FindDay(DayRange start, int offset = 1) { if (IsDebugEnabled) { log.Debug("Day 찾기... 시작일=[{0}], offset=[{1}]", start, offset); } if (offset == 0) { return(start); } DaySeekerContext context = new DaySeekerContext(start, offset); var visitDir = SeekDirection; if (offset < 0) { visitDir = (visitDir == SeekDirection.Forward) ? SeekDirection.Backward : SeekDirection.Forward; } StartDayVisit(start, context, visitDir); if (IsDebugEnabled) { log.Debug("Day 찾기... 시작일=[{0}], offset=[{1}], foundDay=[{2}]", start, offset, context.FoundDay); } return(context.FoundDay); }
public void Properties_Ok() { var target = new DayRange(new Date(2020, 6, 12)); Assert.Equal(6, target.Month); Assert.Equal(2020, target.Year); }
public void SeekDirectionTest() { var start = new DayRange(); var daySeeker = new DaySeeker(); Enumerable .Range(-10, 20) .RunEach(i => { var offset = i * 5; var day = daySeeker.FindDay(start, offset); day.IsSamePeriod(start.AddDays(offset)).Should().Be.True(); }); var backwardSeeker = new DaySeeker(SeekDirection.Backward); Enumerable .Range(-10, 20) .RunEach(i => { var offset = i * 5; var day = backwardSeeker.FindDay(start, offset); day.IsSamePeriod(start.AddDays(-offset)).Should().Be.True(); }); }
public void Ctor_FromToValid_Ok() { var target = new DayRange(new Date(2020, 6, 12)); Assert.Equal(Date(2020, 6, 12).StartOfTheDay(), target.From); Assert.Equal(Date(2020, 6, 12).EndOfTheDay(), target.To); }
public static string ToFriendlyString(this DayRange range) { switch (range) { case DayRange.DueIn14: return("Next 14 Days"); case DayRange.DueIn29: return("15-29 Days"); case DayRange.DueIn44: return("30-44 Days"); case DayRange.DueIn89: return("45-89 Days"); case DayRange.DueIn90Plus: return("90+ Days"); case DayRange.Overdue: return("Overdue"); default: return(range.ToString()); } }
protected override bool OnVisitDay(DayRange day, DaySeekerContext context) { day.ShouldNotBeNull("dayRange"); if (context.IsFinished) { return(false); } if (day.IsSamePeriod(context.StartDay)) { return(true); } if (IsMatchingDay(day, context) == false) { return(true); } if (CheckLimits(day) == false) { return(true); } context.ProcessDay(day); // context가 찾기를 완료하면, Visit를 중단하도록 합니다. return(!context.IsFinished); }
public DaySeekerContext(DayRange startDay, int dayCount) { startDay.ShouldNotBeNull("startDay"); StartDay = startDay; DayCount = Math.Abs(dayCount); RemaingDays = DayCount; }
IList <Guid> IAccountReportsRepository.GetLastLogIns(UserType userType, DayRange day) { using (var dc = CreateDataContext(true)) { return((from u in GetEnabledUsers(dc, userType) let lastLogInDate = (from v in dc.UserLoginEntities where v.userId == u.id select v.time).Max() where lastLogInDate >= day.Start.Value && lastLogInDate < day.End.Value select u.id).Distinct().ToList()); } }
protected override bool OnVisitMonth(MonthRange month, CalendarPeriodCollectorContext context) { if (IsDebugEnabled) { log.Debug("Month[{0}]를 탐색합니다...", month); } if (context.Scope != CalendarPeriodCollectorContext.CollectKind.Day) { return(true); // continue } // all month if (Filter.CollectingDays.Count == 0) { var days = month.GetDays().Where(d => IsMatchingDay(d, context) && CheckLimits(d)); _periods.AddAll(days.Cast <ITimePeriod>().AsEnumerable()); } else { var days = Filter.CollectingDays .Select(day => { if (day.IsSingleDay) { var dayRange = new DayRange(month.Year, month.Month, day.Min, month.TimeCalendar); if (IsMatchingDay(dayRange, context) && CheckLimits(dayRange)) { return(dayRange); } } else { var dayRanges = new DayRangeCollection(month.Year, month.Month, day.Min, day.Max - day.Min, month.TimeCalendar); var isMatching = dayRanges.GetDays().All(d => IsMatchingDay(d, context)); if (isMatching && CheckLimits(dayRanges)) { return((ITimePeriod)dayRanges); } } return(null); }) .Where(d => d != null); _periods.AddAll(days.Cast <ITimePeriod>().AsEnumerable()); } return(false); // abort }
public void ProcessDay(DayRange day) { if (IsFinished) { return; } RemaingDays -= 1; if (IsFinished) { FoundDay = day; } }
public async Task <List <DayWeight> > GetWeightBetween(DayPoint startDate, DayPoint endDate) { var list = await Where(w => (w.Date.Year == startDate.Year && w.Date.Year < endDate.Year && w.Date.DayOfYear >= startDate.Day) || (w.Date.Year == startDate.Year && w.Date.Year == endDate.Year && w.Date.DayOfYear >= startDate.Day && w.Date.DayOfYear <= endDate.Day) || (w.Date.Year > startDate.Year && w.Date.Year < endDate.Year) || (w.Date.Year == endDate.Year && w.Date.Year > startDate.Year && w.Date.Day <= endDate.Day)) .Select(w => new DayWeight() { DayPoint = new DayPoint() { Day = w.Date.DayOfYear, Year = w.Date.Year }, Weight = w.Value }).ToListAsync(); if (list.Any() == false) { return(list); } list = list.OrderBy(w => w.DayPoint).ToList(); DayWeight last = list[0]; DayRange dayRange = new DayRange(startDate, endDate); dayRange.ForEach(d => { var weight = list.FirstOrDefault(w => w.DayPoint == d); if (weight != null) { last = weight; } else { list.Add(new DayWeight() { Weight = last.Weight, DayPoint = d }); } }); return(list); }
private Dictionary <string, CommunicationReport> GetCommunicationReports(DayRange day) { const string method = "GetCommunicationReports"; try { return(_communicationReportsQuery.GetCommunicationReport(day).ToDictionary(x => x.Key, x => x.Value)); } catch (Exception ex) { // Just log. EventSource.Raise(Event.Error, method, "Cannot get the daily communication reports.", ex); return(new Dictionary <string, CommunicationReport>()); } }
protected override bool OnVisitDay(DayRange day, CalendarPeriodCollectorContext context) { if (IsDebugEnabled) { log.Debug("Day[{0}]를 탐색합니다...", day); } if (context.Scope != CalendarPeriodCollectorContext.CollectKind.Hour) { return(true); // continue } // all month if (Filter.CollectingHours.Count == 0) { var hours = day.GetHours().Where(h => IsMatchingHour(h, context) && CheckLimits(h)); _periods.AddAll(hours.Cast <ITimePeriod>().AsEnumerable()); } else if (IsMatchingDay(day, context)) { var hours = Filter.CollectingHours .Select(hour => { var startTime = hour.Start.GetDateTime(day.Start); var endTime = hour.End.GetDateTime(day.Start); var hourRanges = new CalendarTimeRange(startTime, endTime, day.TimeCalendar); if (CheckExcludePeriods(hourRanges) && CheckLimits(hourRanges)) { return((ITimePeriod)hourRanges); } return(null); }) .Where(h => h != null); _periods.AddAll(hours.AsEnumerable()); } return(false); // abort }
public void SimpleForwardTest() { var start = new DayRange(); var daySeeker = new DaySeeker(); var day1 = daySeeker.FindDay(start, 0); day1.IsSamePeriod(start).Should().Be.True(); var day2 = daySeeker.FindDay(start, 1); day2.IsSamePeriod(start.GetNextDay()).Should().Be.True(); Enumerable .Range(-10, 20) .RunEach(i => { var offset = i * 5; var day = daySeeker.FindDay(start, offset); day.IsSamePeriod(start.AddDays(offset)).Should().Be.True(); }); }
protected DayRange StartDayVisit(DayRange day, TContext context, SeekDirection?visitDirection = null) { day.ShouldNotBeNull("day"); var direction = visitDirection ?? SeekDirection; if (IsDebugEnabled) { log.Debug("Day 단위로 탐색합니다. day=[{0}], context=[{1}], direction=[{2}]", day, context, direction); } DayRange lastVisited = null; OnVisitStart(); var minStart = DateTime.MinValue; var maxEnd = DateTime.MaxValue.AddYears(-1); var offset = (direction == SeekDirection.Forward) ? 1 : -1; while (day.Start > minStart && day.End < maxEnd) { if (OnVisitDay(day, context) == false) { lastVisited = day; break; } day = day.AddDays(offset); } OnVisitEnd(); if (IsDebugEnabled) { log.Debug("마지막 탐색 Day. lastVisited=[{0}]", lastVisited); } return(lastVisited); }
public void SeekWeekendHolidayTest() { var start = new DayRange(new DateTime(2011, 2, 15)); var filter = new CalendarVisitorFilter(); filter.AddWorkingWeekDays(); filter.ExcludePeriods.Add(new DayRangeCollection(2011, 2, 27, 14)); // 14 days -> week 9 and 10 var daySeeker = new DaySeeker(filter); var day1 = daySeeker.FindDay(start, 3); // wtihtin the same working week day1.IsSamePeriod(new DayRange(2011, 2, 18)).Should().Be.True(); var day2 = daySeeker.FindDay(start, 4); // 주말(19,20) 제외 21일 월요일 day2.IsSamePeriod(new DayRange(2011, 2, 21)).Should().Be.True(); var day3 = daySeeker.FindDay(start, 10); // 2월27일부터 14일간 휴가로 제외 기간을 설정했음. day3.IsSamePeriod(new DayRange(2011, 3, 15)).Should().Be.True(); }
public void SimpleBackwardTest() { var start = new DayRange(); var daySeeker = new DaySeeker(SeekDirection.Backward); var day1 = daySeeker.FindDay(start, 0); day1.IsSamePeriod(start).Should().Be.True(); var day2 = daySeeker.FindDay(start, 1); day2.IsSamePeriod(start.GetPreviousDay()).Should().Be.True(); Enumerable .Range(-10, 20) .RunEach(i => { var offset = i * 5; var day = daySeeker.FindDay(start, offset); day.IsSamePeriod(start.AddDays(-offset)).Should().Be.True(); }); }
protected virtual bool IsMatchingDay(DayRange day, TContext context) { if (Filter.Years.Count > 0 && Filter.Years.Contains(day.Year) == false) { return(false); } if (Filter.Months.Count > 0 && Filter.Months.Contains(day.Month) == false) { return(false); } if (Filter.Days.Count > 0 && Filter.Days.Contains(day.Day) == false) { return(false); } if (Filter.WeekDays.Count > 0 && Filter.WeekDays.Contains(day.DayOfWeek) == false) { return(false); } return(CheckExcludePeriods(day)); }
protected virtual bool OnVisitDay(DayRange day, TContext context) { return(true); }
protected virtual bool EnterHours(DayRange day, TContext context) { return(true); }
IDictionary <string, CommunicationReport> ICommunicationReportsQuery.GetCommunicationReport(DayRange day) { return(_repository.GetCommunicationReport(day)); }
IList <Guid> IAccountReportsQuery.GetLastLogIns(UserType userType, DayRange day) { return(_repository.GetLastLogIns(userType, day)); }
protected override bool EnterHours(DayRange day, CalendarPeriodCollectorContext context) { return((int)context.Scope > (int)CalendarPeriodCollectorContext.CollectKind.Hour); }
DailyReport IDailyReportsQuery.GetDailyReport(DayRange day) { var week = new DateTimeRange(day.Start.Value.AddDays(-7), day.End.Value); var month = new DateTimeRange(day.Start.Value.AddMonths(-1), day.End.Value); var web = _channelsQuery.GetChannel("Web"); var api = _channelsQuery.GetChannel("API"); var channels = new[] { web, api }; var userTypes = new[] { UserType.Member, UserType.Employer, UserType.Administrator, UserType.Custodian }; return(new DailyReport { Day = day, OpenJobAds = _jobAdReportsQuery.GetOpenJobAds(), ResumeSearchAlerts = _memberSearchReportsQuery.GetMemberSearchAlerts(), JobSearchAlerts = _jobAdSearchReportsQuery.GetJobAdSearchAlerts(), JobSearches = _jobAdSearchReportsQuery.GetJobAdSearches(day), InternalJobApplications = _jobAdReportsQuery.GetInternalApplications(day), ExternalJobApplications = _jobAdReportsQuery.GetExternalApplications(day), InvitationsSent = _networkingReportsQuery.GetInvitationsSent(day), InvitationsAccepted = _networkingReportsQuery.GetInvitationsAccepted(day), AcceptanceRateLast48Hours = (int)_networkingReportsQuery.Get48HourInvitationAcceptancePercent(), AcceptanceRatePreviousMonth = (int)_networkingReportsQuery.GetMonthlyInvitationAcceptancePercent(), MemberReport = new MemberReport { Total = _accountReportsQuery.GetUsers(UserType.Member, day.End.Value), Enabled = _accountReportsQuery.GetEnabledUsers(UserType.Member, day.End.Value), Active = _accountReportsQuery.GetActiveUsers(UserType.Member, day.End.Value), New = _accountReportsQuery.GetNewUsers(UserType.Member, day), }, ResumeReport = new ResumeReport { Total = _resumeReportsQuery.GetResumes(day.End.Value), Searchable = _resumeReportsQuery.GetSearchableResumes(day.End.Value), New = _resumeReportsQuery.GetNewResumes(day), Uploaded = _resumeReportsQuery.GetUploadedResumes(day), Reloaded = _resumeReportsQuery.GetReloadedResumes(day), Edited = _resumeReportsQuery.GetEditedResumes(day), Updated = _resumeReportsQuery.GetUpdatedResumes(day), }, // Logins. DailyLogIns = (from u in userTypes select new { UserType = u, LogIns = _accountReportsQuery.GetLogIns(u, day) }).ToDictionary(x => x.UserType, x => x.LogIns), WeeklyLogIns = (from u in userTypes select new { UserType = u, LogIns = _accountReportsQuery.GetLogIns(u, week) }).ToDictionary(x => x.UserType, x => x.LogIns), MonthlyLogIns = (from u in userTypes select new { UserType = u, LogIns = _accountReportsQuery.GetLogIns(u, month) }).ToDictionary(x => x.UserType, x => x.LogIns), // Member search reports. MemberSearchReports = (from c in channels select new { c.Name, Report = new MemberSearchReport { TotalSearches = _memberSearchReportsQuery.GetMemberSearches(c, day), FilterSearches = _memberSearchReportsQuery.GetFilterMemberSearches(c, day), SavedSearches = _memberSearchReportsQuery.GetSavedMemberSearches(c, day), AnonymousSearches = _memberSearchReportsQuery.GetAnonymousMemberSearches(c, day), } }).ToDictionary(x => x.Name, x => x.Report), MemberViewingReports = (from c in channels select new { c.Name, Report = _employerMemberAccessReportsQuery.GetEmployerMemberViewingReport(c, day), }).ToDictionary(x => x.Name, x => x.Report), MemberAccessReports = (from c in channels select new { c.Name, Report = _employerMemberAccessReportsQuery.GetEmployerMemberAccessReport(c, day), }).ToDictionary(x => x.Name, x => x.Report), // Others. OrderReports = _orderReportsQuery.GetOrderReports(day), CommunciationReports = GetCommunicationReports(day), PromotionCodeReports = _registrationReportsQuery.GetPromotionCodeReports(day).ToDictionary(x => x.Key, x => x.Value), JobAdIntegrationReports = GetJobAdIntegrationReports(day), }); }
protected override bool EnterHours(DayRange day, DaySeekerContext context) { return(false); // !context.IsFinished; }
IDictionary <string, PromotionCodeReport> IRegistrationReportsQuery.GetPromotionCodeReports(DayRange day) { var promotionCodeReports = new Dictionary <string, PromotionCodeReport>(); GetNewMembers(promotionCodeReports, day); return(promotionCodeReports.ToDictionary(x => x.Key, x => x.Value)); }
IDictionary <string, CommunicationReport> ICommunicationsRepository.GetCommunicationReport(DayRange day) { using (var dc = CreateDataContext(true)) { var startTicks = day.Start.Value.Ticks; var endTicks = day.End.Value.Ticks; return((from d in (from d in (from c in dc.TrackingCommunicationEntities where !Equals(c.definition, null) select c.definition).Distinct() select d) select new { Definition = d, Sent = (from c in dc.TrackingCommunicationEntities where c.definition == d && c.sent >= startTicks && c.sent < endTicks select c).Count(), Opened = (from c in dc.TrackingCommunicationEntities where c.definition == d && c.sent >= startTicks && c.sent < endTicks && ( (from o in dc.TrackingCommunicationOpenedEntities where o.id == c.id select o).Any() || (from l in dc.TrackingCommunicationLinkEntities join lc in dc.TrackingCommunicationLinkClickedEntities on l.id equals lc.id where l.communicationId == c.id select l).Any() ) select c).Count(), Clicked = (from c in dc.TrackingCommunicationEntities join l in dc.TrackingCommunicationLinkEntities on c.id equals l.communicationId join lc in dc.TrackingCommunicationLinkClickedEntities on l.id equals lc.id where c.definition == d && c.sent >= startTicks && c.sent < endTicks select c).Count(), }).ToDictionary(x => x.Definition, x => new CommunicationReport { Sent = x.Sent, Opened = x.Opened, LinksClicked = x.Clicked })); } }