示例#1
0
        static private DateTime GetNextYearBusinessDate(EmpiriaCalendar calendar,
                                                        DateTime fromDate, int yearsCount, int businessDays)
        {
            DateTime date = new DateTime(fromDate.Year + yearsCount - 1, 12, 31);

            return(calendar.AddWorkingDays(date, businessDays));
        }
示例#2
0
        static private DateTime GetNextMonthBracketBusinessDate(EmpiriaCalendar calendar,
                                                                DateTime fromDate, int bracketMonthsSize,
                                                                int bracketControlMonth, int businessDays)
        {
            var bracketsBuilder = new MonthBracketsBuilder(bracketMonthsSize, bracketControlMonth);

            MonthBracket bracket = bracketsBuilder.GetBracketFor(fromDate);

            int year = fromDate.Year;

            if (fromDate.Month > bracket.DueMonth)
            {
                year = year + 1;
            }

            DateTime date = new DateTime(year, bracket.DueMonth, 1).AddDays(-1);

            DateTime withWorkingDaysAdded = calendar.AddWorkingDays(date, businessDays);

            if (withWorkingDaysAdded.Month == bracket.DueMonth)
            {
                return(withWorkingDaysAdded);
            }
            else
            {
                return(calendar.LastWorkingDateWithinMonth(year, bracket.DueMonth));
            }
        }
示例#3
0
        static private EmpiriaCalendar GetASEACalendar(ActivityModel template)
        {
            int[] AseaUsiviCalendarProcedures = { 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 };

            if (EmpiriaMath.IsMemberOf(template.ProcedureId, AseaUsiviCalendarProcedures))
            {
                return(EmpiriaCalendar.ParseOrDefault("ASEA-USIVI"));
            }
            else
            {
                return(EmpiriaCalendar.ParseOrDefault("ASEA-UGI"));
            }
        }
示例#4
0
        static private DateTime?CalculateNewDeadlineImplement(ActivityModel template, DateTime baseDate,
                                                              EmpiriaCalendar calendar)
        {
            if (baseDate.Year > (DateTime.Today.Year + 10))
            {
                return(null);
            }

            var dueOnTerm = template.DueOnTerm;

            if (String.IsNullOrWhiteSpace(dueOnTerm))
            {
                return(null);
            }

            var term = int.Parse(dueOnTerm);

            term = AdjustTermOnDueOnCondition(template, term);

            switch (template.DueOnTermUnit)
            {
            case "BusinessDays":
                if (term >= 0)
                {
                    return(calendar.AddWorkingDays(baseDate, term));
                }
                else
                {
                    return(calendar.SubstractWorkingDays(baseDate, -1 * term));
                }

            case "CalendarDays":
                return(baseDate.AddDays(term));

            case "Hours":
                return(baseDate.AddHours(term));

            case "Months":
                return(baseDate.AddMonths(term));

            case "Years":
                return(baseDate.AddYears(term));

            default:
                return(null);
            }
        }
示例#5
0
        static private EmpiriaCalendar GetCalendarFor(ActivityModel template)
        {
            if (template.EntityId == -1)
            {
                return(EmpiriaCalendar.Default);
            }

            var org = Contacts.Organization.Parse(template.EntityId);

            var calendarName = org.Nickname;

            if (calendarName == "ASEA")
            {
                return(GetASEACalendar(template));
            }

            return(EmpiriaCalendar.ParseOrDefault(calendarName));
        }
示例#6
0
        static internal DateTime?CalculateNextPeriodicDate(ActivityModel template, DateTime baseDate)
        {
            EmpiriaCalendar calendar = GetCalendarFor(template);

            DateTime?newPeriodicDate = CalculateNextPeriodicDateImplement(template, baseDate, calendar);

            if (!newPeriodicDate.HasValue)
            {
                return(null);
            }

            if (calendar.IsWeekendDay(newPeriodicDate.Value) || calendar.IsHoliday(newPeriodicDate.Value))
            {
                return(calendar.LastWorkingDate(newPeriodicDate.Value, true));
            }
            else
            {
                return(calendar.NextWorkingDate(newPeriodicDate.Value, true));
            }
        }
示例#7
0
        static private DateTime GetNextMonthBusinessDate(EmpiriaCalendar calendar,
                                                         DateTime fromDate, int monthsCount, int businessDays)
        {
            DateTime date = fromDate.AddMonths(monthsCount - 1);

            DateTime date2 = new DateTime(date.Year, date.Month,
                                          DateTime.DaysInMonth(date.Year, date.Month));

            DateTime withWorkingDaysAdded = calendar.AddWorkingDays(date2, businessDays);

            DateTime withinMonthDate = date2.AddDays(1);

            if (withWorkingDaysAdded.Month == withinMonthDate.Month)
            {
                return(withWorkingDaysAdded);
            }
            else
            {
                return(calendar.LastWorkingDateWithinMonth(withinMonthDate.Year, withinMonthDate.Month));
            }
        }
示例#8
0
        static internal DateTime AddWorkingDays(ActivityModel template, DateTime baseDate, int workingDays)
        {
            EmpiriaCalendar calendar = GetCalendarFor(template);

            return(calendar.AddWorkingDays(baseDate, workingDays));
        }
示例#9
0
        static private DateTime?CalculateNextPeriodicDateImplement(ActivityModel template, DateTime eventDate,
                                                                   EmpiriaCalendar calendar)
        {
            var periodicRule = template.PeriodicRule;

            try {
                if (eventDate.Year > (DateTime.Today.Year + 20))
                {
                    return(null);
                }

                switch (periodicRule.EachUnit)
                {
                case PeriodicRuleUnit.CalendarDays:
                    return(GetNextCalendarDay(eventDate, periodicRule.EachValue.Value));

                case PeriodicRuleUnit.Weeks:
                    var nextWeekDate = GetNextCalendarDay(eventDate, periodicRule.EachValue.Value * 7);

                    if (periodicRule.DueOnType == PeriodicRuleDueOn.OnFixedDayOfWeek)
                    {
                        return(GetNextDayOfWeekDate(nextWeekDate, periodicRule.DayOfWeek.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.AfterTheGivenStep)
                    {
                        return(nextWeekDate);
                    }
                    else
                    {
                        return(null);
                    }

                case PeriodicRuleUnit.Months:

                    if (periodicRule.DueOnType == PeriodicRuleDueOn.AfterTheGivenStep)
                    {
                        return(eventDate.AddMonths(periodicRule.EachValue.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.OnFirstBusinessDays)
                    {
                        return(GetNextMonthBusinessDate(calendar, eventDate,
                                                        periodicRule.EachValue.Value,
                                                        periodicRule.Day.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.OnFirstCalendarDays)
                    {
                        return(GetNextMonthDate(eventDate,
                                                periodicRule.EachValue.Value,
                                                periodicRule.Day.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.AfterFixedPeriodOnFixedDate)
                    {
                        return(GetNextMonthBracketDate(eventDate, periodicRule.EachValue.Value,
                                                       periodicRule.Month.Value, periodicRule.Day.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.AfterFixedPeriodOnBusinessDate)
                    {
                        return(GetNextMonthBracketBusinessDate(calendar, eventDate,
                                                               periodicRule.EachValue.Value,
                                                               periodicRule.Month.Value, periodicRule.Day.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.AfterAdjustablePeriodOnFixedDate)
                    {
                        return(GetNextMonthBracketDate(eventDate, periodicRule.EachValue.Value,
                                                       GetAdjustedPeriodMonth(eventDate), periodicRule.Day.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.AfterAdjustablePeriodOnBusinessDate)
                    {
                        return(GetNextMonthBracketBusinessDate(calendar, eventDate,
                                                               periodicRule.EachValue.Value,
                                                               GetAdjustedPeriodMonth(eventDate), periodicRule.Day.Value));
                    }
                    else
                    {
                        return(null);
                    }

                case PeriodicRuleUnit.Years:
                    if (periodicRule.DueOnType == PeriodicRuleDueOn.AfterTheGivenStep)
                    {
                        return(eventDate.AddYears(periodicRule.EachValue.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.OnFirstBusinessDays)
                    {
                        return(GetNextYearBusinessDate(calendar, eventDate,
                                                       periodicRule.EachValue.Value,
                                                       periodicRule.Day.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.OnFirstCalendarDays)
                    {
                        return(GetNextYearCalendarDate(eventDate,
                                                       periodicRule.EachValue.Value,
                                                       periodicRule.Day.Value));
                    }
                    else if (periodicRule.DueOnType == PeriodicRuleDueOn.OnFixedDate)
                    {
                        return(GetNextYearFixedDate(eventDate, periodicRule.EachValue.Value,
                                                    periodicRule.Month.Value, periodicRule.Day.Value));
                    }
                    else
                    {
                        return(null);
                    }

                case PeriodicRuleUnit.Manual:
                    return(null);

                default:
                    return(null);
                }
            } catch (Exception e) {
                throw new NotImplementedException($"Unable to calculate periodic rule for template rule: {periodicRule}", e);
            }
        }