public EndDateMessageDTO CalculaterEndDate(CalculateEndDateInputDTO calculateEndDateInput)
        {
            try
            {
                string endDate = "";

                #region Get total dates to train the program

                //Total dates to train the program
                double totalDates = 0;

                //Get modules included to program
                List <ShortModuleDetailDTO> listModulesIncluded = new List <ShortModuleDetailDTO>();

                //Get program by ProgramId
                var program = _programRepository.Get(calculateEndDateInput.ProgramID);

                int[] modulesIncludedID = program.ArrayOfIncludedModules;

                //Call a DAL method to get list module
                var modules = _moduleRepository.GetModulesByArrayID(modulesIncludedID);

                foreach (Module module in modules)
                {
                    ShortModuleDetailDTO shortModule = new ShortModuleDetailDTO();

                    //Get id and TrainTime of module
                    shortModule.ModuleId  = module.Id;
                    shortModule.TrainTime = _configurationRepository.GetMaximumHoursPerDay();

                    shortModule.ModuleTitle = module.Title;
                    shortModule.Duration    = module.Theory + module.Pratical;

                    //Get TotalDate
                    if ((shortModule.Duration % shortModule.TrainTime) != 0)
                    {
                        double temp = shortModule.Duration / shortModule.TrainTime;
                        shortModule.TotalDate = Math.Truncate(temp) + 1;
                    }
                    else
                    {
                        shortModule.TotalDate = shortModule.Duration / shortModule.TrainTime;
                    }

                    //Get Competencies trained by this module
                    List <CompetenceDTO> listCompetenciesTrained = new List <CompetenceDTO>();

                    var competenciesTrained = _competenceRepository.GetCompetenciesByCompetenceID(module.ArrayOfTrainingCompetencies);

                    foreach (Competence competence in competenciesTrained)
                    {
                        CompetenceDTO competenceDto = new CompetenceDTO();

                        competenceDto.CompetenceID = competence.Id;
                        competenceDto.Name         = competence.Name;
                        competenceDto.Description  = competence.Description;

                        listCompetenciesTrained.Add(competenceDto);
                    }

                    shortModule.Competencies = listCompetenciesTrained;

                    listModulesIncluded.Add(shortModule);
                }

                foreach (ShortModuleDetailDTO module in listModulesIncluded)
                {
                    totalDates += module.TotalDate;
                }

                #endregion

                #region Calculate end date

                //List days off in a week
                List <int> daysOff = JsonConvert.DeserializeObject <int[]>(_configurationRepository.GetDaysOff()).ToList();

                endDate = _compareAppService.CalculateEndDate(calculateEndDateInput.StartDate, totalDates, daysOff);

                #endregion

                return(new EndDateMessageDTO()
                {
                    status = true,
                    message = L("CalculaterEndDateSuccess"),
                    endDate = endDate
                });
            }
            catch
            {
                return(new EndDateMessageDTO()
                {
                    status = false,
                    message = L("UnknownError"),
                    endDate = "null"
                });
            }
        }