public async Task <IActionResult> GetTrainingManagersReport([FromBody] TrainingManagerFilterDto filterDto) { try { var result = await _trainingService.GetTrainingManagersReport(filterDto); if (result.Any()) { return(Ok(result)); } else { return(NotFound("Nenhum registro encontrado!")); } } catch (Exception ex) { return(BadRequest(ex.Message)); } }
public async Task <IEnumerable <TrainingManagerDto> > GetTrainingManagersReport(TrainingManagerFilterDto trainingManagerFilterDto) { int filterMonth = trainingManagerFilterDto.Month; var today = DateTime.Now; int currentMonth = Convert.ToInt32(today.Month); int monthValue = filterMonth - currentMonth; var report = new List <TrainingManagerDto>(); var shopUsers = await _shopUserRepository.GetShopUsersTrainingManagers(trainingManagerFilterDto.Cpf, trainingManagerFilterDto.Cnpj, trainingManagerFilterDto.Network); var lastTraining = await _trainingRepository.CustomFind(x => x.CurrentMonth == DateTime.Now.AddMonths(-monthValue).Month && x.CurrentYear == DateTime.Now.AddMonths(-monthValue).Year && !x.hasTrainingMaterial && x.trainingKind == 2); var trainingUserList = await _trainingUserPointsRepository.CustomFind(x => x.ResultId == (int)TrainingResultEnum.Approved && x.TrainingEndedAt.Month == DateTime.Now.AddMonths(-monthValue).Month && x.TrainingEndedAt.Year == DateTime.Now.AddMonths(-monthValue).Year, x => x.User); var trainingValidation = lastTraining.Count() >= 2 ? 1 : 0; var salesmanList = await _shopUserRepository.CustomFind(x => x.User.Office.Id == (int)OfficeEnum.Salesman && (x.User.UserStatus.Id == (int)UserStatusEnum.Active || x.User.UserStatus.Id == (int)UserStatusEnum.PasswordExpired || (x.User.UserStatus.Id == (int)UserStatusEnum.PreRegistration && (DateTime.Now - x.User.CreatedAt).TotalDays >= 30)), x => x.User, x => x.Shop); foreach (var item in shopUsers) { var salesman = salesmanList.Where(x => x.Shop != null && x.Shop.Id == item.Shop.Id).Select(x => x.User.Id).ToList(); var trainingUser = trainingUserList.Where(x => salesman.Contains(x.User.Id)); var totalUsersTrainingComplete = trainingUser. GroupBy(x => new { x.Id, x.User }). Select(x => new { userId = x.Key.User.Id, total = x.Select(s => s.Id).Count() }). GroupBy(x => new { x.userId, x.total }). Select(x => new { user = x.Key.userId, total = x.Sum(y => y.total) }).ToList(). Count(x => x.total > trainingValidation); var porcentageTrainingCompleted = salesman.Count() > 0 ? (totalUsersTrainingComplete * 100) / salesman.Count() : 0; report.Add(new TrainingManagerDto { Cnpj = item.Shop.Cnpj, Network = item.Shop.Network.Name, Name = item.User.Name, PorcentageCompleted = porcentageTrainingCompleted, TotalSalesman = salesman.Count(), TrainingCompleted = totalUsersTrainingComplete }); } return(report); }