diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index da463579..96c2cbb4 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -32,7 +32,7 @@ public class JobSchedulerRegistrator public void Register() { - _logger.LogInformation("hangfire Started"); + //_logger.LogInformation("hangfire Started"); //RecurringJob.AddOrUpdate( // "InstitutionContract.CreateFinancialTransaction", // () => CreateFinancialTransaction(), @@ -67,10 +67,24 @@ public class JobSchedulerRegistrator // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن //); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.SendLegalActionSms", + // () => SendLegalActionSms(), + // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + //); + + + RecurringJob.AddOrUpdate( - "InstitutionContract.SendLegalActionSms", - () => SendLegalActionSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + "InstitutionContract.Block", + () => Block(), + "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + ); + + RecurringJob.AddOrUpdate( + "InstitutionContract.UnBlock", + () => UnBlock(), + "*/1 * * * *" ); } @@ -82,14 +96,14 @@ public class JobSchedulerRegistrator //[DisableConcurrentExecution(timeoutInSeconds: 1200)] //public async System.Threading.Tasks.Task CreateFinancialTransaction() //{ - // var now =DateTime.Now; + // var now = DateTime.Now; // var endOfMonth = now.ToFarsi().FindeEndOfMonth(); // var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); // _logger.LogInformation("CreateFinancialTransaction job run"); // if (now.Date == endOfMonthGr.Date && now.Hour >= 2 && now.Hour < 4 && // now.Date != _lastRunCreateTransaction?.Date) // { - + // var month = endOfMonth.Substring(5, 2); // var year = endOfMonth.Substring(0, 4); // var monthName = month.ToFarsiMonthByNumber(); @@ -104,17 +118,17 @@ public class JobSchedulerRegistrator // try // { - // await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); + // await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); // _lastRunCreateTransaction = now; // Console.WriteLine("CreateTransAction executed"); - + // } // catch (Exception e) // { // await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); // } - + // } //} @@ -170,7 +184,7 @@ public class JobSchedulerRegistrator //public async System.Threading.Tasks.Task SendBlockSms() //{ // _logger.LogInformation("SendBlockSms job run"); - // await _institutionContractRepository.SendBlockSmsForBackgroundTask(); + // await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask(); //} @@ -196,11 +210,40 @@ public class JobSchedulerRegistrator // await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning); //} + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task SendLegalActionSms() + //{ + // _logger.LogInformation("SendWarningSms job run"); + // await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction); + //} + + /// + /// بلاگ سازی + /// + /// [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task SendLegalActionSms() + public async System.Threading.Tasks.Task Block() { - _logger.LogInformation("SendWarningSms job run"); - await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction); + _logger.LogInformation("block job run"); + var now = DateTime.Now; + var executeDate = now.ToFarsi().Substring(8, 2); + if (executeDate == "20") + { + if (now.Hour >= 9 && now.Hour < 10) + { + await _institutionContractSmsServiceRepository.Block(now); + } + + } + } + + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task UnBlock() + { + _logger.LogInformation("UnBlock job run"); + + await _institutionContractSmsServiceRepository.UnBlock(); + } } \ No newline at end of file diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 97bbab67..97325103 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -106,30 +106,7 @@ public interface IInstitutionContractRepository : IRepository Task SendMonthlySms(DateTime now); - /// - /// ارسال پیامک مسدودی از طرف بک گراند سرویس - /// - /// - Task SendBlockSmsForBackgroundTask(); - /// - /// دریافت لیست واجد شرایط بلاک - /// جهت ارسال پیامک مسدودی - /// - /// - /// - Task> GetBlockListData(DateTime checkDate); - - /// - /// ارسال پیامک مسدودی - /// - /// - /// - /// - /// - /// - Task SendBlockSmsToContractingParties(List smsListData, string typeOfSms, - string sendMessStart, string sendMessEnd); /// ///دریافت لیست بدهکارن diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs index 9d8703d4..fbd199c0 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -1,6 +1,7 @@ using _0_Framework.Application.Enums; using _0_Framework.Domain; using CompanyManagment.App.Contracts.InstitutionContract; +using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -8,7 +9,7 @@ namespace Company.Domain.InstitutionContractAgg; public interface IInstitutionContractSmsServiceRepository : IRepository { - + //هشدار و اقدام قضایی #region WarningOrLegalActionSmsListData /// /// اجرای تسک پیامک هشدار یا اقدام قضایی @@ -33,4 +34,54 @@ public interface IInstitutionContractSmsServiceRepository : IRepository smsListData, TypeOfSmsSetting typeOfSmsSetting); #endregion + + //بلاک - آنبلاک - پیامک بلاک + #region Block + + /// + /// ارسال پیامک مسدودی از طرف بک گراند سرویس + /// + /// + Task SendBlockSmsForBackgroundTask(); + + /// + /// دریافت لیست واجد شرایط بلاک + /// جهت ارسال پیامک مسدودی + /// + /// + /// + Task> GetBlockListData(DateTime checkDate); + + /// + /// ارسال پیامک مسدودی + /// + /// + /// + /// + /// + /// + Task SendBlockSmsToContractingParties(List smsListData, string typeOfSms, + string sendMessStart, string sendMessEnd); + + /// + /// بلاک سازی + /// + /// + /// + Task Block(DateTime checkDate); + + /// + /// دریافت لیست بدهکارانی که باید بلاک شوند + /// + /// + /// + Task> GetToBeBlockList(DateTime checkDate); + + /// + /// آنبلاک + /// + /// + Task UnBlock(); + + #endregion } \ No newline at end of file diff --git a/CompanyManagment.Application/SmsSettingApplication.cs b/CompanyManagment.Application/SmsSettingApplication.cs index 5888d331..9666fb2f 100644 --- a/CompanyManagment.Application/SmsSettingApplication.cs +++ b/CompanyManagment.Application/SmsSettingApplication.cs @@ -1,13 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using _0_Framework.Application; +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; namespace CompanyManagment.Application; @@ -15,11 +16,13 @@ public class SmsSettingApplication : ISmsSettingApplication { private readonly ISmsSettingsRepository _smsSettingsRepository; private readonly IInstitutionContractRepository _institutionContractRepository; + private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository; - public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository) + public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository) { _smsSettingsRepository = smsSettingsRepository; _institutionContractRepository = institutionContractRepository; + _institutionContractSmsServiceRepository = institutionContractSmsServiceRepository; } @@ -121,7 +124,7 @@ public class SmsSettingApplication : ISmsSettingApplication public async Task> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting) { - return await _institutionContractRepository.GetBlockListData(DateTime.Now); + return await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now); } @@ -153,7 +156,7 @@ public class SmsSettingApplication : ISmsSettingApplication string sendMessEnd = "پایان مسدودی آنی "; if (command.Any()) { - await _institutionContractRepository.SendBlockSmsToContractingParties(command, typeOfSms, sendMessStart, + await _institutionContractSmsServiceRepository.SendBlockSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd); return op.Succcedded(); } diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index bae3498d..4e578cbe 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -3653,385 +3653,7 @@ public class InstitutionContractRepository : RepositoryBase - /// پیامک بلاک - /// - /// - public async Task SendBlockSmsForBackgroundTask() - { - 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.BlockContractingParty && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.BlockContractingParty && - x.IsActive - ); - } - - - if (checkAnyToExecute) - { - //اجرای تسک - - //دریافت لیست بدهکاران - var smsListData = await GetBlockListData(now); - string typeOfSms = "اعلام مسدودی طرف حساب"; - string sendMessStart = "شروع پیامک مسدودی"; - string sendMessEnd = "پایان پیامک مسدودی"; - //ارسال پیامک - - await SendBlockSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); - - Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); - } - } - - - public async Task> GetBlockListData(DateTime checkDate) - { - var smsList = new List(); - - var institutionContracts = await _context.InstitutionContractSet - .Include(x => x.Installments) - .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, - InstallmentList = x.Installments - .Select(ins => new InstitutionContractInstallmentViewModel - { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) - .OrderBy(ins => ins.InstallmentDateGr).Skip(1).ToList(), - }).Where(x => x.ContractStartGr < checkDate && x.ContractEndGr >= checkDate && - x.ContractAmountDouble > 0 && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify).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 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); - if (contractingParty != null && contractingParty.IsBlock == "true") - { - 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 hasFinancialStatment = - financialStatmentList.Any(x => - x.ContractingPartyId == item.ContractingPartyId & x.FinancialTransactionList.Count > 0); - - - var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - - - if (hasFinancialStatment && hasPhonNumber) - { - 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) - { - var jobRelation = "بابت قرارداد مابین (روابط کار)"; - var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; - - - var jobRelationContract = transactions.FinancialTransactionList - .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => - x.TypeOfTransaction == "debt" && x.DescriptionOption == jobRelation); - var taxAndFinancialContract = transactions.FinancialTransactionList - .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => - x.TypeOfTransaction == "debt" && x.DescriptionOption == taxAndFinancial); - - var jobRelationContractAmounts = - jobRelationContract != null ? jobRelationContract.Deptor : 0; - var taxAndFinancialContractAmounts = - taxAndFinancialContract != null ? taxAndFinancialContract.Deptor : 0; - - var sumOfAmounts = jobRelationContractAmounts * 2 + taxAndFinancialContractAmounts * 2; - if (balance >= sumOfAmounts) - { - var phoneNumbers = new List(); - 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 accountType = item.OfficialCompany == "Official" ? "ol" : "nol"; - - var balanceToMoney = balance.ToMoney(); - var amount = balanceToMoney + " " + "ریال" + " "; - foreach (var number in phoneNumbers) - { - smsList.Add(new BlockSmsListData() - { - PhoneNumber = number.PhoneNumber, - PartyName = partyName, - AccountType = accountType, - Amount = amount, - ContractingPartyId = contractingParty.id, - InstitutionContractId = item.Id, - AproveId = aprove, - IsElectronicContract = false, - Code1 = "", - Code2 = "", - - }); - } - } - } - } - } - } - catch (Exception e) - { - string name = item.ContractingPartyName.Length > 18 - ? item.ContractingPartyName.Substring(0, 18) - : item.ContractingPartyName; - string errMess = $"{name}-خطا"; - await _smsService.Alarm("09114221321", errMess); - } - } - - foreach (var item in electronicInstitutionContract) - { - try - { - var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); - if (contractingParty != null && contractingParty.IsBlock == "true") - { - 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 hasFinancialStatment = - financialStatmentList.Any(x => - x.ContractingPartyId == item.ContractingPartyId & x.FinancialTransactionList.Count > 0); - - - var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - - - if (hasFinancialStatment && hasPhonNumber) - { - 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) - { - - var instalment = item.InstallmentList - .FirstOrDefault().AmountDouble; - - var sumOfAmounts = instalment * 2; - if (balance >= sumOfAmounts) - { - var phoneNumbers = new List(); - 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 accountType = item.OfficialCompany == "Official" ? "ol" : "nol"; - - var balanceToMoney = balance.ToMoney(); - var amount = balanceToMoney + " " + "ریال" + " "; - string publicId = transactions.PublicIdStr; - string code1 = publicId.Substring(0, 25); - string code2 = publicId.Substring(25); - foreach (var number in phoneNumbers) - { - - smsList.Add(new BlockSmsListData() - { - PhoneNumber = number.PhoneNumber, - PartyName = partyName, - AccountType = accountType, - Amount = amount, - ContractingPartyId = contractingParty.id, - InstitutionContractId = item.Id, - AproveId = aprove, - IsElectronicContract = true, - Code1 = code1, - Code2 = code2 - }); - } - } - } - } - } - } - catch (Exception e) - { - string name = item.ContractingPartyName.Length > 18 - ? item.ContractingPartyName.Substring(0, 18) - : item.ContractingPartyName; - string errMess = $"{name}-خطا"; - await _smsService.Alarm("09114221321", errMess); - } - } - return smsList; - } - public async Task SendBlockSmsToContractingParties(List smsListData, string typeOfSms, - string sendMessStart, string sendMessEnd) - { - if (smsListData.Any()) - { - await _smsService.Alarm("09114221321", sendMessStart); - Thread.Sleep(1000); - await _smsService.Alarm("09111485044", sendMessStart); - Thread.Sleep(1000); - int successProcess = 1; - int countList = smsListData.Count; - - foreach (var item in smsListData) - { - try - { - if (item.IsElectronicContract) - { - var smsResult = await _smsService.BlockMessageForElectronicContract(item.PhoneNumber, item.PartyName, - item.Amount, item.Code1, $"{item.Code2}"); - Thread.Sleep(1000); - var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(smsResult.messaeId, - smsResult.message, typeOfSms, - item.PartyName, item.PhoneNumber, item.ContractingPartyId, item.InstitutionContractId); - await _smsResultRepository.CreateAsync(createSmsResult); - await _smsResultRepository.SaveChangesAsync(); - } - else - { - var smsResult = await _smsService.BlockMessage(item.PhoneNumber, item.PartyName, - item.Amount, item.AccountType, $"{item.ContractingPartyId}", item.AproveId); - Thread.Sleep(1000); - var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(smsResult.messaeId, - smsResult.message, typeOfSms, - item.PartyName, item.PhoneNumber, item.ContractingPartyId, item.InstitutionContractId); - await _smsResultRepository.CreateAsync(createSmsResult); - await _smsResultRepository.SaveChangesAsync(); - } - - } - catch (Exception e) - { - string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; - string errMess = $"{name}-خطا"; - await _smsService.Alarm("09114221321", errMess); - } - - Thread.Sleep(600); - var percent = (successProcess / (double)countList) * 100; - await _hubContext.Clients.Group(SendSmsHub.GetGroupName(10)) - .SendAsync("showStatus", (int)percent); - - successProcess += 1; - } - - - await _smsService.Alarm("09114221321", sendMessEnd); - Thread.Sleep(1000); - await _smsService.Alarm("09111485044", sendMessEnd); - } - } - #endregion //دریافت لیست بدهکاران و ارسال پیامک #region GetListAndSendSmsMethods @@ -4698,6 +4320,7 @@ public class InstitutionContractRepository : RepositoryBase _logger; private readonly ISmsService _smsService; private readonly ISmsResultRepository _smsResultRepository; - public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger logger, ISmsResultRepository smsResultRepository) : base(context) + private readonly IHubContext _hubContext; + private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository; + public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger logger, ISmsResultRepository smsResultRepository, IHubContext hubContext, IPersonalContractingPartyRepository personalContractingPartyRepository) : base(context) { _context = context; _smsService = smsService; _logger = logger; _smsResultRepository = smsResultRepository; + _hubContext = hubContext; + _personalContractingPartyRepository = personalContractingPartyRepository; } + //هشدار - اقدام قضائی #region WarninSmsAndLegalActionSms public async Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting) @@ -77,8 +84,8 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase + /// پیامک بلاک + /// + /// + public async Task SendBlockSmsForBackgroundTask() + { + 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.BlockContractingParty && + x.IsActive + ); + } + else + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth == dayOfMonth && + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == TypeOfSmsSetting.BlockContractingParty && + x.IsActive + ); + } + + + if (checkAnyToExecute) + { + //اجرای تسک + + //دریافت لیست بدهکاران + var smsListData = await GetBlockListData(now); + string typeOfSms = "اعلام مسدودی طرف حساب"; + string sendMessStart = "شروع پیامک مسدودی"; + string sendMessEnd = "پایان پیامک مسدودی"; + //ارسال پیامک + + await SendBlockSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); + + Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); + } + } + + + public async Task> GetBlockListData(DateTime checkDate) + { + var smsList = new List(); + + var institutionContracts = await _context.InstitutionContractSet + .Include(x => x.Installments) + .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, + InstallmentList = x.Installments + .Select(ins => new InstitutionContractInstallmentViewModel + { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) + .OrderBy(ins => ins.InstallmentDateGr).Skip(1).ToList(), + }).Where(x => x.ContractStartGr < checkDate && x.ContractEndGr >= checkDate && + x.ContractAmountDouble > 0 && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify).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 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); + if (contractingParty != null && contractingParty.IsBlock == "true") + { + 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 hasFinancialStatment = + financialStatmentList.Any(x => + x.ContractingPartyId == item.ContractingPartyId & x.FinancialTransactionList.Count > 0); + + + var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); + + + if (hasFinancialStatment && hasPhonNumber) + { + 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) + { + var jobRelation = "بابت قرارداد مابین (روابط کار)"; + var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; + + + var jobRelationContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == jobRelation); + var taxAndFinancialContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == taxAndFinancial); + + var jobRelationContractAmounts = + jobRelationContract != null ? jobRelationContract.Deptor : 0; + var taxAndFinancialContractAmounts = + taxAndFinancialContract != null ? taxAndFinancialContract.Deptor : 0; + + var sumOfAmounts = jobRelationContractAmounts * 2 + taxAndFinancialContractAmounts * 2; + if (balance >= sumOfAmounts) + { + var phoneNumbers = new List(); + 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 accountType = item.OfficialCompany == "Official" ? "ol" : "nol"; + + var balanceToMoney = balance.ToMoney(); + var amount = balanceToMoney + " " + "ریال" + " "; + foreach (var number in phoneNumbers) + { + smsList.Add(new BlockSmsListData() + { + PhoneNumber = number.PhoneNumber, + PartyName = partyName, + AccountType = accountType, + Amount = amount, + ContractingPartyId = contractingParty.id, + InstitutionContractId = item.Id, + AproveId = aprove, + IsElectronicContract = false, + Code1 = "", + Code2 = "", + + }); + } + } + } + } + } + + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + + foreach (var item in electronicInstitutionContract) + { + try + { + var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); + if (contractingParty != null && contractingParty.IsBlock == "true") + { + 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 hasFinancialStatment = + financialStatmentList.Any(x => + x.ContractingPartyId == item.ContractingPartyId & x.FinancialTransactionList.Count > 0); + + + var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); + + + if (hasFinancialStatment && hasPhonNumber) + { + 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) + { + + var instalment = item.InstallmentList + .FirstOrDefault().AmountDouble; + + var sumOfAmounts = instalment * 2; + if (balance >= sumOfAmounts) + { + var phoneNumbers = new List(); + 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 accountType = item.OfficialCompany == "Official" ? "ol" : "nol"; + + var balanceToMoney = balance.ToMoney(); + var amount = balanceToMoney + " " + "ریال" + " "; + string publicId = transactions.PublicIdStr; + string code1 = publicId.Substring(0, 25); + string code2 = publicId.Substring(25); + foreach (var number in phoneNumbers) + { + + smsList.Add(new BlockSmsListData() + { + PhoneNumber = number.PhoneNumber, + PartyName = partyName, + AccountType = accountType, + Amount = amount, + ContractingPartyId = contractingParty.id, + InstitutionContractId = item.Id, + AproveId = aprove, + IsElectronicContract = true, + Code1 = code1, + Code2 = code2 + }); + } + } + } + } + } + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + return smsList; + } + + public async Task SendBlockSmsToContractingParties(List smsListData, string typeOfSms, + string sendMessStart, string sendMessEnd) + { + if (smsListData.Any()) + { + await _smsService.Alarm("09114221321", sendMessStart); + Thread.Sleep(1000); + await _smsService.Alarm("09111485044", sendMessStart); + Thread.Sleep(1000); + int successProcess = 1; + int countList = smsListData.Count; + + foreach (var item in smsListData) + { + try + { + if (item.IsElectronicContract) + { + var smsResult = await _smsService.BlockMessageForElectronicContract(item.PhoneNumber, item.PartyName, + item.Amount, item.Code1, $"{item.Code2}"); + Thread.Sleep(1000); + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(smsResult.messaeId, + smsResult.message, typeOfSms, + item.PartyName, item.PhoneNumber, item.ContractingPartyId, item.InstitutionContractId); + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + else + { + var smsResult = await _smsService.BlockMessage(item.PhoneNumber, item.PartyName, + item.Amount, item.AccountType, $"{item.ContractingPartyId}", item.AproveId); + Thread.Sleep(1000); + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(smsResult.messaeId, + smsResult.message, typeOfSms, + item.PartyName, item.PhoneNumber, item.ContractingPartyId, item.InstitutionContractId); + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + + } + catch (Exception e) + { + string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + + Thread.Sleep(600); + var percent = (successProcess / (double)countList) * 100; + await _hubContext.Clients.Group(SendSmsHub.GetGroupName(10)) + .SendAsync("showStatus", (int)percent); + + successProcess += 1; + } + + + await _smsService.Alarm("09114221321", sendMessEnd); + Thread.Sleep(1000); + await _smsService.Alarm("09111485044", sendMessEnd); + } + } + + + public async Task> GetToBeBlockList(DateTime checkDate) + { + var contractingPartyIdList = new List(); + + var institutionContracts = await _context.InstitutionContractSet.Where(x=>x.IsActiveString == "true") + .Include(x => x.Installments) + .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, + InstallmentList = x.Installments + .Select(ins => new InstitutionContractInstallmentViewModel + { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) + .OrderBy(ins => ins.InstallmentDateGr).Skip(1).ToList(), + }).Where(x => x.ContractStartGr < checkDate && x.ContractEndGr >= checkDate && + x.ContractAmountDouble > 0 && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify).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 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); + if (contractingParty != null && contractingParty.IsBlock == "false" && + contractingParty.IsActiveString == "true") + { + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + + if (transactions != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + + var balance = debtor - creditor; + if (balance > 0) + { + var jobRelation = "بابت قرارداد مابین (روابط کار)"; + var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; + + + var jobRelationContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == jobRelation); + var taxAndFinancialContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == taxAndFinancial); + + var jobRelationContractAmounts = + jobRelationContract != null ? jobRelationContract.Deptor : 0; + var taxAndFinancialContractAmounts = + taxAndFinancialContract != null ? taxAndFinancialContract.Deptor : 0; + + var sumOfAmounts = jobRelationContractAmounts * 2 + taxAndFinancialContractAmounts * 2; + if (balance >= sumOfAmounts) + { + contractingPartyIdList.Add(contractingParty.id); + } + } + } + + + } + + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + + foreach (var item in electronicInstitutionContract) + { + try + { + var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); + if (contractingParty != null && contractingParty.IsBlock == "false" && + contractingParty.IsActiveString == "true") + { + + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + if (transactions != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + var balance = debtor - creditor; + if (balance > 0) + { + + var instalment = item.InstallmentList + .FirstOrDefault()!.AmountDouble; + + var sumOfAmounts = instalment * 2; + if (balance >= sumOfAmounts) + { + + contractingPartyIdList.Add(contractingParty.id); + } + } + } + + } + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + return contractingPartyIdList; + } + + /// + /// بلاک سازی + /// + /// + /// + public async Task Block(DateTime checkDate) + { + var toBeblockList = await GetToBeBlockList(checkDate); + + foreach (var item in toBeblockList) + { + var res = _personalContractingPartyRepository.Get(item); + if (res != null) + { + res.Block(); + + } + } + if (toBeblockList.Any()) + await _context.SaveChangesAsync(); + } + + /// + /// آنبلاک + /// + /// + public async Task UnBlock() + { + var getBlockedParties =await _context.PersonalContractingParties + .Where(x => x.IsBlock == "true" && x.IsActiveString == "true").Select(x=>x.id).ToArrayAsync(); + var checkDate = DateTime.Now; + if (getBlockedParties.Any()) + { + var institutionContracts = await _context.InstitutionContractSet.Where(x=> getBlockedParties.Contains(x.ContractingPartyId)) + .Include(x => x.Installments) + .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, + InstallmentList = x.Installments + .Select(ins => new InstitutionContractInstallmentViewModel + { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) + .OrderBy(ins => ins.InstallmentDateGr).Skip(1).ToList(), + }).Where(x => x.ContractStartGr < checkDate && x.ContractEndGr >= checkDate && + x.ContractAmountDouble > 0 && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify).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 financialStatmentList = await _context.FinancialStatments.AsSplitQuery() + .Where(x => getBlockedParties.Contains(x.ContractingPartyId)) + .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).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 transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + + if (transactions != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + + var balance = debtor - creditor; + if (balance > 0) + { + var jobRelation = "بابت قرارداد مابین (روابط کار)"; + var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; + + + var jobRelationContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == jobRelation); + var taxAndFinancialContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == taxAndFinancial); + + var jobRelationContractAmounts = + jobRelationContract != null ? jobRelationContract.Deptor : 0; + var taxAndFinancialContractAmounts = + taxAndFinancialContract != null ? taxAndFinancialContract.Deptor : 0; + + var sumOfAmounts = jobRelationContractAmounts * 2 + taxAndFinancialContractAmounts * 2; + if (balance < sumOfAmounts) + { + var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); + var blockTime = res.BlockTimes + 1; + res.DisableBlock(blockTime); + await _context.SaveChangesAsync(); + } + } + } + + + + + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + + foreach (var item in electronicInstitutionContract) + { + try + { + + + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + if (transactions != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + var balance = debtor - creditor; + if (balance > 0) + { + + var instalment = item.InstallmentList + .FirstOrDefault()!.AmountDouble; + + var sumOfAmounts = instalment * 2; + if (balance < sumOfAmounts) + { + var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); + var blockTime = res.BlockTimes + 1; + res.DisableBlock(blockTime); + + + } + } + } + + + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + + + await _context.SaveChangesAsync(); + } + + } + #endregion }