using _0_Framework.Application.Sms; using AccountManagement.Application.Contracts.Account; using AccountMangement.Infrastructure.EFCore; using Company.Domain.SmsResultAgg; using Microsoft.EntityFrameworkCore; using SmsResult = Company.Domain.SmsResultAgg.SmsResult; namespace BackgroundInstitutionContract.Task.Jobs; public class SmsReminder { private readonly AccountContext _accountContext; private readonly ISmsService _smsService; private readonly ISmsResultRepository _smsResultRepository; public SmsReminder(ISmsService smsService, AccountContext accountContext, ISmsResultRepository smsResultRepository) { _smsService = smsService; _accountContext = accountContext; _smsResultRepository = smsResultRepository; } public void Execute() { //var accounts = _accountContext.Accounts.Where(x => x.PositionId > 0 && x.IsActiveString == "true").Select(x => new AccountViewModel() { Id = x.id, Mobile = x.Mobile, Fullname = x.Fullname }).ToList(); //Thread.Sleep(300); //var accounts = new List() { new AccountViewModel() { Mobile = "09114221321", Id = 2 } }; var accounts= _accountContext.Accounts.Where(x => x.Username.ToLower()=="mahan").Select(x => new AccountViewModel() { Id = x.id, Mobile = x.Mobile, Fullname = x.Fullname }).ToList(); var smsVM = accounts.Select(x => new AccountSmsTaskViewModel() { Mobile = x.Mobile, AccountId = x.Id, FullName = x.Fullname, TaskCount = GetLateTasksCount(x.Id) }).Where(x => x.TaskCount > 0 && !string.IsNullOrEmpty(x.Mobile) && x.Mobile.Length == 11).ToList(); Thread.Sleep(300); foreach (var viewmodel in smsVM) { var smsResult = _smsService.TaskReminderSms(viewmodel.Mobile, $"{viewmodel.TaskCount}"); Thread.Sleep(1000); var createSmsResult = new SmsResult(smsResult.MessageId, smsResult.Message, "یادآور وظایف", viewmodel.FullName, viewmodel.Mobile, viewmodel.AccountId, viewmodel.AccountId); _smsResultRepository.Create(createSmsResult); _smsResultRepository.SaveChanges(); Thread.Sleep(1000); } } private int GetLateTasksCount(long accountId) { var positionValue = _accountContext.Accounts .Where(x => x.id == accountId) .Include(p => p.Position) .Select(x => x.Position.PositionValue) .FirstOrDefault(); if (positionValue == 0) return 0; DateTime now = DateTime.Now; int overdueTasksCount; if (positionValue == 1) { overdueTasksCount = _accountContext.Assigns.Include(x => x.Task).Where(x => x.AssignedId == accountId && x.AssignerId == accountId && x.Task.Assigns.Count == 1 && !x.IsCancel && !x.IsCanceledRequest && !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true") .GroupBy(x => x.TaskId).Select(x => x.First()).Count(); //overdueTasksCount = _accountContext.Tasks.Include(x => // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) && // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) && // !x.Assigns.Any(a => a.TimeRequest) // && x.Assigns.Any(a => a.AssignedId == accountId && a.AssignerId == accountId) && // (x.Assigns.First(a => a.AssignedId == accountId && a.AssignerId == accountId) // .EndTaskDate.Date <= DateTime.Now.Date) && x.Assigns.Count == 1); } else { overdueTasksCount = _accountContext.Assigns .Include(x => x.Task) .Where(x => x.AssignedId == accountId && !x.IsCancel && !x.IsCanceledRequest && !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true") .GroupBy(x => x.TaskId).Select(x => x.First()).Count(); } //overdueTasksCount = _accountContext.Tasks.Include(x => // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) && // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) && // !x.Assigns.Any(a => a.TimeRequest) // && x.Assigns.Any(a => a.AssignedId == accountId) && // (x.Assigns.First(a => a.AssignedId == accountId).EndTaskDate.Date <= DateTime.Now.Date)); var overdueRequestsCount = _accountContext.Assigns.Include(x => x.Task) .Where(x => (x.IsCanceledRequest || x.IsDoneRequest || x.TimeRequest) && !x.IsCancel && !x.IsDone && x.Task.IsActiveString == "true" && x.Task.SenderId == accountId).GroupBy(x => x.TaskId).Select(x => x.First()).Count(); return overdueTasksCount + overdueRequestsCount; } } public class AccountSmsTaskViewModel { public int TaskCount { get; set; } public long AccountId { get; set; } public string Mobile { get; set; } public string FullName { get; set; } }