using _0_Framework.Application.Enums; using _0_Framework.InfraStructure; using Company.Domain.InstitutionContractAgg; using CompanyManagment.App.Contracts.InstitutionContract; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using _0_Framework.Application; using _0_Framework.Application.Sms; using CompanyManagment.App.Contracts.InstitutionContractContactinfo; using PersianTools.Core; namespace CompanyManagment.EFCore.Repository; public class InstitutionContractSmsServiceRepository : RepositoryBase, IInstitutionContractSmsServiceRepository { private readonly CompanyContext _context; private readonly ILogger _logger; private readonly ISmsService _smsService; public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService) : base(context) { _context = context; _smsService = smsService; } #region WarningSms public async Task SendWarningSmsTask() { var now = DateTime.Now; // تبدیل تاریخ میلادی به شمسی var persianNow = now.ToFarsi(); var persianEndOfMonth = int.Parse(persianNow.FindeEndOfMonth().Substring(8, 2)); var dayOfMonth = int.Parse(persianNow.Substring(8, 2)); var hour = now.Hour; var minute = now.Minute; var checkAnyToExecute = false; //اگر آخرین روز ماه باشد //اگر روز مثلا عدد روز 31 بود ولی آخرین روز ماه 30 بود if (dayOfMonth == persianEndOfMonth) { checkAnyToExecute = await _context.SmsSettings .AnyAsync(x => x.DayOfMonth >= dayOfMonth && x.TimeOfDay.Hours == hour && x.TimeOfDay.Minutes == minute && x.TypeOfSmsSetting == TypeOfSmsSetting.Warning && x.IsActive ); } else { checkAnyToExecute = await _context.SmsSettings .AnyAsync(x => x.DayOfMonth == dayOfMonth && x.TimeOfDay.Hours == hour && x.TimeOfDay.Minutes == minute && x.TypeOfSmsSetting == TypeOfSmsSetting.Warning && x.IsActive ); } if (checkAnyToExecute) { var getSmsData =await GetWarningOrLegalActionSmsListData(TypeOfSmsSetting.Warning); } } #endregion /// ///دریافت لیست پیامک قراداد های آبی بدهکار /// /// public async Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting) { var smsList = new List(); var institutionContracts = await _context.InstitutionContractSet.AsQueryable().Select(x => new InstitutionContractViewModel { Id = x.id, ContractingPartyId = x.ContractingPartyId, ContractingPartyName = x.ContractingPartyName, ContractStartGr = x.ContractStartGr, ContractStartFa = x.ContractStartFa, ContractEndGr = x.ContractEndGr, ContractEndFa = x.ContractEndFa, IsActiveString = x.IsActiveString, ContractAmountDouble = x.ContractAmount, OfficialCompany = x.OfficialCompany, IsInstallment = x.IsInstallment, VerificationStatus = x.VerificationStatus, SigningType = x.SigningType, }).Where(x => x.IsActiveString == "blue" && x.ContractAmountDouble > 0).GroupBy(x => x.ContractingPartyId).Select(x => x.First()).ToListAsync(); // قرارداد هایی که بطور یکجا پرداخت شده اند var paidInFull = institutionContracts.Where(x => x.SigningType != InstitutionContractSigningType.Legacy && x.IsInstallment == false && x.SigningType != null).ToList(); //حذف قراداد هایی که یکجا پرداخت شده اند از لیست ایجاد سند ماهانه institutionContracts = institutionContracts.Except(paidInFull).ToList(); var contractingPartyList = await _context.PersonalContractingParties .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.id)).ToListAsync(); var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); var phoneNumberList = await _context.InstitutionContractContactInfos .Where(x => institutionContracts.Select(ins => ins.Id).Contains(x.InstitutionContractId)) .Where(x => x.SendSms && x.PhoneType == "شماره همراه" && !string.IsNullOrWhiteSpace(x.PhoneNumber) && x.PhoneNumber.Length == 11).ToListAsync(); var legalActionSentSms = await _context.SmsResults .Where(x => x.TypeOfSms == "اقدام قضایی").AsNoTracking().ToListAsync(); var oldInstitutionContract = institutionContracts.Where(x => x.IsInstallment == false).ToList(); var electronicInstitutionContract = institutionContracts.Where(x => x.IsInstallment == true).ToList(); foreach (var item in oldInstitutionContract) { try { var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); bool hasLegalActionSentSms = legalActionSentSms.Any(x => x.InstitutionContractId == item.Id); int year = Convert.ToInt32(item.ContractEndFa.Substring(0, 4)); int month = Convert.ToInt32(item.ContractEndFa.Substring(5, 2)); var endOfContractNextMonthStart = new PersianDateTime(year, month, 1).AddMonths(1); var endOfContractNextMonthEnd = (($"{endOfContractNextMonthStart}").FindeEndOfMonth()).ToGeorgianDateTime(); var now = DateTime.Now; if (!string.IsNullOrWhiteSpace(contractingParty.LName) && !hasLegalActionSentSms && now.Date <= endOfContractNextMonthEnd.Date) { //Thread.Sleep(500); var partyName = contractingParty.LName; if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; //var isBlock = contractingParty.IsBlock == "true" ? true : false; //var isActive = contractingParty.IsActiveString == "true" ? true : false; var hasFinancialStatement = financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); if (hasFinancialStatement && hasPhonNumber) { var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) .Select(x => new CreateContactInfo { PhoneType = x.PhoneType, PhoneNumber = x.PhoneNumber, InstitutionContractId = x.InstitutionContractId, SendSms = x.SendSms }).Where(x => x.PhoneNumber.Length == 11).ToList(); var transactions = financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); //var id = $"{item.ContractingPartyId}"; var aprove = $"{transactions.id}"; var balance = debtor - creditor; if (balance > 0) // اگر بدهکار بود { if (isLegal) { if (item.OfficialCompany == "Official") // حقوقی بدهکار رسمی { var balanceToMoney = balance.ToMoney(); foreach (var number in phoneNumbers) { if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && number.PhoneNumber.Length == 11) { //var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 608443, // partyName, // balanceToMoney, id, aprove); //Thread.Sleep(1000); //if (smsResult.IsSuccedded) //{ // var createSmsResult = new SmsResult(smsResult.MessageId, // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, // item.ContractingPartyId, item.Id); // _smsResultRepository.Create(createSmsResult); // _smsResultRepository.SaveChanges(); // Thread.Sleep(1000); //} smsList.Add(new SmsListData() { PhoneNumber = number.PhoneNumber, TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 608443 : 0, PartyName = partyName, Amount = balanceToMoney, ContractingPartyId = contractingParty.id, AproveId = aprove, TypeOfSmsMethod = "MonthlyBill", Code1 = "", Code2 = "", InstitutionContractId = item.Id }); } } } else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی { var balanceToMoney = balance.ToMoney(); foreach (var number in phoneNumbers) { if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && number.PhoneNumber.Length == 11) { //var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 351691, // partyName, // balanceToMoney, id, aprove); //Thread.Sleep(1000); //if (smsResult.IsSuccedded) //{ // var createSmsResult = new SmsResult(smsResult.MessageId, // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, // item.ContractingPartyId, item.Id); // _smsResultRepository.Create(createSmsResult); // _smsResultRepository.SaveChanges(); // Thread.Sleep(1000); //} smsList.Add(new SmsListData() { PhoneNumber = number.PhoneNumber, TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 351691 : 0, PartyName = partyName, Amount = balanceToMoney, ContractingPartyId = contractingParty.id, AproveId = aprove, TypeOfSmsMethod = "MonthlyBill", Code1 = "", Code2 = "", InstitutionContractId = item.Id }); } } } } else { if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی { var balanceToMoney = balance.ToMoney(); foreach (var number in phoneNumbers) { if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && number.PhoneNumber.Length == 11) { //var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 190430, // partyName, // balanceToMoney, id, aprove); //Thread.Sleep(1000); //if (smsResult.IsSuccedded) //{ // var createSmsResult = new SmsResult(smsResult.MessageId, // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, // item.ContractingPartyId, item.Id); // _smsResultRepository.Create(createSmsResult); // _smsResultRepository.SaveChanges(); // Thread.Sleep(1000); //} smsList.Add(new SmsListData() { PhoneNumber = number.PhoneNumber, TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 190430 : 0, PartyName = partyName, Amount = balanceToMoney, ContractingPartyId = contractingParty.id, AproveId = aprove, TypeOfSmsMethod = "MonthlyBill", Code1 = "", Code2 = "", InstitutionContractId = item.Id }); } } } else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی { var balanceToMoney = balance.ToMoney(); foreach (var number in phoneNumbers) { if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && number.PhoneNumber.Length == 11) { //var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 412829, // partyName, // balanceToMoney, id, aprove); //Thread.Sleep(1000); //if (smsResult.IsSuccedded) //{ // var createSmsResult = new SmsResult(smsResult.MessageId, // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, // item.ContractingPartyId, item.Id); // _smsResultRepository.Create(createSmsResult); // _smsResultRepository.SaveChanges(); // Thread.Sleep(1000); //} smsList.Add(new SmsListData() { PhoneNumber = number.PhoneNumber, TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 412829 : 0, PartyName = partyName, Amount = balanceToMoney, ContractingPartyId = contractingParty.id, AproveId = aprove, TypeOfSmsMethod = "MonthlyBill", Code1 = "", Code2 = "", InstitutionContractId = item.Id }); } } } } } } } } catch (Exception e) { string name = item.ContractingPartyName.Length > 18 ? item.ContractingPartyName.Substring(0, 18) : item.ContractingPartyName; string errMess = $"{name}-خطا"; _smsService.Alarm("09114221321", errMess); _logger.LogError(e, "BlueWarningSms"); } } foreach (var item in electronicInstitutionContract) { try { var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); bool hasLegalActionSentSms = legalActionSentSms.Any(x => x.InstitutionContractId == item.Id); int year = Convert.ToInt32(item.ContractEndFa.Substring(0, 4)); int month = Convert.ToInt32(item.ContractEndFa.Substring(5, 2)); var endOfContractNextMonthStart = new PersianDateTime(year, month, 1).AddMonths(1); var endOfContractNextMonthEnd = (($"{endOfContractNextMonthStart}").FindeEndOfMonth()).ToGeorgianDateTime(); var now = DateTime.Now; if (!string.IsNullOrWhiteSpace(contractingParty.LName) && !hasLegalActionSentSms && now.Date <= endOfContractNextMonthEnd.Date) { var partyName = contractingParty.IsLegal == "حقیقی" ? $"{contractingParty.FName} {contractingParty.LName}" : $"{contractingParty.LName}"; if (!string.IsNullOrWhiteSpace(contractingParty.SureName)) partyName = $"{partyName} ({contractingParty.SureName})"; if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; //var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; //var isBlock = contractingParty.IsBlock == "true" ? true : false; //var isActive = contractingParty.IsActiveString == "true" ? true : false; var hasFinancialStatement = financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); if (hasFinancialStatement && hasPhonNumber) { var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) .Select(x => new CreateContactInfo { PhoneType = x.PhoneType, PhoneNumber = x.PhoneNumber, InstitutionContractId = x.InstitutionContractId, SendSms = x.SendSms }).Where(x => x.PhoneNumber.Length == 11).ToList(); var transactions = financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); //var id = $"{item.ContractingPartyId}"; var aprove = $"{transactions.id}"; var balance = debtor - creditor; int templateId = 0; //انتخاب قالب پیامک بر اساس حقیق/حقوقی if (balance > 0) // اگر بدهکار بود { var balanceToMoney = balance.ToMoney(); foreach (var number in phoneNumbers) { string publicId = transactions.PublicIdStr; string code1 = publicId.Substring(0, 25); string code2 = publicId.Substring(25); smsList.Add(new SmsListData() { PhoneNumber = number.PhoneNumber, TemplateId = 530657, PartyName = partyName, Amount = balanceToMoney, ContractingPartyId = contractingParty.id, AproveId = aprove, TypeOfSmsMethod = "MonthlyBillNew", Code1 = code1, Code2 = code2, InstitutionContractId = item.Id }); } } } } } catch (Exception e) { _logger.LogError($"ContractingPartyId : {item.ContractingPartyId} - ContractingPartyName : {item.ContractingPartyName} - InstitutionContractId : {item.Id} خطای دریافت لیست بدهکاران "); throw; } } return smsList; } }