/
shikari
/
stemtelegrambot
Обзор
Документация
Войти
/
shikari
/
stemtelegrambot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Services/ApplicationService.cs
164 строки
8 KB
Yeliseenko Yury
Добавление основной работы с ботом
13 авг 2025, 08:41
13 авг 2025, 08:41
d8e5c76
Код
Авторство
О чём код?
using STEMTelegramBot.Models; using STEMTelegramBot.Services; namespace STEMTelegramBot.Services { public class ApplicationService { private readonly CourseService _courseService; private readonly List<Application> _applications; private int _nextId = 1; public ApplicationService(CourseService courseService) { _courseService = courseService; _applications = new List<Application>(); } public ValidationResult ValidateParentData(string firstName, string lastName, string middleName, string phone) { var result = new ValidationResult(); if (string.IsNullOrWhiteSpace(firstName)) result.AddError("Имя родителя не может быть пустым"); else if (firstName.Length < 2) result.AddError("Имя родителя должно содержать минимум 2 символа"); else if (!firstName.All(c => char.IsLetter(c) || c == '-' || c == ' ')) result.AddError("Имя родителя может содержать только буквы, дефисы и пробелы"); if (string.IsNullOrWhiteSpace(lastName)) result.AddError("Фамилия родителя не может быть пустой"); else if (lastName.Length < 2) result.AddError("Фамилия родителя должна содержать минимум 2 символа"); else if (!lastName.All(c => char.IsLetter(c) || c == '-' || c == ' ')) result.AddError("Фамилия родителя может содержать только буквы, дефисы и пробелы"); if (!string.IsNullOrWhiteSpace(middleName)) { if (middleName.Length < 2) result.AddError("Отчество родителя должно содержать минимум 2 символа"); else if (!middleName.All(c => char.IsLetter(c) || c == '-' || c == ' ')) result.AddError("Отчество родителя может содержать только буквы, дефисы и пробелы"); } if (string.IsNullOrWhiteSpace(phone)) result.AddError("Номер телефона не может быть пустым"); else { var cleanPhone = new string(phone.Where(c => char.IsDigit(c)).ToArray()); if (cleanPhone.Length != 11 || !cleanPhone.StartsWith("7") && !cleanPhone.StartsWith("8")) result.AddError("Номер телефона должен быть в формате +7XXXXXXXXXX или 8XXXXXXXXXX"); } return result; } public ValidationResult ValidateChildData(string firstName, string lastName, string middleName, string ageStr) { var result = new ValidationResult(); if (string.IsNullOrWhiteSpace(firstName)) result.AddError("Имя ребенка не может быть пустым"); else if (firstName.Length < 2) result.AddError("Имя ребенка должно содержать минимум 2 символа"); else if (!firstName.All(c => char.IsLetter(c) || c == '-' || c == ' ')) result.AddError("Имя ребенка может содержать только буквы, дефисы и пробелы"); if (string.IsNullOrWhiteSpace(lastName)) result.AddError("Фамилия ребенка не может быть пустой"); else if (lastName.Length < 2) result.AddError("Фамилия ребенка должна содержать минимум 2 символа"); else if (!lastName.All(c => char.IsLetter(c) || c == '-' || c == ' ')) result.AddError("Фамилия ребенка может содержать только буквы, дефисы и пробелы"); if (!string.IsNullOrWhiteSpace(middleName)) { if (middleName.Length < 2) result.AddError("Отчество ребенка должно содержать минимум 2 символа"); else if (!middleName.All(c => char.IsLetter(c) || c == '-' || c == ' ')) result.AddError("Отчество ребенка может содержать только буквы, дефисы и пробелы"); } if (string.IsNullOrWhiteSpace(ageStr)) result.AddError("Возраст ребенка не может быть пустым"); else if (!int.TryParse(ageStr, out int age)) result.AddError("Возраст ребенка должен быть числом"); else if (age < 3 || age > 18) result.AddError("Возраст ребенка должен быть от 3 до 18 лет"); return result; } public ValidationResult ValidateCourseSelection(int courseId) { var result = new ValidationResult(); var course = _courseService.GetCourseById(courseId); if (course == null) result.AddError("Выбранный курс не найден"); return result; } public Application? CreateApplication(string parentFirstName, string parentLastName, string parentMiddleName, string parentPhone, string childFirstName, string childLastName, string childMiddleName, int childAge, int courseId) { var course = _courseService.GetCourseById(courseId); if (course == null) return null; var application = new Application { Id = _nextId++, CreatedAt = DateTime.Now, ParentFirstName = parentFirstName.Trim(), ParentLastName = parentLastName.Trim(), ParentMiddleName = parentMiddleName?.Trim() ?? "", ParentPhone = parentPhone.Trim(), ChildFirstName = childFirstName.Trim(), ChildLastName = childLastName.Trim(), ChildMiddleName = childMiddleName?.Trim() ?? "", ChildAge = childAge, CourseId = courseId, CourseName = course.Name }; _applications.Add(application); return application; } public List<Application> GetAllApplications() => _applications.ToList(); public string GetApplicationSummaryText(Application application) { var text = "✅ *Заявка успешно отправлена!*\n\n"; text += $"📋 *Номер заявки:* #{application.Id}\n"; text += $"📅 *Дата подачи:* {application.CreatedAt:dd.MM.yyyy HH:mm}\n\n"; text += $"👨👩👧👦 *Данные родителя:*\n"; text += $" ФИО: {application.GetParentFullName()}\n"; text += $" Телефон: {application.ParentPhone}\n\n"; text += $"👶 *Данные ребенка:*\n"; text += $" ФИО: {application.GetChildFullName()}\n"; text += $" Возраст: {application.ChildAge} лет\n\n"; text += $"🎯 *Выбранный курс:* {application.CourseName}\n\n"; text += "Спасибо за заявку! Мы свяжемся с вами в ближайшее время для уточнения деталей.\n\n"; text += "Нажмите /start для возврата в главное меню."; return text; } } public class ValidationResult { public List<string> Errors { get; } = new(); public bool IsValid => !Errors.Any(); public void AddError(string error) => Errors.Add(error); public string GetErrorsText() => string.Join("\n", Errors.Select(e => $"❌ {e}")); } }