Example #1
0
        /// <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);
        }
Example #2
0
        public void Properties_Ok()
        {
            var target = new DayRange(new Date(2020, 6, 12));

            Assert.Equal(6, target.Month);
            Assert.Equal(2020, target.Year);
        }
Example #3
0
        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();
            });
        }
Example #4
0
        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);
        }
Example #5
0
        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());
            }
        }
Example #6
0
        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);
        }
Example #7
0
        public DaySeekerContext(DayRange startDay, int dayCount)
        {
            startDay.ShouldNotBeNull("startDay");

            StartDay    = startDay;
            DayCount    = Math.Abs(dayCount);
            RemaingDays = DayCount;
        }
Example #8
0
 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());
     }
 }
Example #9
0
        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
        }
Example #10
0
        public void ProcessDay(DayRange day)
        {
            if (IsFinished)
            {
                return;
            }

            RemaingDays -= 1;

            if (IsFinished)
            {
                FoundDay = day;
            }
        }
Example #11
0
        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);
        }
Example #12
0
        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>());
            }
        }
Example #13
0
        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
        }
Example #14
0
        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();
            });
        }
Example #15
0
        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);
        }
Example #16
0
        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();
        }
Example #17
0
        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();
            });
        }
Example #18
0
        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));
        }
Example #19
0
 protected virtual bool OnVisitDay(DayRange day, TContext context)
 {
     return(true);
 }
Example #20
0
 protected virtual bool EnterHours(DayRange day, TContext context)
 {
     return(true);
 }
Example #21
0
 IDictionary <string, CommunicationReport> ICommunicationReportsQuery.GetCommunicationReport(DayRange day)
 {
     return(_repository.GetCommunicationReport(day));
 }
Example #22
0
 IList <Guid> IAccountReportsQuery.GetLastLogIns(UserType userType, DayRange day)
 {
     return(_repository.GetLastLogIns(userType, day));
 }
Example #23
0
 protected override bool EnterHours(DayRange day, CalendarPeriodCollectorContext context)
 {
     return((int)context.Scope > (int)CalendarPeriodCollectorContext.CollectKind.Hour);
 }
Example #24
0
        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),
            });
        }
Example #25
0
 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));
        }
Example #27
0
        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
                }));
            }
        }