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));
            }
        }
Example #2
0
        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);
        }