Files
Backend-Api/CompanyManagment.Application/SmsSettingApplication.cs
2026-01-13 15:33:08 +03:30

348 lines
12 KiB
C#

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<SmsSettingViewModel> GetSmsSettingsByType(TypeOfSmsSetting typeOfSmsSetting)
{
return await _smsSettingsRepository.GetSmsSettingsByType(typeOfSmsSetting);
}
/// <summary>
/// ایجاد تنظیمات پیامک یادآور
/// </summary>
/// <param name="dayOfMonth"></param>
/// <param name="timeOfDay"></param>
/// <param name="typeOfSmsSetting"></param>
/// <returns></returns>
public async Task<OperationResult> 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<EditSmsSetting> GetSmsSettingToEdit(long id)
{
return await _smsSettingsRepository.GetSmsSettingToEdit(id);
}
public async Task<OperationResult> 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<List<SmsListData>> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting)
{
return await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting);
}
public async Task<List<BlockSmsListData>> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting)
{
return await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now);
}
public async Task<OperationResult> InstantSendReminderSms(List<SmsListData> 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<OperationResult> InstantSendBlockSms(List<BlockSmsListData> 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
/// <summary>
/// دریافت لیست پیامک های خودکار بر اساس نوع آن
/// Api
/// </summary>
/// <param name="typeOfSmsSetting"></param>
/// <returns></returns>
public async Task<List<SmsSettingDto>> GetSmsSettingList(TypeOfSmsSetting typeOfSmsSetting)
{
return await _smsSettingsRepository.GetSmsSettingList(typeOfSmsSetting);
}
public async Task<SmsSettingDto> GetSmsSettingDataToEdit(long id)
{
return await _smsSettingsRepository.GetSmsSettingDataToEdit(id);
}
public async Task<OperationResult> 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<List<InstantReminderSendSms>> GetInstantReminderSmsListData(TypeOfSmsSetting typeOfSmsSetting)
{
var result = new List<InstantReminderSendSms>();
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<OperationResult> InstantSmsSendApi(TypeOfSmsSetting typeOfSmsSetting, List<string> 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
}