using _0_Framework.Application; using _0_Framework.Application.Enums; using Company.Domain.InstitutionContractAgg; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.InstitutionContract; using CompanyManagment.App.Contracts.SmsResult; using CompanyManagment.EFCore.Repository; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Hosting; namespace CompanyManagment.Application; public class SmsSettingApplication : ISmsSettingApplication { private readonly ISmsSettingsRepository _smsSettingsRepository; private readonly IInstitutionContractRepository _institutionContractRepository; private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository; private readonly IHostEnvironment _hostEnvironment; public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository, IHostEnvironment hostEnvironment) { _smsSettingsRepository = smsSettingsRepository; _institutionContractRepository = institutionContractRepository; _institutionContractSmsServiceRepository = institutionContractSmsServiceRepository; _hostEnvironment = hostEnvironment; } public async Task GetSmsSettingsByType(TypeOfSmsSetting typeOfSmsSetting) { return await _smsSettingsRepository.GetSmsSettingsByType(typeOfSmsSetting); } /// /// ایجاد تنظیمات پیامک یادآور /// /// /// /// /// public async Task CreateSmsSetting(int dayOfMonth, string timeOfDay, TypeOfSmsSetting typeOfSmsSetting) { var op = new OperationResult(); var timeSpan = new TimeSpan(); if (string.IsNullOrWhiteSpace(timeOfDay)) return op.Failed("ساعت وارد نشده است"); try { timeSpan = TimeSpan.ParseExact(timeOfDay, @"hh\:mm", null); } catch (Exception e) { return op.Failed("فرمت ساعت اشتباه است"); } if (dayOfMonth < 1 || dayOfMonth > 31) { return op.Failed("عدد روز می بایست بین 1 تا 31 باشد"); } if (_smsSettingsRepository.Exists(x => x.DayOfMonth == dayOfMonth && x.TimeOfDay == timeSpan && x.TypeOfSmsSetting == typeOfSmsSetting)) return op.Failed("رکورد ایجاد شده تکراری است"); var create = new SmsSetting(typeOfSmsSetting, dayOfMonth, timeSpan); await _smsSettingsRepository.CreateAsync(create); await _smsSettingsRepository.SaveChangesAsync(); return op.Succcedded(); } public async Task GetSmsSettingToEdit(long id) { return await _smsSettingsRepository.GetSmsSettingToEdit(id); } public async Task EditeSmsSetting(EditSmsSetting command) { var op = new OperationResult(); var timeSpan = new TimeSpan(); if (string.IsNullOrWhiteSpace(command.TimeOfDayDisplay)) return op.Failed("ساعت وارد نشده است"); try { timeSpan = TimeSpan.ParseExact(command.TimeOfDayDisplay, @"hh\:mm", null); } catch (Exception e) { return op.Failed("فرمت ساعت اشتباه است"); } if (command.DayOfMonth < 1 || command.DayOfMonth > 31) { return op.Failed("عدد روز می بایست بین 1 تا 31 باشد"); } if (_smsSettingsRepository.Exists(x => x.DayOfMonth == command.DayOfMonth && x.TimeOfDay == timeSpan && x.TypeOfSmsSetting == command.TypeOfSmsSetting && x.id != command.Id)) return op.Failed("رکورد ایجاد شده تکراری است"); var editSmsSetting = _smsSettingsRepository.Get(command.Id); editSmsSetting.Edit(command.DayOfMonth, timeSpan); await _smsSettingsRepository.SaveChangesAsync(); return op.Succcedded(); } public async Task RemoveSetting(long id) { await _smsSettingsRepository.RemoveItem(id); } public async Task> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting) { return await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting); } public async Task> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting) { return await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now); } public async Task InstantSendReminderSms(List command) { var op = new OperationResult(); if (_hostEnvironment.IsDevelopment()) { return op.Failed(" در محیط توسعه امکان ارسال وجود ندارد "); } string typeOfSms = "یادآور بدهی ماهانه"; string sendMessStart = "شروع یادآور آنی"; string sendMessEnd = "پایان یادآور آنی"; if (command.Any()) { await _institutionContractSmsServiceRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd); return op.Succcedded(); } else { return op.Failed("موردی انتخاب نشده است"); } } public async Task InstantSendBlockSms(List command) { var op = new OperationResult(); if (_hostEnvironment.IsDevelopment()) { return op.Failed(" در محیط توسعه امکان ارسال وجود ندارد "); } string typeOfSms = "اعلام مسدودی طرف حساب"; string sendMessStart = "شروع مسدودی آنی"; string sendMessEnd = "پایان مسدودی آنی "; if (command.Any()) { await _institutionContractSmsServiceRepository.SendBlockSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd); return op.Succcedded(); } else { return op.Failed("موردی انتخاب نشده است"); } } #region ForApi /// /// دریافت لیست پیامک های خودکار بر اساس نوع آن /// Api /// /// /// public async Task> GetSmsSettingList(TypeOfSmsSetting typeOfSmsSetting) { return await _smsSettingsRepository.GetSmsSettingList(typeOfSmsSetting); } public async Task GetSmsSettingDataToEdit(long id) { return await _smsSettingsRepository.GetSmsSettingDataToEdit(id); } public async Task EditSmsSetting(SmsSettingDto command) { var op = new OperationResult(); var editSmsSetting = _smsSettingsRepository.Get(command.Id); var timeSpan = new TimeSpan(); if (string.IsNullOrWhiteSpace(command.TimeOfDayDisplay)) return op.Failed("ساعت وارد نشده است"); try { timeSpan = TimeSpan.ParseExact(command.TimeOfDayDisplay, @"hh\:mm", null); } catch (Exception e) { return op.Failed("فرمت ساعت اشتباه است"); } if (command.DayOfMonth < 1 || command.DayOfMonth > 31) { return op.Failed("عدد روز می بایست بین 1 تا 31 باشد"); } if (_smsSettingsRepository.Exists(x => x.DayOfMonth == command.DayOfMonth && x.TimeOfDay == timeSpan && x.TypeOfSmsSetting == editSmsSetting.TypeOfSmsSetting && x.id != command.Id)) return op.Failed("رکورد ایجاد شده تکراری است"); editSmsSetting.Edit(command.DayOfMonth, timeSpan); await _smsSettingsRepository.SaveChangesAsync(); return op.Succcedded(); } public async Task> GetInstantReminderSmsListData(TypeOfSmsSetting typeOfSmsSetting) { var result = new List(); if (typeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder) { var data = await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, TypeOfSmsSetting.InstitutionContractDebtReminder); if (data.Any()) { result = data.GroupBy(x => x.PartyName).Select(m => new InstantReminderSendSms() { FullName = m.Key, Amount = m.Select(c => c.Amount).First(), InstantReminderSmsList = m.Select(c => new InstantReminderSmsList() { PhoneNumber = c.PhoneNumber, }).ToList() }).ToList(); } } if (typeOfSmsSetting == TypeOfSmsSetting.BlockContractingParty) { var data = await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now); if (data.Any()) { result = data.GroupBy(x => x.PartyName).Select(m => new InstantReminderSendSms() { FullName = m.Key, Amount = m.Select(c => c.Amount).First(), InstantReminderSmsList = m.Select(c => new InstantReminderSmsList() { PhoneNumber = c.PhoneNumber, }).ToList() }).ToList(); } } return result; } public async Task InstantSmsSendApi(TypeOfSmsSetting typeOfSmsSetting, List phoneNumbers) { var op = new OperationResult(); if (_hostEnvironment.IsDevelopment()) { var str = ""; foreach (var item in phoneNumbers) { str += $" {item}, "; } return op.Failed(" در محیط توسعه امکان ارسال وجود ندارد " + " لیست ارسال شما " + str); } if (typeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder) { if (phoneNumbers.Any()) { var data = await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, TypeOfSmsSetting.InstitutionContractDebtReminder); if (data.Any()) { phoneNumbers = phoneNumbers.Where(x => x.Length == 11).ToList(); var sendItems = data.Where(x => phoneNumbers.Contains(x.PhoneNumber)).ToList(); var res = await InstantSendReminderSms(sendItems); return res; } return op.Succcedded(); } return op.Failed("موردی انتخاب نشده است"); } if (typeOfSmsSetting == TypeOfSmsSetting.BlockContractingParty) { if (phoneNumbers.Any()) { var data = await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now); if (data.Any()) { phoneNumbers = phoneNumbers.Where(x => x.Length == 11).ToList(); var sendItems = data.Where(x => phoneNumbers.Contains(x.PhoneNumber)).ToList(); var res = await InstantSendBlockSms(sendItems); return res; } return op.Succcedded(); } return op.Failed("موردی انتخاب نشده است"); } return op.Failed("خطای انتخاب نوع ارسال"); } #endregion }