Ejemplo n.º 1
0
        public async Task <CommandResult> AddAsync(RuleHoliday ruleHoliday)
        {
            CommandResult commandResult;
            Stopwatch     watch = Stopwatch.StartNew();

            try
            {
                if (!await CanAddAsync(ruleHoliday, true))
                {
                    commandResult = CommandResult.BadRequest("Registro não pode ser salvo, existem erros.");
                }
                else
                {
                    ruleHoliday = await RuleHolidayRepository.AddAsync(ruleHoliday);

                    commandResult = await CommitAsync(_commandName, ruleHoliday.Action);

                    if (commandResult.Success)
                    {
                        commandResult.Data = ruleHoliday;
                    }
                }
            }
            catch (Exception ex)
            {
                commandResult = CommandResult.InternalServerError($"Ocorreu um erro ao salvar.");
            }

            watch.Stop();
            commandResult.ElapsedTime = watch.ElapsedMilliseconds;

            return(commandResult);
        }
        private async Task <bool> StateMustExistAsync(RuleHoliday ruleHoliday)
        {
            if (!ruleHoliday.StateId.HasValue)
            {
                return(true);
            }

            return(await StateMustExistAsync(ruleHoliday, _stateRepository));
        }
Ejemplo n.º 3
0
        private static List <Holiday> GetHolidaysFromRules(INotificationHandler notificationHandler, List <RuleHoliday> rulesHolidays, int start, int end, int year, IUserLogged userLogged)
        {
            List <Holiday> holidays = null;

            if (rulesHolidays != null && rulesHolidays.Count() > 0)
            {
                holidays = new List <Holiday>();

                try
                {
                    Guid        userId      = userLogged.GetUserId();
                    RuleHoliday ruleHoliday = null;
                    DateTime?   holidayDate = null;

                    for (int i = start, j = end; i < j; i++)
                    {
                        ruleHoliday = rulesHolidays[i];
                        holidayDate = null;

                        if (ruleHoliday.BussinessRule.HasValue())
                        {
                            if (!ApplyBusinessRuleForDate(notificationHandler, ruleHoliday, year, out holidayDate))
                            {
                                ApplyBusinessRuleForTime(notificationHandler, ruleHoliday, year, out holidayDate);
                            }
                        }
                        else
                        {
                            if (ruleHoliday.Month.HasValue && ruleHoliday.Day.HasValue)
                            {
                                holidayDate = new DateTime(year, ruleHoliday.Month.Value, ruleHoliday.Day.Value);
                            }
                        }

                        if (holidayDate == null)
                        {
                            var notification = new DomainNotification(ruleHoliday.Id.ToString(), $"O feriado {ruleHoliday.NativeHolidayName} do {ruleHoliday.CountryIsoCode} não tem data.");
                            notificationHandler.NotifyError(notification);
                        }
                        else
                        {
                            var holiday = Holiday.CreateHoliday(null, EntityStatus.Active, ActionType.Register, userId, ruleHoliday.CountryId, ruleHoliday.StateId, holidayDate.Value, ruleHoliday.HolidayType, ruleHoliday.Optional, ruleHoliday.NativeHolidayName, ruleHoliday.EnglishHolidayName, ruleHoliday.CountryIsoCode, ruleHoliday.StateIsoCode, ruleHoliday.CityName, ruleHoliday.CityCode);
                            holidays.Add(holiday);
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

            return(holidays);
        }
        private async Task <bool> RuleHolidayMustBeUniqueAsync(RuleHoliday ruleHoliday, IRuleHolidayRepository ruleRepository)
        {
            RuleHoliday record = (await ruleRepository.FindAsync(c => c.ComposeKey == ruleHoliday.ComposeKey)).FirstOrDefault();

            if (ruleHoliday.Action != ActionType.Register && record.Id == ruleHoliday.Id)
            {
                record = null;
            }

            return(record == null);
        }
Ejemplo n.º 5
0
        public void EqualsCore_RulesMustBeEquals_False()
        {
            // Arrange
            RuleHoliday ruleA, ruleB;

            // Act
            ruleA = RuleHoliday.CreateRuleHoliday(null, EntityStatus.Locked, ActionType.Update, Guid.Parse("41408960-a65f-42ea-93c0-e320a1bc7060"), Guid.Parse("41408960-a65f-42ea-93c0-e320a1bc7060"), Guid.Parse("41408960-a65f-42ea-93c0-e320a1bc7070"), "USA", null, "", "", HolidayType.National, "Bennington Battle Day", "Bennington Battle Day", 8, 16, false, "", "16 August or nearest weekday");
            ruleB = RuleHoliday.CreateRuleHoliday(null, EntityStatus.Locked, ActionType.Update, Guid.Parse("41408960-a65f-42ea-93c0-e320a1bc7060"), Guid.Parse("41408960-a65f-42ea-93c0-e320a1bc7060"), Guid.Parse("41408960-a65f-42ea-93c0-e320a1bc7070"), "USA", null, "", "", HolidayType.Local, "Bennington Battle Day", "Bennington Battle Day", 8, 16, false, "", "16 August or nearest weekday");

            // Assert
            Assert.NotEqual(ruleA, ruleB);
            Assert.True(ruleA != ruleB);
        }
Ejemplo n.º 6
0
        public void CreateRule_MustCreateInstaceOfRule(string id, string status, string typeProcess, string user, string country, string state, string countryIsoCode, string stateIsoCode, string cityCode, string cityName, string holidayType, string nativeHolidayName, string englishHolidayName, int month, int day, bool optional, string bussinessRule, string comments)
        {
            // Arrange
            RuleHoliday  ruleHoliday;
            Guid         entityId     = string.IsNullOrEmpty(id) ? Guid.Empty : Guid.Parse(id);
            EntityStatus entityStatus = EntityStatus.GetByName(status);
            ActionType   action       = ActionType.GetByName(typeProcess);
            HolidayType  type         = HolidayType.GetByName(holidayType);
            Guid         userId       = string.IsNullOrEmpty(user) ? Guid.Empty : Guid.Parse(user);
            Guid         countryId    = string.IsNullOrEmpty(country) ? Guid.Empty : Guid.Parse(country);
            Guid         stateId      = string.IsNullOrEmpty(state) ? Guid.Empty : Guid.Parse(state);

            // Act
            ruleHoliday = RuleHoliday.CreateRuleHoliday(entityId, entityStatus, action, userId, countryId, stateId, countryIsoCode, stateIsoCode, cityCode, cityName, type, nativeHolidayName, englishHolidayName, month, day, optional, bussinessRule, comments);

            // Assert
            Assert.NotNull(ruleHoliday);
            Assert.True(ruleHoliday.Id != entityId &&
                        ruleHoliday.Status == entityStatus &&
                        ruleHoliday.Action == action &&
                        (ruleHoliday.RegisteredBy == userId || ruleHoliday.ModifiedBy == userId) &&
                        ruleHoliday.CountryId == countryId &&
                        ruleHoliday.StateId == stateId &&
                        ruleHoliday.CountryIsoCode == countryIsoCode &&
                        ruleHoliday.StateIsoCode == stateIsoCode &&
                        ruleHoliday.CityCode == cityCode &&
                        ruleHoliday.CityName == cityName &&
                        ruleHoliday.HolidayType == type &&
                        ruleHoliday.NativeHolidayName == nativeHolidayName &&
                        ruleHoliday.EnglishHolidayName == englishHolidayName &&
                        (ruleHoliday.Month == month || ruleHoliday.Month == null) &&
                        (ruleHoliday.Day == day || ruleHoliday.Day == null) &&
                        ruleHoliday.Optional == optional &&
                        ruleHoliday.BussinessRule == bussinessRule.Replace(" ", "").Trim().ToLower() &&
                        ruleHoliday.Comments == comments);
        }
Ejemplo n.º 7
0
 private async Task <bool> MustBeValidateAsync(RuleHoliday ruleHoliday)
 {
     return((await RuleHolidayRepository.GetCountAsync(c => c.CountryIsoCode == ruleHoliday.CountryIsoCode)) > 0);
 }
Ejemplo n.º 8
0
        private static async Task <List <RuleHoliday> > GetRulesHolidaysFromCsvAsync(string[,] rulesHolidaysCsv, int start, int end, ICountryRepository countryRepository, IStateRepository stateRepository, IUserLogged userLogged)
        {
            List <RuleHoliday> rules = null;

            if (rulesHolidaysCsv != null && rulesHolidaysCsv.GetLength(0) > 0)
            {
                rules = new List <RuleHoliday>();

                try
                {
                    Guid    userId            = userLogged.GetUserId();
                    Guid    countryId         = Guid.Empty;
                    Guid?   stateId           = null;
                    Country country           = null;
                    string  stateCodePrevious = "?";

                    for (int i = start, j = end; i < j; i++)
                    {
                        var id                     = rulesHolidaysCsv[i, 0].HasValue() ? int.Parse((rulesHolidaysCsv[i, 0]).Trim()) : -1;
                        var countryCode            = rulesHolidaysCsv[i, 1].Trim();
                        var stateName              = rulesHolidaysCsv[i, 2].Trim();
                        var stateCode              = rulesHolidaysCsv[i, 3].Trim();
                        var month                  = rulesHolidaysCsv[i, 4].ToMonth();
                        var day                    = rulesHolidaysCsv[i, 5].ToDay();
                        var nativeDescription      = rulesHolidaysCsv[i, 6].Trim();
                        var alternativeDescription = rulesHolidaysCsv[i, 7].Trim();
                        var holidayType            = rulesHolidaysCsv[i, 8].Replace("  ", " ").Trim();
                        var cityName               = rulesHolidaysCsv[i, 9].Trim();
                        var cityCode               = rulesHolidaysCsv[i, 10].Trim();
                        var optional               = rulesHolidaysCsv[i, 11].HasValue();
                        var bussinessRule          = rulesHolidaysCsv[i, 12].ToLower().Trim().Replace(" ", "");
                        var comments               = rulesHolidaysCsv[i, 13].Trim();

                        if (country == null || country.CountryIsoCode3 != countryCode)
                        {
                            country   = (await countryRepository.FindAsync(c => c.CountryIsoCode3 == countryCode)).FirstOrDefault();
                            countryId = country != null ? country.Id : Guid.Empty;
                        }

                        if (stateCode.HasValue() && stateCode != stateCodePrevious)
                        {
                            stateCodePrevious = stateCode;
                            stateId           = await SetStateIdAsync(stateRepository, stateCode, countryCode);
                        }

                        HolidayType type = SetHolidayType(holidayType, cityName, stateCode);

                        comments = SetComments(holidayType, comments);

                        var ruleHoliday = RuleHoliday.CreateRuleHoliday(null, EntityStatus.Active, ActionType.Register, userId, countryId, stateId, countryCode, stateCode, cityCode, cityName, type, nativeDescription, alternativeDescription, month, day, optional, bussinessRule, comments);

                        rules.Add(ruleHoliday);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

            return(rules);
        }
Ejemplo n.º 9
0
        private static void ApplyBusinessRuleForTime(INotificationHandler notificationHandler, RuleHoliday ruleHoliday, int year, out DateTime?holidayDate)
        {
            string[] bussinesRules = ruleHoliday.BussinessRule.Split(",");

            holidayDate = null;

            if (bussinesRules != null && bussinesRules.Length >= 3)
            {
                if (bussinesRules[2] == "nearest")
                {
                    bussinesRules.ApplyNearestBusinessRule(year, out holidayDate);
                }
                else if (bussinesRules[2] == "workday")
                {
                    bussinesRules.ApplyWorkdayBusinessRule(year, out holidayDate);
                }
                else if (bussinesRules[2] == "!sunday")
                {
                    bussinesRules.ApplyNotSundayBusinessRule(year, out holidayDate);
                }
                else if (bussinesRules[2] == "after")
                {
                    int      times     = bussinesRules[0].ToWeekTimes();
                    int      dayOfWeek = bussinesRules[1].ToDayOfWeek();
                    DateTime date;

                    if (bussinesRules[3] == "easter")
                    {
                        date = year.GetEasterSunday();

                        for (int i = 0; i < times; i++)
                        {
                            date = date.GetDayAfterDate((DayOfWeek)dayOfWeek);
                        }

                        holidayDate = date;
                    }
                    else
                    {
                        var notification = new DomainNotification(ruleHoliday.Id.ToString(), $"A regra {ruleHoliday.BussinessRule} do {ruleHoliday.CountryIsoCode} não foi implementada.");
                        notificationHandler.NotifyError(notification);
                    }
                }
                else
                {
                    int weekNumber = bussinesRules[0].ToWeekNumber();
                    int dayOfWeek  = bussinesRules[1].ToDayOfWeek();
                    int month      = bussinesRules[2].ToMonth();

                    if (weekNumber != -1 && dayOfWeek != -1 && month != -1)
                    {
                        DateTime date = year.GetWeekDayOfMonth(month, (DayOfWeek)dayOfWeek, weekNumber);
                        holidayDate = date;
                    }
                }
            }
        }
Ejemplo n.º 10
0
        private static bool ApplyBusinessRuleForDate(INotificationHandler notificationHandler, RuleHoliday ruleHoliday, int year, out DateTime?holidayDate)
        {
            bool     businessRuleApplied = false;
            DateTime date = DateTime.MinValue;

            if (ruleHoliday.BussinessRule == "ascensionday")
            {
                date = year.GetAscensionDay();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "ashwednesday")
            {
                date = year.GetAshWednesday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "assumptionday")
            {
                date = year.GetAshWednesday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "carnivalmonday")
            {
                date = year.GetCarnivalMonday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "carnivaltuesday")
            {
                date = year.GetCarnivalTuesday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "corpuschristi")
            {
                date = year.GetCorpusChristi();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "easter" || ruleHoliday.BussinessRule == "eastersunday")
            {
                date = year.GetEasterSunday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "eastermonday")
            {
                date = year.GetEasterSunday();
                date = date.AddDays(1);
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "eastertuesday")
            {
                date = year.GetEasterSunday();
                date = date.AddDays(2);
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "goodfriday")
            {
                date = year.GetGoodFriday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "holysaturday")
            {
                date = year.GetHolySaturday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "holythursday")
            {
                date = year.GetHolyThursday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "maundythursday")
            {
                date = year.GetMaundyThursday();
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "pentecostmonday")
            {
                date = year.GetPentecostDay();
                date = date.AddDays(1);
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "pentecosttuesday")
            {
                date = year.GetPentecostDay();
                date = date.AddDays(2);
                businessRuleApplied = true;
            }
            else if (ruleHoliday.BussinessRule == "whitmonday")
            {
                date = year.GetWhitsunDay();
                date = date.AddDays(1);
                businessRuleApplied = true;
            }

            holidayDate = null;

            if (businessRuleApplied)
            {
                holidayDate = new DateTime(year, date.Month, date.Day);
            }

            if (!ruleHoliday.BussinessRule.Contains(",") && !businessRuleApplied)
            {
                var notification = new DomainNotification(ruleHoliday.Id.ToString(), $"A regra {ruleHoliday.BussinessRule} do {ruleHoliday.CountryIsoCode} não foi implementada.");
                notificationHandler.NotifyError(notification);
            }

            return(businessRuleApplied);
        }
Ejemplo n.º 11
0
        private async Task <bool> CanAddAsync(RuleHoliday ruleHoliday, bool validateRepository)
        {
            var validator = validateRepository == true ? _addRuleHolidayValidatorRepository : _addRuleHolidayValidator;

            return(InstanceNotNull(ruleHoliday) && (await IsValidEntityAsync(validator, ruleHoliday)));
        }
 private async Task <bool> RuleHolidayMustBeUniqueAsync(RuleHoliday ruleHoliday)
 {
     return(await RuleHolidayMustBeUniqueAsync(ruleHoliday, _ruleHolidayRepository));
 }
 private async Task <bool> CountryMustExistAsync(RuleHoliday ruleHoliday)
 {
     return(await CountryMustExistAsync(ruleHoliday, _countryRepository));
 }