From 1c7e8824c7744024e27ba6f76e58943f47b1b61d Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Mon, 12 Jan 2026 13:10:58 +0330 Subject: [PATCH] DeActiveInstitutionEndOfContract hangfire completed --- .../Jobs/JobSchedulerRegistrator.cs | 71 +++-- ...InstitutionContractSmsServiceRepository.cs | 8 + ...InstitutionContractSmsServiceRepository.cs | 244 +++++++++++++----- 3 files changed, 232 insertions(+), 91 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index ce5f76cd..7a93180c 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -75,16 +75,22 @@ public class JobSchedulerRegistrator - RecurringJob.AddOrUpdate( - "InstitutionContract.Block", - () => Block(), - "*/30 * * * *" // هر 30 دقیقه یکبار چک کن - ); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.Block", + // () => Block(), + // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + //); + + //RecurringJob.AddOrUpdate( + // "InstitutionContract.UnBlock", + // () => UnBlock(), + // "*/10 * * * *" + //); RecurringJob.AddOrUpdate( - "InstitutionContract.UnBlock", - () => UnBlock(), - "*/10 * * * *" + "InstitutionContract.DeActiveInstitutionEndOfContract", + () => DeActiveInstitutionEndOfContract(), + "*/30 * * * *" ); } @@ -220,30 +226,49 @@ public class JobSchedulerRegistrator /// /// بلاگ سازی /// - /// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task Block() + //{ + // _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(); + + //} + [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task Block() + public async System.Threading.Tasks.Task DeActiveInstitutionEndOfContract() { - _logger.LogInformation("block job run"); + _logger.LogInformation("DeActiveInstitutionEndOfContract job run"); + + var now = DateTime.Now; var executeDate = now.ToFarsi().Substring(8, 2); - if (executeDate == "20") + if (executeDate == "01") { if (now.Hour >= 9 && now.Hour < 10) { - await _institutionContractSmsServiceRepository.Block(now); + await _institutionContractSmsServiceRepository.DeActiveInstitutionEndOfContract(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/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs index fbd199c0..b143d711 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -83,5 +83,13 @@ public interface IInstitutionContractSmsServiceRepository : IRepository Task UnBlock(); + + /// + /// غیر فعالسازی قرارداد های پایان یافته + /// + /// + /// + Task DeActiveInstitutionEndOfContract(DateTime checkDate); + #endregion } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index d8958c53..b1632dae 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -2,12 +2,13 @@ using _0_Framework.Application.Enums; using _0_Framework.Application.Sms; using _0_Framework.InfraStructure; - +using Company.Domain.ContarctingPartyAgg; using Company.Domain.InstitutionContractAgg; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.Hubs; using CompanyManagment.App.Contracts.InstitutionContract; using CompanyManagment.App.Contracts.InstitutionContractContactinfo; +using CompanyManagment.EFCore.Migrations; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -18,7 +19,6 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using Company.Domain.ContarctingPartyAgg; namespace CompanyManagment.EFCore.Repository; @@ -30,6 +30,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase _hubContext; private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository; + public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger logger, ISmsResultRepository smsResultRepository, IHubContext hubContext, IPersonalContractingPartyRepository personalContractingPartyRepository) : base(context) { _context = context; @@ -999,7 +1000,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase(); - var institutionContracts = await _context.InstitutionContractSet.Where(x=>x.IsActiveString == "true") + var institutionContracts = await _context.InstitutionContractSet.Where(x => x.IsActiveString == "true") .Include(x => x.Installments) .Select(x => new InstitutionContractViewModel { @@ -1051,7 +1052,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); - + if (transactions != null) { var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); @@ -1085,7 +1086,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase public async Task UnBlock() { - var getBlockedParties =await _context.PersonalContractingParties - .Where(x => x.IsBlock == "true" && x.IsActiveString == "true").Select(x=>x.id).ToArrayAsync(); + 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)) + var institutionContracts = await _context.InstitutionContractSet.Where(x => getBlockedParties.Contains(x.ContractingPartyId)) .Include(x => x.Installments) .Select(x => new InstitutionContractViewModel { @@ -1198,7 +1199,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase new InstitutionContractInstallmentViewModel - { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) + { 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()) @@ -1222,48 +1223,48 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); - if (transactions != null) + 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; + + 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 debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); - var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); + var blockTime = res.BlockTimes + 1; + res.DisableBlock(blockTime); - - - var balance = debtor - creditor; - - 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); - - } - } + } + + - } catch (Exception e) @@ -1280,34 +1281,34 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); - if (transactions != null) + + 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; + + + var instalment = item.InstallmentList + .FirstOrDefault()!.AmountDouble; + + var sumOfAmounts = instalment * 2; + if (balance < sumOfAmounts) { - var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); - var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); + var blockTime = res.BlockTimes + 1; + res.DisableBlock(blockTime); - var balance = debtor - creditor; - - 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) { @@ -1322,9 +1323,116 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase (x.IsActiveString == "true" || x.IsActiveString == "blue") && (x.ContractEndGr.Date < checkDate.Date && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify)) + .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(), + }).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 => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) + .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); + //قرارداد های جاری فعال + var currentActiveContracts = await _context.InstitutionContractSet.Where(x => + x.ContractEndGr.Date > checkDate.Date && x.IsActiveString == "true" && + x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify).ToListAsync(); + + + + var institutionContractIds = institutionContracts.Select(x => x.Id).ToList(); + var queryableContracts =await _context.InstitutionContractSet.Where(x => institutionContractIds.Contains(x.id)).ToListAsync(); + foreach (var item in institutionContracts) + { + try + { + var existContractAfterThis = currentActiveContracts.Any(x => + x.ContractingPartyId == item.ContractingPartyId); + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + var contract = queryableContracts.FirstOrDefault(x => x.id == item.Id); + if (transactions != null && contract != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + + var balance = debtor - creditor; + + + if (balance > 0) + { + if (existContractAfterThis) // اگر بعد از این قراداد مالی قراردادی داشت حتی اگر بدهکار بود فقط غیرفعالش کن + contract.DeActive(); + else // اگر نداشت غیر فعال آبیش کن + contract.DeActiveBlue(); + + } + else // اگر بدهکار نبود چه بعدش قرارداد مالی داشت چه نداشت غیرفعال کن + { + contract.DeActive(); + + } + + await _context.SaveChangesAsync(); + if (!existContractAfterThis) // اگر بعد از این قراداد مالی قرادادی نداشت همه وابستگی ها را غیر فعال کن + { + await _personalContractingPartyRepository.DeActiveAllAsync(item.ContractingPartyId); + Thread.Sleep(500); + } + } + + + + + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } } #endregion + + + }