コード例 #1
0
        public void PutSchedulesCampaignsCampaignIdTest()
        {
            // TODO: add unit test for the method 'PutSchedulesCampaignsCampaignId'
            string           campaignId = null; // TODO: replace null with proper value
            CampaignSchedule body       = null; // TODO: replace null with proper value
            var response = instance.PutSchedulesCampaignsCampaignId(campaignId, body);

            Assert.IsInstanceOf <CampaignSchedule> (response, "response is CampaignSchedule");
        }
コード例 #2
0
        public async Task <IActionResult> Edit(int?id = null)
        {
            ViewBag.AsteriskActions = await _context.AsteriskExtensions.Where(x => !x.Disabled).Select(x => new AsteriskExtensionViewModel
            {
                Extension = x.Extension,
                Title     = x.Title
            }).ToArrayAsync();

            if (id.HasValue)
            {
                var entity = await _context.Campaigns.FirstOrDefaultAsync(x => x.Id == id);

                if (entity == null)
                {
                    throw new NullReferenceException($"Campaign with id={id} does not exists");
                }

                var schedules = await _context.CampaignSchedules.Where(x => x.CampaignId == id).ToArrayAsync();

                if (schedules.Length == 0)
                {
                    schedules = new CampaignSchedule[] { new CampaignSchedule {
                                                             DateStart  = DateTime.Today,
                                                             DateEnd    = DateTime.Today,
                                                             TimeStart  = 480,
                                                             TimeEnd    = 1260,
                                                             DaysOfWeek = 127
                                                         } };
                }

                return(View(new CampaignViewModel
                {
                    Id = entity.Id,
                    Name = entity.Name,
                    AbonentsTotal = entity.AbonentsCount,
                    AbonentsFileName = entity.AbonentsFileName,
                    VoiceFileName = entity.VoiceFileName,
                    Action = entity.Extension,
                    LineLimit = entity.LineLimit,
                    Retries = entity.Retries,

                    Schedules = schedules.Select(x => new CampaignScheduleViewModel
                    {
                        DateStart = x.DateStart,
                        DateEnd = x.DateEnd,
                        TimeStart = TimeToString(x.TimeStart),
                        TimeEnd = TimeToString(x.TimeEnd),
                        DaysOfWeek = x.DaysOfWeek
                    })
                }));;
            }

            var lineLimit = _configuration.GetValue <int>("Asterisk:LinesLimit");

            if (lineLimit < 1)
            {
                lineLimit = 6;
            }

            return(View(new CampaignViewModel
            {
                Schedules = new CampaignScheduleViewModel[]
                {
                    new CampaignScheduleViewModel
                    {
                        DateStart = DateTime.Today,
                        DateEnd = DateTime.Today,
                        TimeStart = "8:00",
                        TimeEnd = "21:00",
                        DaysOfWeek = 127
                    }
                },
                LineLimit = lineLimit,
                Retries = 3
            }));
        }
コード例 #3
0
 public void Init()
 {
     instance = new CampaignSchedule();
 }
コード例 #4
0
        public async Task <IActionResult> Edit(CampaignViewModel model)
        {
            ViewBag.AsteriskActions = await _context.AsteriskExtensions.Where(x => !x.Disabled).Select(x => new AsteriskExtensionViewModel
            {
                Extension = x.Extension,
                Title     = x.Title
            }).ToArrayAsync();

            if (!model.Id.HasValue)
            {
                if (model.AbonentsFile == null)
                {
                    ModelState.AddModelError(nameof(model.AbonentsFile), "Для запуска обзвона необходим файл списка абонентов");
                }

                if (model.VoiceFile == null)
                {
                    ModelState.AddModelError(nameof(model.VoiceFile), "Для запуска обзвона необходима запись голосового сообщения");
                }

                if (model.Schedules == null || model.Schedules.Count() == 0)
                {
                    ModelState.AddModelError(nameof(model.Schedules), "Для запуска обзвона необходимо добавить расписание");
                }

                if (model.Retries < 1)
                {
                    ModelState.AddModelError(nameof(model.Retries), "Не указано количество попыток дозвона");
                }
            }

            if (!ModelState.IsValid)
            {
                ViewBag.Error = "Не удалось сохранить форму, проверьте, заполнены ли все поля";
                _logger.LogWarning($"Campaign form validation error. Total errors: {ModelState.ErrorCount}, errors: [{string.Join(",", ModelState.Select(x => $"{x.Key}:{x.Value.ValidationState}"))}], model: [{JsonConvert.SerializeObject(model)}]");
                return(View(model));
            }

            try
            {
                var entity = await GetOrCreateEntity(model.Id);

                entity.Name       = model.Name;
                entity.Modified   = DateTime.Now;
                entity.ModifierId = _currentUserId ?? 0;
                entity.Extension  = model.Action;
                entity.Retries    = model.Retries;

                if (model.LineLimit > 500)
                {
                    model.LineLimit = 500;
                }
                if (model.LineLimit < 1)
                {
                    var lineLimit = _configuration.GetValue <int>("Asterisk:LinesLimit");
                    if (lineLimit < 1)
                    {
                        lineLimit = 6;
                    }
                    model.LineLimit = lineLimit;
                }

                entity.LineLimit = model.LineLimit;

                if (!model.Id.HasValue)
                {
                    await _context.SaveChangesAsync();

                    model.Id = entity.Id;
                }

                var schedules = await _context.CampaignSchedules.Where(x => x.CampaignId == entity.Id).ToArrayAsync();

                var toRemove = schedules.Where(x => !model.Schedules.Any(s => s.Id == x.Id));
                if (toRemove.Any())
                {
                    foreach (var schedule in toRemove)
                    {
                        _context.RemoveRange(toRemove);
                    }
                }

                foreach (var schedule in model.Schedules)
                {
                    var scEntity = schedules.FirstOrDefault(x => x.Id == schedule.Id);
                    if (scEntity == null)
                    {
                        scEntity = new CampaignSchedule
                        {
                            CampaignId = entity.Id
                        };
                        _context.CampaignSchedules.Add(scEntity);
                    }

                    scEntity.ModifierId = _currentUserId.Value;
                    scEntity.DateStart  = schedule.DateStart;
                    scEntity.DateEnd    = schedule.DateEnd;
                    scEntity.DaysOfWeek = schedule.DaysOfWeek;
                    scEntity.TimeStart  = TimeFromString(schedule.TimeStart);
                    scEntity.TimeEnd    = TimeFromString(schedule.TimeEnd);
                }

                if (model.AbonentsFile != null)
                {
                    await SaveFile(model.AbonentsFile, FileType.Abonents.ToFileName(entity.Id));

                    entity.AbonentsCount = await _abonentsFileService.ProcessFileAsync(Path.Combine(_uploadsDir, $"{entity.Id}_abonents"), entity.Id);

                    entity.AbonentsFileName = model.AbonentsFile.FileName;
                }

                if (model.VoiceFile != null)
                {
                    var voiceFileName = FileType.Voice.ToFileName(entity.Id);
                    await SaveFile(model.VoiceFile, voiceFileName);

                    entity.VoiceFileName = model.VoiceFile.FileName;
                    if (_configuration.GetValue <bool>("Asterisk:UseSox"))
                    {
                        Convert(voiceFileName);
                    }
                    else
                    {
                        System.IO.File.Copy(Path.Combine(_uploadsDir, voiceFileName), Path.Combine(_configuration.GetValue <string>("Asterisk:Sounds"), voiceFileName) + Path.GetExtension(model.VoiceFile.FileName));
                    }
                }

                await _context.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Could not save Campaign");
                ViewBag.Error = ex.Message;
                return(View(model));
            }

            return(RedirectToAction(nameof(Index)));
        }