From 35e6355069e249c1ca1ba8e745a7b8b333bb47d4 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 11:19:25 +0330 Subject: [PATCH 01/19] get Warning sms List on new repo --- .../Jobs/JobSchedulerRegistrator.cs | 64 +-- .../IInstitutionContractRepository.cs | 10 +- ...InstitutionContractSmsServiceRepository.cs | 18 + .../InstitutionContractRepository.cs | 323 +------------- ...InstitutionContractSmsServiceRepository.cs | 393 ++++++++++++++++++ .../PersonalBootstrapper.cs | 1 + 6 files changed, 449 insertions(+), 360 deletions(-) create mode 100644 Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs create mode 100644 CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index f368cb3e..70517f47 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -12,57 +12,59 @@ public class JobSchedulerRegistrator private readonly IBackgroundJobClient _backgroundJobClient; private readonly SmsReminder _smsReminder; private readonly IInstitutionContractRepository _institutionContractRepository; + private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository; private static DateTime? _lastRunCreateTransaction; private static DateTime? _lastRunSendMonthlySms; private readonly ISmsService _smsService; private readonly ILogger _logger; - public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger logger) + public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger logger, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository) { _smsReminder = smsReminder; _backgroundJobClient = backgroundJobClient; _institutionContractRepository = institutionContractRepository; _smsService = smsService; _logger = logger; + _institutionContractSmsServiceRepository = institutionContractSmsServiceRepository; } public void Register() { _logger.LogInformation("hangfire Started"); - RecurringJob.AddOrUpdate( - "InstitutionContract.CreateFinancialTransaction", - () => CreateFinancialTransaction(), - "*/30 * * * *" // هر 30 دقیقه یکبار چک کن - ); - - RecurringJob.AddOrUpdate( - "InstitutionContract.SendMonthlySms", - () => SendFirstDayOfMonthSms(), - "*/20 * * * *" // هر 30 دقیقه یکبار چک کن - ); - - RecurringJob.AddOrUpdate( - "InstitutionContract.SendReminderSms", - () => SendReminderSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); - RecurringJob.AddOrUpdate( - "InstitutionContract.SendBlockSms", - () => SendBlockSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); - RecurringJob.AddOrUpdate( - "InstitutionContract.SendInstitutionContractConfirmSms", - () => SendInstitutionContractConfirmSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.CreateFinancialTransaction", + // () => CreateFinancialTransaction(), + // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + //); //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendWarningSms", - // () => SendWarningSms(), + // "InstitutionContract.SendMonthlySms", + // () => SendFirstDayOfMonthSms(), + // "*/20 * * * *" // هر 30 دقیقه یکبار چک کن + //); + + //RecurringJob.AddOrUpdate( + // "InstitutionContract.SendReminderSms", + // () => SendReminderSms(), // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن //); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.SendBlockSms", + // () => SendBlockSms(), + // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + //); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.SendInstitutionContractConfirmSms", + // () => SendInstitutionContractConfirmSms(), + // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + //); + + RecurringJob.AddOrUpdate( + "InstitutionContract.SendWarningSms", + () => SendWarningSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); //RecurringJob.AddOrUpdate( // "InstitutionContract.SendLegalActionSms", @@ -190,7 +192,7 @@ public class JobSchedulerRegistrator public async System.Threading.Tasks.Task SendWarningSms() { _logger.LogInformation("SendWarningSms job run"); - await _institutionContractRepository.SendWarningSmsTask(); + await _institutionContractSmsServiceRepository.SendWarningSmsTask(); } [DisableConcurrentExecution(timeoutInSeconds: 100)] diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 61097777..c576da00 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -162,14 +162,7 @@ public interface IInstitutionContractRepository : IRepository - /// پیامک های هشدار - /// - /// - Task SendWarningSmsTask(); - #endregion #region legalAction @@ -181,6 +174,9 @@ public interface IInstitutionContractRepository : IRepository GetIdByInstallmentId(long installmentId); Task GetPreviousContract(long currentInstitutionContractId); Task CreationInquiry(InstitutionContractCreationInquiryRequest request); diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs new file mode 100644 index 00000000..32c14c5e --- /dev/null +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -0,0 +1,18 @@ +using _0_Framework.Application.Enums; +using _0_Framework.Domain; +using CompanyManagment.App.Contracts.InstitutionContract; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Company.Domain.InstitutionContractAgg; + +public interface IInstitutionContractSmsServiceRepository : IRepository +{ + + #region WarningOrLegalActionSmsListData + + Task SendWarningSmsTask(); + Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting); + + #endregion +} \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 4ea52bbb..6b624087 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -6282,328 +6282,7 @@ public class InstitutionContractRepository : RepositoryBase - 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) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک ارسال پیامک هشدار SendWarningSms" + - persianNow + " - " + hour + ":" + minute); - - - } - } - - /// - ///دریافت لیست پیامک قراداد های آبی بدهکار - /// - /// - //public async Task> GetWarningSmsListData() - //{ - - // 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 institutionContractsIds = institutionContracts.Select(x => x.id).ToList(); - - // // قرارداد هایی که بطور یکجا پرداخت شده اند - // 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 == "اقدام قضایی").ToListAsync(); - // var warningSentSms = await _context.SmsResults.Where(x => x.TypeOfSms.Contains("هشدار")).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 = GetDetails(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; - // if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString)) - // { - // 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.FinancialTransactionViewModels.Sum(x => x.Deptor); - // var creditor = transactions.FinancialTransactionViewModels.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) - // { - - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // var t = warningSentSms.Any(x=> x.) - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - - // 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); - // } - - // } - // } - - - - // } - // else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی - // { - // var balanceToMoney = balance.ToMoney(); - // foreach (var number in phoneNumbers) - // { - // var isSend = _context.SmsResults.Any(x => - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber && x.TypeOfSms == typeOfSms); - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - - // 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); - // } - - - - // } - // } - - - // } - // } - // else - // { - // if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی - // { - // var balanceToMoney = balance.ToMoney(); - - // foreach (var number in phoneNumbers) - // { - // var isSend = _context.SmsResults.Any(x => - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber && x.TypeOfSms == typeOfSms); - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - - // 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); - // } - // } - // } - - - // } - // else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی - // { - // var balanceToMoney = balance.ToMoney(); - - // foreach (var number in phoneNumbers) - // { - // var isSend = _context.SmsResults.Any(x => - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber && x.TypeOfSms == typeOfSms); - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - // 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); - // } - - - // } - // } - - - // } - // } - // } - // } - // } - // } - // } - // 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"); - // } - // } - //} - #endregion + #region LegalActionSms diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs new file mode 100644 index 00000000..d8a5da00 --- /dev/null +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -0,0 +1,393 @@ +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 institutionContractsIds = institutionContracts.Select(x => x.Id).ToList(); + + // قرارداد هایی که بطور یکجا پرداخت شده اند + 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 warningSentSms = await _context.SmsResults.Where(x => x.TypeOfSms.Contains("هشدار")).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; + if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString)) + { + 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 = 608443, + 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 = 351691, + 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 = 190430, + 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 = 412829, + 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"); + } + } + + return smsList; + } +} + + diff --git a/PersonalContractingParty.Config/PersonalBootstrapper.cs b/PersonalContractingParty.Config/PersonalBootstrapper.cs index 4765fafb..24c110a5 100644 --- a/PersonalContractingParty.Config/PersonalBootstrapper.cs +++ b/PersonalContractingParty.Config/PersonalBootstrapper.cs @@ -561,6 +561,7 @@ public class PersonalBootstrapper services.AddTransient(); services.AddTransient(); + services.AddTransient(); #endregion From a1ed3ad648c8271bdad494eb553018a88c503aa3 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 11:35:03 +0330 Subject: [PATCH 02/19] logeer change --- ServiceHost/Program.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index 012f1a0a..ee563bb8 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -63,10 +63,17 @@ if (!Directory.Exists(logDirectory)) Directory.CreateDirectory(logDirectory); } -// فقط برای فایل از Serilog استفاده می‌شود -// تنظیمات MinimumLevel از appsettings.json خوانده می‌شود Log.Logger = new LoggerConfiguration() - .Enrich.FromLogContext() + //NO EF Core log + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + + //NO DbCommand log + .MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", LogEventLevel.Warning) + + //NO Microsoft Public log + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + + //.MinimumLevel.Information() .WriteTo.File( path: Path.Combine(logDirectory, "gozareshgir_log.txt"), rollingInterval: RollingInterval.Day, From 5202779d9f04a7c8a79167a12567356748e2b0e6 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 12:18:01 +0330 Subject: [PATCH 03/19] changes --- ...InstitutionContractSmsServiceRepository.cs | 120 ++++++++++++++++-- ServiceHost/Program.cs | 17 +-- 2 files changed, 109 insertions(+), 28 deletions(-) diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index d8a5da00..3661fbf1 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -104,7 +104,6 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.IsActiveString == "blue" && x.ContractAmountDouble > 0).GroupBy(x => x.ContractingPartyId).Select(x => x.First()).ToListAsync(); - var institutionContractsIds = institutionContracts.Select(x => x.Id).ToList(); // قرارداد هایی که بطور یکجا پرداخت شده اند var paidInFull = institutionContracts.Where(x => @@ -126,7 +125,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.TypeOfSms == "اقدام قضایی").AsNoTracking().ToListAsync(); - var warningSentSms = await _context.SmsResults.Where(x => x.TypeOfSms.Contains("هشدار")).AsNoTracking().ToListAsync(); + var oldInstitutionContract = institutionContracts.Where(x => x.IsInstallment == false).ToList(); var electronicInstitutionContract = institutionContracts.Where(x => x.IsInstallment == true).ToList(); @@ -151,10 +150,10 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 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; - if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString)) - { + //var isBlock = contractingParty.IsBlock == "true" ? true : false; + //var isActive = contractingParty.IsActiveString == "true" ? true : false; + + var hasFinancialStatement = financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); @@ -180,7 +179,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.Creditor); - var id = $"{item.ContractingPartyId}"; + //var id = $"{item.ContractingPartyId}"; var aprove = $"{transactions.id}"; var balance = debtor - creditor; @@ -220,7 +219,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 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; } } diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index ee563bb8..4f707f61 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -381,22 +381,7 @@ builder.Services.AddParbad().ConfigureGateways(gateways => // فقط Serilog برای File استفاده می‌شه، کنسول از لاگر پیش‌فرض ASP.NET استفاده می‌کنه -builder.Host.UseSerilog((context, services, configuration) => -{ - var logConfig = configuration - .ReadFrom.Configuration(context.Configuration) - .ReadFrom.Services(services) - .Enrich.FromLogContext(); - - - logConfig.WriteTo.File( - path: Path.Combine(logDirectory, "gozareshgir_log.txt"), - rollingInterval: RollingInterval.Day, - retainedFileCountLimit: 30, - shared: true, - outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}" - ); -}, writeToProviders: true); // این باعث میشه کنسول پیش‌فرض هم کار کنه +builder.Host.UseSerilog(); // این باعث میشه کنسول پیش‌فرض هم کار کنه Log.Information("SERILOG STARTED SUCCESSFULLY"); From 0ab3052251852c600b1025c7ff1dc31ea5f4fab9 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 14:04:34 +0330 Subject: [PATCH 04/19] Send Warning and leagal action Message --- .../Jobs/JobSchedulerRegistrator.cs | 219 +++--- .../IInstitutionContractRepository.cs | 8 - ...InstitutionContractSmsServiceRepository.cs | 20 +- .../InstitutionContractRepository.cs | 52 -- ...InstitutionContractSmsServiceRepository.cs | 622 +++++++++++------- 5 files changed, 501 insertions(+), 420 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index 70517f47..da463579 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -1,5 +1,6 @@ using _0_Framework.Application; +using _0_Framework.Application.Enums; using _0_Framework.Application.Sms; using Company.Domain.ContarctingPartyAgg; using Company.Domain.InstitutionContractAgg; @@ -60,146 +61,146 @@ public class JobSchedulerRegistrator // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن //); - RecurringJob.AddOrUpdate( - "InstitutionContract.SendWarningSms", - () => SendWarningSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendLegalActionSms", - // () => SendLegalActionSms(), + // "InstitutionContract.SendWarningSms", + // () => SendWarningSms(), // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن //); + + RecurringJob.AddOrUpdate( + "InstitutionContract.SendLegalActionSms", + () => SendLegalActionSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); } - /// - /// ایجاد سند بدهی ماهیانه برای قراداد مالی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 1200)] - public async System.Threading.Tasks.Task CreateFinancialTransaction() - { - 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) - { + ///// + ///// ایجاد سند بدهی ماهیانه برای قراداد مالی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 1200)] + //public async System.Threading.Tasks.Task CreateFinancialTransaction() + //{ + // 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(); - var description = $"{monthName} {year}"; + // var month = endOfMonth.Substring(5, 2); + // var year = endOfMonth.Substring(0, 4); + // var monthName = month.ToFarsiMonthByNumber(); + // var description = $"{monthName} {year}"; - var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); + // var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); - var endNewGr = endnew.ToGeorgianDateTime(); - var endNewFa = endNewGr.ToFarsi(); + // var endNewGr = endnew.ToGeorgianDateTime(); + // var endNewFa = endNewGr.ToFarsi(); - try - { - await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); - _lastRunCreateTransaction = now; - Console.WriteLine("CreateTransAction executed"); + // try + // { + // await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); + // _lastRunCreateTransaction = now; + // Console.WriteLine("CreateTransAction executed"); - } - catch (Exception e) - { - await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + // } + // catch (Exception e) + // { + // await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - } + // } - } - } + // } + //} - /// - /// ارسال پیامک صورت حساب ماهانه - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 600)] - public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() - { - //var now = new DateTime(2025,11,21, 10,30,0); - var now = DateTime.Now; - var endOfMonth = now.ToFarsi().FindeEndOfMonth(); - var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); - _logger.LogInformation("SendFirstDayOfMonthSms job run"); - if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && - now.Date != _lastRunSendMonthlySms?.Date) - { + ///// + ///// ارسال پیامک صورت حساب ماهانه + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 600)] + //public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() + //{ + // //var now = new DateTime(2025,11,21, 10,30,0); + // var now = DateTime.Now; + // var endOfMonth = now.ToFarsi().FindeEndOfMonth(); + // var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); + // _logger.LogInformation("SendFirstDayOfMonthSms job run"); + // if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && + // now.Date != _lastRunSendMonthlySms?.Date) + // { - try - { - await _institutionContractRepository.SendMonthlySms(now); - _lastRunSendMonthlySms = now; - Console.WriteLine("Send Monthly sms executed"); + // try + // { + // await _institutionContractRepository.SendMonthlySms(now); + // _lastRunSendMonthlySms = now; + // Console.WriteLine("Send Monthly sms executed"); - } - catch (Exception e) - { - //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + // } + // catch (Exception e) + // { + // //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - } + // } - } - } + // } + //} - /// - /// ارسال پیامک یاد آور بدهی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 1200)] - public async System.Threading.Tasks.Task SendReminderSms() - { - _logger.LogInformation("SendReminderSms job run"); - await _institutionContractRepository.SendReminderSmsForBackgroundTask(); - } + ///// + ///// ارسال پیامک یاد آور بدهی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 1200)] + //public async System.Threading.Tasks.Task SendReminderSms() + //{ + // _logger.LogInformation("SendReminderSms job run"); + // await _institutionContractRepository.SendReminderSmsForBackgroundTask(); + //} - /// - /// ارسال پیامک مسدودی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task SendBlockSms() - { - _logger.LogInformation("SendBlockSms job run"); - await _institutionContractRepository.SendBlockSmsForBackgroundTask(); - } + ///// + ///// ارسال پیامک مسدودی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task SendBlockSms() + //{ + // _logger.LogInformation("SendBlockSms job run"); + // await _institutionContractRepository.SendBlockSmsForBackgroundTask(); + //} - /// - /// ارسال پیامک یادآور تایید قراداد مالی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() - { - _logger.LogInformation("SendInstitutionContractConfirmSms job run"); - await _institutionContractRepository.SendInstitutionContractConfirmSmsTask(); - } + ///// + ///// ارسال پیامک یادآور تایید قراداد مالی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() + //{ + // _logger.LogInformation("SendInstitutionContractConfirmSms job run"); + // await _institutionContractRepository.SendInstitutionContractConfirmSmsTask(); + //} - /// - /// ارسال پیامک هشدار - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task SendWarningSms() - { - _logger.LogInformation("SendWarningSms job run"); - await _institutionContractSmsServiceRepository.SendWarningSmsTask(); - } + ///// + ///// ارسال پیامک هشدار + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task SendWarningSms() + //{ + // _logger.LogInformation("SendWarningSms job run"); + // await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning); + //} [DisableConcurrentExecution(timeoutInSeconds: 100)] public async System.Threading.Tasks.Task SendLegalActionSms() { _logger.LogInformation("SendWarningSms job run"); - await _institutionContractRepository.SendLegalActionSmsTask(); + await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction); } } \ No newline at end of file diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index c576da00..97bbab67 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -165,14 +165,6 @@ public interface IInstitutionContractRepository : IRepository - /// پیامک اقدام قضائی - /// - /// - Task SendLegalActionSmsTask(); - - #endregion diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs index 32c14c5e..9d8703d4 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -10,9 +10,27 @@ public interface IInstitutionContractSmsServiceRepository : IRepository + /// اجرای تسک پیامک هشدار یا اقدام قضایی + /// + /// + /// + Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting); - Task SendWarningSmsTask(); + /// + /// دریافت لیست بدهکاران آبی جهت هشدار یا اقدام قضایی + /// + /// + /// Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting); + /// + /// ارسال پیامک هشدار یا اقدام قضایی + /// + /// + /// + /// + Task SendWarningOrLegalActionSms(List smsListData, TypeOfSmsSetting typeOfSmsSetting); + #endregion } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 6b624087..875e3b91 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -6285,58 +6285,6 @@ public class InstitutionContractRepository : RepositoryBase - x.DayOfMonth >= dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.LegalAction && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.LegalAction && - x.IsActive - ); - } - - if (checkAnyToExecute) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک ارسال پیامک اقدام قضائی SendLegalActionSms" + - persianNow + " - " + hour + ":" + minute); - - - } - - } - #endregion #region CustomViewModels diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index 3661fbf1..da4029cd 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -1,18 +1,22 @@ -using _0_Framework.Application.Enums; +using _0_Framework.Application; +using _0_Framework.Application.Enums; +using _0_Framework.Application.Sms; using _0_Framework.InfraStructure; using Company.Domain.InstitutionContractAgg; +using Company.Domain.SmsResultAgg; +using CompanyManagment.App.Contracts.Hubs; using CompanyManagment.App.Contracts.InstitutionContract; +using CompanyManagment.App.Contracts.InstitutionContractContactinfo; +using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using PersianTools.Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; 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; @@ -21,15 +25,18 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase _logger; private readonly ISmsService _smsService; - public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService) : base(context) + private readonly ISmsResultRepository _smsResultRepository; + public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger logger, ISmsResultRepository smsResultRepository) : base(context) { _context = context; _smsService = smsService; + _logger = logger; + _smsResultRepository = smsResultRepository; } - #region WarningSms + #region WarninSmsAndLegalActionSms - public async Task SendWarningSmsTask() + public async Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting) { var now = DateTime.Now; @@ -51,7 +58,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase= dayOfMonth && x.TimeOfDay.Hours == hour && x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.Warning && + x.TypeOfSmsSetting == typeOfSmsSetting && x.IsActive ); } @@ -62,7 +69,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase ///دریافت لیست پیامک قراداد های آبی بدهکار /// @@ -141,237 +146,253 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase endOfContractNextMonthEnd.Date; + break; + } + + if (!string.IsNullOrWhiteSpace(contractingParty.LName) && executeCondition) + { + //Thread.Sleep(500);x.IsLegal == "حقیقی" ? $"{x.FName.Trim()} {x.LName.Trim()}" : $"{x.LName.Trim()}" + 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 hasFinancialStatement = + financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); + var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - //var id = $"{item.ContractingPartyId}"; - var aprove = $"{transactions.id}"; - var balance = debtor - creditor; - - if (balance > 0) // اگر بدهکار بود + if (hasFinancialStatement && hasPhonNumber) + { + var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) + .Select(x => new CreateContactInfo { + PhoneType = x.PhoneType, + PhoneNumber = x.PhoneNumber, - if (isLegal) + 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") // حقوقی بدهکار رسمی { - if (item.OfficialCompany == "Official") // حقوقی بدهکار رسمی - { - var balanceToMoney = balance.ToMoney(); + var balanceToMoney = balance.ToMoney(); - foreach (var number in phoneNumbers) + 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); + //} - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) + smsList.Add(new SmsListData() { - - //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 - }); - } + 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 + else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی { - if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی + var balanceToMoney = balance.ToMoney(); + foreach (var number in phoneNumbers) { - var balanceToMoney = balance.ToMoney(); - foreach (var number in phoneNumbers) + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) { - 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 + }); - //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 == "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") // حقیقی بدهکار غیر رسمی + + + } + else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) { - 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); + //} - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) + smsList.Add(new SmsListData() { - //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 - }); - } + 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) @@ -397,7 +418,20 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase endOfContractNextMonthEnd.Date; + break; + } + if (!string.IsNullOrWhiteSpace(contractingParty.LName) && executeCondition) { var partyName = contractingParty.IsLegal == "حقیقی" ? $"{contractingParty.FName} {contractingParty.LName}" @@ -411,68 +445,68 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); + + var hasFinancialStatement = + financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); - var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); + 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) // اگر بدهکار بود + if (hasFinancialStatement && hasPhonNumber) + { + var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) + .Select(x => new CreateContactInfo { - var balanceToMoney = balance.ToMoney(); + PhoneType = x.PhoneType, + PhoneNumber = x.PhoneNumber, - foreach (var number in phoneNumbers) + 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() { - string publicId = transactions.PublicIdStr; - string code1 = publicId.Substring(0, 25); - string code2 = publicId.Substring(25); + PhoneNumber = number.PhoneNumber, + TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 530657 : 665145, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBillNew", + Code1 = code1, + Code2 = code2, + InstitutionContractId = item.Id + }); - - 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 - }); - - } } } - + } + } } @@ -484,6 +518,94 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase smsListData, TypeOfSmsSetting typeOfSmsSetting) + { + //ارسال پیامک با اساس لیست + + var typeOfSms = ""; + + switch (typeOfSmsSetting) + { + case TypeOfSmsSetting.Warning: + typeOfSms = "هشدار"; + break; + case TypeOfSmsSetting.LegalAction: + typeOfSms = "اقدام قضایی"; + break; + } + #region SendSMSFromList + + if (smsListData.Any() && !string.IsNullOrWhiteSpace(typeOfSms)) + { + + + // int successProcess = 1; + //int countList = smsListData.Count; + + + foreach (var item in smsListData.Take(1)) + { + try + { + if (item.TypeOfSmsMethod == "MonthlyBill") + { + var res = await _smsService.MonthlyBill("09114221321", item.TemplateId, item.PartyName, + item.Amount, + $"{item.ContractingPartyId}", item.AproveId); + + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + else + { + var res = await _smsService.MonthlyBillNew(item.PhoneNumber, item.TemplateId, item.PartyName, + item.Amount, item.Code1, item.Code2); + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + + Thread.Sleep(600); + } + catch (Exception e) + { + string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; + string errMess = $"{name}-خطا"; + _logger.LogError(errMess); + await _smsService.Alarm("09114221321", errMess); + } + + //var percent = (successProcess / (double)countList) * 100; + //await _hubContext.Clients.Group(SendSmsHub.GetGroupName(7)) + //.SendAsync("showStatus", (int)percent); + + // successProcess += 1; + } + + + + } + + #endregion + } + + #endregion + } From 5580d568746fd669c8c9278c1d67b3999a0ad1d7 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 14:14:27 +0330 Subject: [PATCH 05/19] change logger on program.cs --- ...eshgirProgramManager.Infrastructure.csproj | 1 + .../FileManagement/LocalFileStorageService.cs | 1 + ServiceHost/Program.cs | 37 +++++++++++-------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/GozareshgirProgramManager.Infrastructure.csproj b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/GozareshgirProgramManager.Infrastructure.csproj index 0f441dc9..95f55437 100644 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/GozareshgirProgramManager.Infrastructure.csproj +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/GozareshgirProgramManager.Infrastructure.csproj @@ -15,6 +15,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/FileManagement/LocalFileStorageService.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/FileManagement/LocalFileStorageService.cs index 64c63ccc..9e534bbc 100644 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/FileManagement/LocalFileStorageService.cs +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Services/FileManagement/LocalFileStorageService.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; + namespace GozareshgirProgramManager.Infrastructure.Services.FileManagement; /// diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index baa3a2f4..218871e3 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -380,23 +380,30 @@ builder.Services.AddParbad().ConfigureGateways(gateways => }); -// فقط Serilog برای File استفاده می‌شه، کنسول از لاگر پیش‌فرض ASP.NET استفاده می‌کنه -builder.Host.UseSerilog((context, services, configuration) => +if (builder.Environment.IsDevelopment()) { - var logConfig = configuration - .ReadFrom.Configuration(context.Configuration) - .ReadFrom.Services(services) - .Enrich.FromLogContext(); + builder.Host.UseSerilog((context, services, configuration) => + { + var logConfig = configuration + .ReadFrom.Configuration(context.Configuration) + .ReadFrom.Services(services) + .Enrich.FromLogContext(); - - logConfig.WriteTo.File( - path: Path.Combine(logDirectory, "gozareshgir_log.txt"), - rollingInterval: RollingInterval.Day, - retainedFileCountLimit: 30, - shared: true, - outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}" - ); -}, writeToProviders: true); // این باعث میشه کنسول پیش‌فرض هم کار کنه + + logConfig.WriteTo.File( + path: Path.Combine(logDirectory, "gozareshgir_log.txt"), + rollingInterval: RollingInterval.Day, + retainedFileCountLimit: 30, + shared: true, + outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}" + ); + }, writeToProviders: true); // این باعث میشه کنسول پیش‌فرض هم کار کنه + +} +else +{ + builder.Host.UseSerilog(); +} Log.Information("SERILOG STARTED SUCCESSFULLY"); From 7cb39b1b92103c45d5b83045383d7bb8b392ab45 Mon Sep 17 00:00:00 2001 From: mahan Date: Thu, 8 Jan 2026 14:16:08 +0330 Subject: [PATCH 06/19] feat: add UserId filter to ProjectBoardListQuery for enhanced task assignment tracking --- .../Queries/ProjectBoardList/ProjectBoardListQuery.cs | 1 + .../Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs index 2d42152a..73ea9a9e 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs @@ -6,5 +6,6 @@ namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.Project public record ProjectBoardListQuery: IBaseQuery> { + public long? UserId { get; set; } public TaskSectionStatus? Status { get; set; } } \ No newline at end of file diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs index f23ea7d5..4ff4f377 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs @@ -40,6 +40,11 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler x.Status == request.Status); } + + if (request.UserId is > 0) + { + queryable = queryable.Where(x => x.CurrentAssignedUserId == request.UserId); + } var data = await queryable.ToListAsync(cancellationToken); From 8aa93e089af82a314d999154c4d51e02bc39c9ce Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 14:56:33 +0330 Subject: [PATCH 07/19] legal Action Sms completed --- .../InstitutionContractSmsServiceRepository.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index da4029cd..73049d4b 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -240,7 +240,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase Date: Thu, 8 Jan 2026 15:02:43 +0330 Subject: [PATCH 08/19] feat: enhance GetMessagesQuery to include additional time notes in message retrieval --- .../Queries/GetMessages/GetMessagesQuery.cs | 127 ++++++++++-------- 1 file changed, 74 insertions(+), 53 deletions(-) diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/TaskChat/Queries/GetMessages/GetMessagesQuery.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/TaskChat/Queries/GetMessages/GetMessagesQuery.cs index fbc3e3b8..9d0deccf 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/TaskChat/Queries/GetMessages/GetMessagesQuery.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/TaskChat/Queries/GetMessages/GetMessagesQuery.cs @@ -1,7 +1,6 @@ using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Application.Modules.TaskChat.DTOs; -using MediatR; using Microsoft.EntityFrameworkCore; namespace GozareshgirProgramManager.Application.Modules.TaskChat.Queries.GetMessages; @@ -25,6 +24,39 @@ public class GetMessagesQueryHandler : IBaseQueryHandler CreateAdditionalTimeNotes( + IEnumerable additionalTimes, + Dictionary users, + Guid taskId) + { + var notes = new List(); + + foreach (var additionalTime in additionalTimes) + { + var addedByUserName = additionalTime.AddedByUserId.HasValue && users.TryGetValue(additionalTime.AddedByUserId.Value, out var user) + ? user + : "سیستم"; + + var noteContent = $"⏱️ زمان اضافی: {additionalTime.Hours.TotalHours.ToString("F2")} ساعت - {(string.IsNullOrWhiteSpace(additionalTime.Reason) ? "بدون علت" : additionalTime.Reason)} - توسط {addedByUserName}"; + + var noteDto = new MessageDto + { + Id = Guid.NewGuid(), + TaskId = taskId, + SenderUserId = 0, + SenderName = "سیستم", + MessageType = "Note", + TextContent = noteContent, + CreationDate = additionalTime.CreationDate, + IsMine = false + }; + + notes.Add(noteDto); + } + + return notes; + } + public async Task>> Handle(GetMessagesQuery request, CancellationToken cancellationToken) { var currentUserId = _authHelper.GetCurrentUserId(); @@ -44,36 +76,52 @@ public class GetMessagesQueryHandler : IBaseQueryHandler m.SenderUserId).Distinct().ToList(); var users = await _context.Users .Where(u => senderUserIds.Contains(u.Id)) .ToDictionaryAsync(u => u.Id, u => u.FullName, cancellationToken); // ✅ گرفتن تمامی زمان‌های اضافی (Additional Times) برای نمایش به صورت نوت - // در اینجا تمامی TaskSections مربوط به این تسک را می‌گیریم - // و برای هر کدام تمام AdditionalTimes آن را بارگذاری می‌کنیم var taskSections = await _context.TaskSections .Where(ts => ts.TaskId == request.TaskId) .Include(ts => ts.AdditionalTimes) .ToListAsync(cancellationToken); + // ✅ تمام زمان‌های اضافی را یکجا بگیر و مرتب کن + var allAdditionalTimes = taskSections + .SelectMany(ts => ts.AdditionalTimes) + .OrderBy(at => at.CreationDate) + .ToList(); + var messageDtos = new List(); + // ✅ ابتدا زمان‌های اضافی قبل از اولین پیام را اضافه کن (اگر پیامی وجود داشته باشد) + if (messages.Any()) + { + var firstMessageDate = messages.First().CreationDate; + var additionalTimesBeforeFirstMessage = allAdditionalTimes + .Where(at => at.CreationDate < firstMessageDate) + .ToList(); + + messageDtos.AddRange(CreateAdditionalTimeNotes(additionalTimesBeforeFirstMessage, users, request.TaskId)); + } + else + { + // ✅ اگر هیچ پیامی وجود ندارد، همه زمان‌های اضافی را نمایش بده + messageDtos.AddRange(CreateAdditionalTimeNotes(allAdditionalTimes, users, request.TaskId)); + } + foreach (var message in messages) { // ✅ نام فرستنده را از Dictionary Users بگیر، در صورت عدم وجود "کاربر ناشناس" نمایش بده - var senderName = users.ContainsKey(message.SenderUserId) - ? users[message.SenderUserId] - : "کاربر ناشناس"; + var senderName = users.GetValueOrDefault(message.SenderUserId, "کاربر ناشناس"); var dto = new MessageDto { Id = message.Id, TaskId = message.TaskId, SenderUserId = message.SenderUserId, - SenderName = senderName, // ✅ از User واقعی استفاده می‌کنیم + SenderName = senderName, MessageType = message.MessageType.ToString(), TextContent = message.TextContent, ReplyToMessageId = message.ReplyToMessageId, @@ -88,10 +136,7 @@ public class GetMessagesQueryHandler : IBaseQueryHandler ts.AdditionalTimes) - .Where(at => at.AddedAt > message.CreationDate) // ✅ تغییر به AddedAt (زمان واقعی اضافه شدن) - .OrderBy(at => at.AddedAt) - .FirstOrDefault(); + // ✅ پیدا کردن پیام بعدی (اگر وجود داشته باشد) + var currentIndex = messages.IndexOf(message); + var nextMessage = currentIndex < messages.Count - 1 ? messages[currentIndex + 1] : null; - if (additionalTimesAfterMessage != null) + if (nextMessage != null) { - // ✅ تمام AdditionalTimes بین این پیام و پیام قبلی را بگیر - var additionalTimesByDate = taskSections - .SelectMany(ts => ts.AdditionalTimes) - .Where(at => at.AddedAt <= message.CreationDate && - (messageDtos.Count == 1 || at.AddedAt > messageDtos[messageDtos.Count - 2].CreationDate)) - .OrderBy(at => at.AddedAt) + // ✅ زمان‌های اضافی بین این پیام و پیام بعدی + var additionalTimesBetween = allAdditionalTimes + .Where(at => at.CreationDate > message.CreationDate && at.CreationDate < nextMessage.CreationDate) .ToList(); - foreach (var additionalTime in additionalTimesByDate) - { - // ✅ نام کاربری که این زمان اضافی را اضافه کرد - var addedByUserName = additionalTime.AddedByUserId.HasValue && users.TryGetValue(additionalTime.AddedByUserId.Value, out var user) - ? user - : "سیستم"; + messageDtos.AddRange(CreateAdditionalTimeNotes(additionalTimesBetween, users, request.TaskId)); + } + else + { + // ✅ این آخرین پیام است، زمان‌های اضافی بعد از آن را اضافه کن + var additionalTimesAfterLastMessage = allAdditionalTimes + .Where(at => at.CreationDate > message.CreationDate) + .ToList(); - // ✅ محتوای نوت را با اطلاعات کامل ایجاد کن - // نمایش می‌دهد: مقدار زمان + علت + نام کسی که اضافه کرد - var noteContent = $"⏱️ زمان اضافی: {additionalTime.Hours.TotalHours:F2} ساعت - {(string.IsNullOrWhiteSpace(additionalTime.Reason) ? "بدون علت" : additionalTime.Reason)} - توسط {addedByUserName}"; - - // ✅ نوت را به عنوان MessageDto خاصی ایجاد کن - var noteDto = new MessageDto - { - Id = Guid.NewGuid(), - TaskId = request.TaskId, - SenderUserId = 0, // ✅ سیستم برای نشان دادن اینکه یک پیام خودکار است - SenderName = "سیستم", - MessageType = "Note", // ✅ نوع پیام: Note (یادداشت سیستم) - TextContent = noteContent, - CreationDate = additionalTime.AddedAt, // ✅ تاریخ اضافه شدن زمان اضافی - IsMine = false - }; - - messageDtos.Add(noteDto); - } + messageDtos.AddRange(CreateAdditionalTimeNotes(additionalTimesAfterLastMessage, users, request.TaskId)); } } // ✅ مرتب کردن نهایی تمام پیام‌ها (معمولی + نوت‌ها) بر اساس زمان ایجاد - // اینطور که نوت‌های زمان اضافی در جای درست خود قرار می‌گیرند messageDtos = messageDtos.OrderBy(m => m.CreationDate).ToList(); var response = new PaginationResult() From b741ab9ed2ea7cb8e1f2f0094853bafa0fc257d9 Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 10 Jan 2026 10:34:20 +0330 Subject: [PATCH 09/19] fix contains no element error for empty skills --- .../ProjectDeployBoardDetailsQueryHandler.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs index ddff2247..9d93332d 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs @@ -73,6 +73,7 @@ public class var doneTime = t.Sections.Aggregate(TimeSpan.Zero, (sum, next) => sum.Add(next.GetTotalTimeSpent())); + var skills = t.Sections .Select(s => { @@ -88,7 +89,14 @@ public class skillName, timePercentage); }).ToList(); - var taskPercentage = (int)Math.Round(skills.Average(x => x.TimePercentage)); + + int taskPercentage = 0; + + if (!skills.Any()) + { + taskPercentage = 0; + } + taskPercentage = (int)Math.Round(skills.Average(x => x.TimePercentage)); return new ProjectDeployBoardDetailTaskItem( t.Name, From 587fa40d81c43f9ec129a2bcb420d413dca497ab Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 10 Jan 2026 10:45:38 +0330 Subject: [PATCH 10/19] fix percnetage condition --- .../ProjectDeployBoardDetailsQueryHandler.cs | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs index 9d93332d..07dade77 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectDeployBoardDetail/ProjectDeployBoardDetailsQueryHandler.cs @@ -21,7 +21,7 @@ public record ProjectDeployBoardDetailTaskItem( TimeSpan DoneTimeSpan, int Percentage, List Skills) - : ProjectDeployBoardDetailPhaseItem(Name, TotalTimeSpan, DoneTimeSpan,Percentage); + : ProjectDeployBoardDetailPhaseItem(Name, TotalTimeSpan, DoneTimeSpan, Percentage); public record ProjectDeployBoardDetailItemSkill(string OriginalUserFullName, string SkillName, int TimePercentage); @@ -73,7 +73,7 @@ public class var doneTime = t.Sections.Aggregate(TimeSpan.Zero, (sum, next) => sum.Add(next.GetTotalTimeSpent())); - + var skills = t.Sections .Select(s => { @@ -83,20 +83,23 @@ public class var skillName = s.Skill?.Name ?? "بدون مهارت"; var timePercentage = (int)s.GetProgressPercentage(); - + return new ProjectDeployBoardDetailItemSkill( originalUserFullName, skillName, timePercentage); }).ToList(); - - int taskPercentage = 0; - - if (!skills.Any()) + + int taskPercentage; + + if (skills.Count == 0) { taskPercentage = 0; } - taskPercentage = (int)Math.Round(skills.Average(x => x.TimePercentage)); + else + { + taskPercentage = (int)Math.Round(skills.Average(x => x.TimePercentage)); + } return new ProjectDeployBoardDetailTaskItem( t.Name, @@ -113,7 +116,7 @@ public class (sum, next) => sum.Add(next.DoneTimeSpan)); var phasePercentage = tasksRes.Average(x => x.Percentage); - + var phaseRes = new ProjectDeployBoardDetailPhaseItem(phase.Name, totalTimeSpan, doneTimeSpan, (int)phasePercentage); From e4355faffcc4d0850e0048b2ed2195662868c45d Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Sun, 11 Jan 2026 21:10:29 +0330 Subject: [PATCH 11/19] block and unblock --- .../Jobs/JobSchedulerRegistrator.cs | 69 +- .../IInstitutionContractRepository.cs | 23 - ...InstitutionContractSmsServiceRepository.cs | 53 +- .../SmsSettingApplication.cs | 19 +- .../InstitutionContractRepository.cs | 379 +-------- ...InstitutionContractSmsServiceRepository.cs | 727 +++++++++++++++++- 6 files changed, 844 insertions(+), 426 deletions(-) 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 } From 0d33d79620f9bf17556ff8a7599279b619909628 Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Sun, 11 Jan 2026 22:07:58 +0330 Subject: [PATCH 12/19] unblock hangfire completed --- .../Jobs/JobSchedulerRegistrator.cs | 2 +- .../InstitutionContractSmsServiceRepository.cs | 12 +++++------- .../Pages/Company/InstitutionContracts/Index.cshtml | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index 96c2cbb4..ce5f76cd 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -84,7 +84,7 @@ public class JobSchedulerRegistrator RecurringJob.AddOrUpdate( "InstitutionContract.UnBlock", () => UnBlock(), - "*/1 * * * *" + "*/10 * * * *" ); } diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index 8e5c7b0a..d8958c53 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -1234,8 +1234,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 0) - { + var jobRelation = "بابت قرارداد مابین (روابط کار)"; var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; @@ -1258,9 +1257,9 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.Creditor); var balance = debtor - creditor; - if (balance > 0) - { + var instalment = item.InstallmentList .FirstOrDefault()!.AmountDouble; @@ -1306,7 +1304,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase -

From 0eff1b9a6631115fcc5cea1c56008a244d433703 Mon Sep 17 00:00:00 2001 From: mahan Date: Mon, 12 Jan 2026 12:07:43 +0330 Subject: [PATCH 13/19] change default task priority from medium to low --- .../ProjectAgg/Entities/ProjectTask.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectTask.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectTask.cs index 286d0387..8c11e2a0 100644 --- a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectTask.cs +++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectTask.cs @@ -20,7 +20,7 @@ public class ProjectTask : ProjectHierarchyNode { PhaseId = phaseId; _sections = new List(); - Priority = ProjectTaskPriority.Medium; + Priority = ProjectTaskPriority.Low; AddDomainEvent(new TaskCreatedEvent(Id, phaseId, name)); } From 1c7e8824c7744024e27ba6f76e58943f47b1b61d Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Mon, 12 Jan 2026 13:10:58 +0330 Subject: [PATCH 14/19] 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 + + + } From 77dbb505129584aba3171bf8186d548b1cf077f1 Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Mon, 12 Jan 2026 14:32:50 +0330 Subject: [PATCH 15/19] BlueDeActiveAfterZeroDebt hangfire completed --- .../Jobs/JobSchedulerRegistrator.cs | 386 ++++----- .../IInstitutionContractRepository.cs | 37 +- ...InstitutionContractSmsServiceRepository.cs | 52 +- .../SmsSettingApplication.cs | 4 +- .../InstitutionContractRepository.cs | 699 +---------------- ...InstitutionContractSmsServiceRepository.cs | 740 ++++++++++++++++++ 6 files changed, 1004 insertions(+), 914 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index 7a93180c..7395e737 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -32,226 +32,245 @@ public class JobSchedulerRegistrator public void Register() { - //_logger.LogInformation("hangfire Started"); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.CreateFinancialTransaction", - // () => CreateFinancialTransaction(), - // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن - //); + _logger.LogInformation("hangfire Started"); + RecurringJob.AddOrUpdate( + "InstitutionContract.CreateFinancialTransaction", + () => CreateFinancialTransaction(), + "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendMonthlySms", - // () => SendFirstDayOfMonthSms(), - // "*/20 * * * *" // هر 30 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendMonthlySms", + () => SendFirstDayOfMonthSms(), + "*/20 * * * *" // هر 30 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendReminderSms", - // () => SendReminderSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendBlockSms", - // () => SendBlockSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendInstitutionContractConfirmSms", - // () => SendInstitutionContractConfirmSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendReminderSms", + () => SendReminderSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendBlockSms", + () => SendBlockSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendInstitutionContractConfirmSms", + () => SendInstitutionContractConfirmSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendWarningSms", - // () => SendWarningSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendWarningSms", + () => SendWarningSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendLegalActionSms", - // () => SendLegalActionSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendLegalActionSms", + () => SendLegalActionSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); - //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 * * * *" + ); RecurringJob.AddOrUpdate( "InstitutionContract.DeActiveInstitutionEndOfContract", () => DeActiveInstitutionEndOfContract(), - "*/30 * * * *" + "*/30 * * * *" + ); + + RecurringJob.AddOrUpdate( + "InstitutionContract.BlueDeActiveAfterZeroDebt", + () => BlueDeActiveAfterZeroDebt(), + "*/10 * * * *" ); } - ///// - ///// ایجاد سند بدهی ماهیانه برای قراداد مالی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 1200)] - //public async System.Threading.Tasks.Task CreateFinancialTransaction() - //{ - // 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) - // { + /// + /// ایجاد سند بدهی ماهیانه برای قراداد مالی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 1200)] + public async System.Threading.Tasks.Task CreateFinancialTransaction() + { + 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(); - // var description = $"{monthName} {year}"; + var month = endOfMonth.Substring(5, 2); + var year = endOfMonth.Substring(0, 4); + var monthName = month.ToFarsiMonthByNumber(); + var description = $"{monthName} {year}"; - // var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); + var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); - // var endNewGr = endnew.ToGeorgianDateTime(); - // var endNewFa = endNewGr.ToFarsi(); + var endNewGr = endnew.ToGeorgianDateTime(); + var endNewFa = endNewGr.ToFarsi(); - // try - // { - // await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); - // _lastRunCreateTransaction = now; - // Console.WriteLine("CreateTransAction executed"); + try + { + await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); + _lastRunCreateTransaction = now; + Console.WriteLine("CreateTransAction executed"); - // } - // catch (Exception e) - // { - // await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + } + catch (Exception e) + { + await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - // } + } - // } - //} + } + } - ///// - ///// ارسال پیامک صورت حساب ماهانه - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 600)] - //public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() - //{ - // //var now = new DateTime(2025,11,21, 10,30,0); - // var now = DateTime.Now; - // var endOfMonth = now.ToFarsi().FindeEndOfMonth(); - // var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); - // _logger.LogInformation("SendFirstDayOfMonthSms job run"); - // if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && - // now.Date != _lastRunSendMonthlySms?.Date) - // { + /// + /// ارسال پیامک صورت حساب ماهانه + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 600)] + public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() + { + //var now = new DateTime(2025,11,21, 10,30,0); + var now = DateTime.Now; + var endOfMonth = now.ToFarsi().FindeEndOfMonth(); + var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); + _logger.LogInformation("SendFirstDayOfMonthSms job run"); + if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && + now.Date != _lastRunSendMonthlySms?.Date) + { - // try - // { - // await _institutionContractRepository.SendMonthlySms(now); - // _lastRunSendMonthlySms = now; - // Console.WriteLine("Send Monthly sms executed"); + try + { + await _institutionContractSmsServiceRepository.SendMonthlySms(now); + _lastRunSendMonthlySms = now; + Console.WriteLine("Send Monthly sms executed"); - // } - // catch (Exception e) - // { - // //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + } + catch (Exception e) + { + //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - // } + } - // } - //} + } + } - ///// - ///// ارسال پیامک یاد آور بدهی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 1200)] - //public async System.Threading.Tasks.Task SendReminderSms() - //{ - // _logger.LogInformation("SendReminderSms job run"); - // await _institutionContractRepository.SendReminderSmsForBackgroundTask(); - //} + /// + /// ارسال پیامک یاد آور بدهی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 1200)] + public async System.Threading.Tasks.Task SendReminderSms() + { + _logger.LogInformation("SendReminderSms job run"); + await _institutionContractSmsServiceRepository.SendReminderSmsForBackgroundTask(); + } - ///// - ///// ارسال پیامک مسدودی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task SendBlockSms() - //{ - // _logger.LogInformation("SendBlockSms job run"); - // await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask(); - //} + /// + /// ارسال پیامک مسدودی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task SendBlockSms() + { + _logger.LogInformation("SendBlockSms job run"); + await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask(); + } - ///// - ///// ارسال پیامک یادآور تایید قراداد مالی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() - //{ - // _logger.LogInformation("SendInstitutionContractConfirmSms job run"); - // await _institutionContractRepository.SendInstitutionContractConfirmSmsTask(); - //} + /// + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() + { + _logger.LogInformation("SendInstitutionContractConfirmSms job run"); + await _institutionContractSmsServiceRepository.SendInstitutionContractConfirmSmsTask(); + } - ///// - ///// ارسال پیامک هشدار - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task SendWarningSms() - //{ - // _logger.LogInformation("SendWarningSms job run"); - // await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning); - //} + /// + /// ارسال پیامک هشدار + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task SendWarningSms() + { + _logger.LogInformation("SendWarningSms job run"); + 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() + { + _logger.LogInformation("SendWarningSms job run"); + await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction); + } /// /// بلاگ سازی /// - ///// - //[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 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 UnBlock() + { + _logger.LogInformation("UnBlock job run"); + await _institutionContractSmsServiceRepository.UnBlock(); + + } + + + /// + /// غیر فعال سازی قراداد های پایان یافته + /// + /// [DisableConcurrentExecution(timeoutInSeconds: 100)] public async System.Threading.Tasks.Task DeActiveInstitutionEndOfContract() { @@ -266,9 +285,20 @@ public class JobSchedulerRegistrator { await _institutionContractSmsServiceRepository.DeActiveInstitutionEndOfContract(now); } - + } - + + } + + /// + /// غیرفعال سازس قرارداد های آبی که بدهی ندارند + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 800)] + public async System.Threading.Tasks.Task BlueDeActiveAfterZeroDebt() + { + _logger.LogInformation("BlueDeActiveAfterZeroDebt job run"); + await _institutionContractSmsServiceRepository.BlueDeActiveAfterZeroDebt(); } } \ No newline at end of file diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 97325103..48d94271 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -91,42 +91,7 @@ public interface IInstitutionContractRepository : IRepository> PrintAllAsync(List ids); - #region ReminderSMS - /// - /// دریافت لیست - ارسال پیامک - /// فراخوانی از سمت بک گراند سرویس - /// - /// - Task SendReminderSmsForBackgroundTask(); - - /// - /// ارسال پیامک صورت حساب ماهانه - /// - /// - /// - Task SendMonthlySms(DateTime now); - - - - /// - ///دریافت لیست بدهکارن - /// جهت ارسال پیامک - /// - /// - Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting); - - /// - /// ارسال پیامک های یاد آور بدهی - /// - /// - Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, string sendMessStart, string sendMessEnd); - - /// - /// ارسال پیامک یادآور تایید قراداد مالی - /// - /// - Task SendInstitutionContractConfirmSmsTask(); - #endregion + #region CreateMontlyTransaction diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs index b143d711..cef62c5d 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -9,6 +9,16 @@ namespace Company.Domain.InstitutionContractAgg; public interface IInstitutionContractSmsServiceRepository : IRepository { + #region reminderSMs + + + /// + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + Task SendInstitutionContractConfirmSmsTask(); + #endregion + //هشدار و اقدام قضایی #region WarningOrLegalActionSmsListData /// @@ -35,7 +45,8 @@ public interface IInstitutionContractSmsServiceRepository : IRepository @@ -91,5 +102,44 @@ public interface IInstitutionContractSmsServiceRepository : IRepository Task DeActiveInstitutionEndOfContract(DateTime checkDate); + /// + /// غیرفعال سازس قرارداد های آبی که بدهی ندارند + /// + /// + Task BlueDeActiveAfterZeroDebt(); + #endregion + + + #region ReminderSMS + + /// + /// دریافت لیست - ارسال پیامک + /// فراخوانی از سمت بک گراند سرویس + /// + /// + Task SendReminderSmsForBackgroundTask(); + + /// + /// ارسال پیامک صورت حساب ماهانه + /// + /// + /// + Task SendMonthlySms(DateTime now); + + + + /// + ///دریافت لیست بدهکارن + /// جهت ارسال پیامک + /// + /// + Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting); + + /// + /// ارسال پیامک های یاد آور بدهی + /// + /// + Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, string sendMessStart, string sendMessEnd); + #endregion } \ No newline at end of file diff --git a/CompanyManagment.Application/SmsSettingApplication.cs b/CompanyManagment.Application/SmsSettingApplication.cs index 9666fb2f..203a9e23 100644 --- a/CompanyManagment.Application/SmsSettingApplication.cs +++ b/CompanyManagment.Application/SmsSettingApplication.cs @@ -119,7 +119,7 @@ public class SmsSettingApplication : ISmsSettingApplication public async Task> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting) { - return await _institutionContractRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting); + return await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting); } public async Task> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting) @@ -137,7 +137,7 @@ public class SmsSettingApplication : ISmsSettingApplication if (command.Any()) { - await _institutionContractRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd); + await _institutionContractSmsServiceRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd); return op.Succcedded(); } else diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 4e578cbe..234c4461 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -3562,623 +3562,10 @@ public class InstitutionContractRepository : RepositoryBase - /// دریافت لیست - ارسال پیامک - /// فراخوانی از سمت بک گراند سرویس - /// - /// - public async Task SendReminderSmsForBackgroundTask() - { - 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.InstitutionContractDebtReminder && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder && - x.IsActive - ); - } - - - if (checkAnyToExecute) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک پیامک های یاد آور SendReminderSmsForBackgroundTask" + persianNow + " - " + - hour + ":" + minute); - //دریافت لیست بدهکاران - var smsListData = await GetSmsListData(now, TypeOfSmsSetting.InstitutionContractDebtReminder); - string typeOfSms = "یادآور بدهی ماهانه"; - string sendMessStart = "شروع پیامک یادآور"; - string sendMessEnd = "پایان پیامک یادآور"; - //ارسال پیامک - await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); - - - Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); - return true; - } - - return false; - } - #endregion - - //ماهانه - #region MonthlySms - - /// - /// ارسال پیامک صورت حساب ماهانه - /// - /// - /// - public async Task SendMonthlySms(DateTime now) - { - //دریافت لیست بدهکاران - var smsListData = await GetSmsListData(now, TypeOfSmsSetting.MonthlyInstitutionContract); - - string typeOfSms = "صورت حساب ماهانه"; - string sendMessStart = "شروع پیامک ماهانه"; - string sendMessEnd = "پایان پیامک ماهانه"; - //ارسال پیامک - await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); - } - - #endregion - - - - //دریافت لیست بدهکاران و ارسال پیامک - #region GetListAndSendSmsMethods - - /// - ///دریافت لیست بدهکارن - /// جهت ارسال پیامک - /// - /// - public async Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting) - { - var watch = new Stopwatch(); - var smsList = new List(); - var currentMonthStart = ($"{(checkDate.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); - var previusMonthEnd = currentMonthStart.AddDays(-1); - var previusMonthStart = ($"{(previusMonthEnd.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); - - watch.Start(); - //دریافت اطلاعات بدهکارن و ساخت لیست پیامک - - #region GetSmsListData - - //var rollcallServiceList = _context.RollCallServices.Where(x => x.StartService.Date <= previusMonthStart.Date && x.EndService.Date >= previusMonthEnd.Date).ToList(); - var institutionContracts = await _context.InstitutionContractSet.AsSplitQuery() - .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(); - - Console.WriteLine("database query: " + watch.Elapsed); - watch.Stop(); - watch.Start(); - - //var a = new FinancialInvoice(balance, item.ContractingPartyId, ""); - //var b = new FinancialInvoiceItem("", balance, a.id, FinancialInvoiceItemType.PreviousDebt, - // 0); - //a.AddItem(b); - //_context.Add(a); - 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); - //var isSend = sendedSms.Any(x => x.ContractingPatyId == contractingParty.Id); - if (!string.IsNullOrWhiteSpace(contractingParty.LName)) - { - //Thread.Sleep(500); - 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; - if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) - { - 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) // اگر بدهکار بود - { - //var employers = _context.Employers.Where(x => x.ContractingPartyId == item.ContractingPartyId) - // .Select(x => x.id); - //var workshops = _context.WorkshopEmployers.Where(x => employers.Contains(x.EmployerId)) - // .Select(x => x.WorkshopId).Distinct().ToList(); - - - //var services = - // rollcallServiceList.Where(x => workshops.Contains(x.WorkshopId)).ToList(); - - //var hasRollCallService = services.Count > 0; - - //موقت - var hasRollCallService = false; - - //if (hasRollCallService) - //{ - // var employees = - // _context.RollCallEmployees.Where(x => workshops.Contains(x.WorkshopId)) - // .Select(x => x.id); - - // var employeeCount = _context.RollCallEmployeesStatus - // .Where(x => employees.Contains(x.RollCallEmployeeId)) - // .Count(x => x.EndDate.Date == activeStatusDate.Date); - - // if (employeeCount == 0) - // hasRollCallService = false; - //} - - 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 templateId = 161233; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 394006; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - 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 templateId = 347415; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 679068; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - 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 templateId = 998180; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 646040; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - 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 templateId = 810539; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 566537; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - PartyName = partyName, - Amount = balanceToMoney, - ContractingPartyId = contractingParty.id, - AproveId = aprove, - TypeOfSmsMethod = "MonthlyBill", - Code1 = "", - Code2 = "", - InstitutionContractId = item.Id - }); - - } - } - } - } - } - - - phoneNumbers = new List(); - } - } - } - } - catch (Exception e) - { - string name = item.ContractingPartyName.Length > 18 - ? item.ContractingPartyName.Substring(0, 18) - : item.ContractingPartyName; - string errMess = $"{name}-خطا"; - // _smsService.Alarm("09114221321", errMess); - } - } - - foreach (var item in electronicInstitutionContract) - { - try - { - var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); - if (!string.IsNullOrWhiteSpace(contractingParty.LName)) - { - 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; - - if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) - { - 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 (isLegal) - { - templateId = 789638; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 983035; - } - } - else - { - templateId = 768277; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 479624; - } - } - - 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 = templateId, - 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; - } - } - - - #endregion - - Console.WriteLine("SmsListData: " + watch.Elapsed); - return smsList; - } - - - - /// - /// ارسال پیامک های یاد آور بدهی - /// - /// - public async Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, - string sendMessStart, string sendMessEnd) - { - //ارسال پیامک با اساس لیست - - #region SendSMSFromList - - 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.TypeOfSmsMethod == "MonthlyBill") - { - var res = await _smsService.MonthlyBill(item.PhoneNumber, item.TemplateId, item.PartyName, - item.Amount, - $"{item.ContractingPartyId}", item.AproveId); - - if (res.isSucceded) - { - var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, - res.message, typeOfSms, item.PartyName, item.PhoneNumber, - item.ContractingPartyId, item.InstitutionContractId); - - await _smsResultRepository.CreateAsync(createSmsResult); - await _smsResultRepository.SaveChangesAsync(); - } - } - else - { - var res = await _smsService.MonthlyBillNew(item.PhoneNumber, item.TemplateId, item.PartyName, - item.Amount, item.Code1, item.Code2); - if (res.isSucceded) - { - var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, - res.message, typeOfSms, item.PartyName, item.PhoneNumber, - item.ContractingPartyId, item.InstitutionContractId); - - await _smsResultRepository.CreateAsync(createSmsResult); - await _smsResultRepository.SaveChangesAsync(); - } - } - - Thread.Sleep(600); - } - catch (Exception e) - { - string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; - string errMess = $"{name}-خطا"; - _logger.LogError(errMess); - await _smsService.Alarm("09114221321", errMess); - } - - var percent = (successProcess / (double)countList) * 100; - await _hubContext.Clients.Group(SendSmsHub.GetGroupName(7)) - .SendAsync("showStatus", (int)percent); - - successProcess += 1; - } - - - //await _smsService.Alarm("09114221321", sendMessEnd); - //Thread.Sleep(1000); - //await _smsService.Alarm("09111485044", sendMessEnd); - } - - #endregion - } - - #endregion + #region PrivateMetods @@ -4224,89 +3611,7 @@ public class InstitutionContractRepository : RepositoryBase - /// ارسال پیامک یادآور تایید قراداد مالی - ///
- /// - public async Task SendInstitutionContractConfirmSmsTask() - { - 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.InstitutionContractConfirm && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractConfirm && - x.IsActive - ); - } - - - if (checkAnyToExecute) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک ارسال یاد آور تایید قراداد مالی SendInstitutionContractConfirmSms" + - persianNow + " - " + hour + ":" + minute); - //دریافت لیست قراداد های تایید نشده - var fromAmonthAgo = now.AddDays(-30); - var pendingContracts = await _context.InstitutionContractSet - .Where(x => x.CreationDate >= fromAmonthAgo && x.CreationDate.Date != now.Date && - x.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify) - .Join(_context.PersonalContractingParties, - contract => contract.ContractingPartyId, - contractingParty => contractingParty.id, - (contract, contractingParty) => new { contract, contractingParty }).Select(x => - new InstitutionCreationVerificationSmsDto - { - Number = x.contractingParty.Phone, - FullName = x.contractingParty.IsLegal == "حقیقی" - ? $"{x.contractingParty.FName} {x.contractingParty.LName}" - : $"{x.contractingParty.LName}", - ContractingPartyId = x.contract.ContractingPartyId, - InstitutionContractId = x.contract.id, - InstitutionId = x.contract.PublicId, - }).ToListAsync(); - - string typeOfSms = "یادآور تایید قرارداد مالی"; - foreach (var item in pendingContracts) - { - var sendResult = await _smsService.SendInstitutionCreationVerificationLink(item.Number, item.FullName, - item.InstitutionId, item.ContractingPartyId, item.InstitutionContractId, typeOfSms); - Thread.Sleep(1000); - } - - Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); - } - } - - #endregion + diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index b1632dae..ef8b77e1 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -15,6 +15,7 @@ using Microsoft.Extensions.Logging; using PersianTools.Core; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; @@ -1418,6 +1419,59 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + } + + + public async Task BlueDeActiveAfterZeroDebt() + { + var institutionContracts =await _context.InstitutionContractSet + .Where(x => x.IsActiveString == "blue").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(); + + foreach (var item in institutionContracts) + { + 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) + { + + item.DeActive(); + await _context.SaveChangesAsync(); + + } + + + } + } catch (Exception e) { @@ -1431,7 +1485,693 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + public async Task SendInstitutionContractConfirmSmsTask() + { + 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.InstitutionContractConfirm && + x.IsActive + ); + } + else + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth == dayOfMonth && + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractConfirm && + x.IsActive + ); + } + + + if (checkAnyToExecute) + { + //اجرای تسک + _logger.LogInformation("اجرای تسک ارسال یاد آور تایید قراداد مالی SendInstitutionContractConfirmSms" + + persianNow + " - " + hour + ":" + minute); + //دریافت لیست قراداد های تایید نشده + var fromAmonthAgo = now.AddDays(-30); + var pendingContracts = await _context.InstitutionContractSet + .Where(x => x.CreationDate >= fromAmonthAgo && x.CreationDate.Date != now.Date && + x.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify) + .Join(_context.PersonalContractingParties, + contract => contract.ContractingPartyId, + contractingParty => contractingParty.id, + (contract, contractingParty) => new { contract, contractingParty }).Select(x => + new InstitutionCreationVerificationSmsDto + { + Number = x.contractingParty.Phone, + FullName = x.contractingParty.IsLegal == "حقیقی" + ? $"{x.contractingParty.FName} {x.contractingParty.LName}" + : $"{x.contractingParty.LName}", + ContractingPartyId = x.contract.ContractingPartyId, + InstitutionContractId = x.contract.id, + InstitutionId = x.contract.PublicId, + }).ToListAsync(); + + string typeOfSms = "یادآور تایید قرارداد مالی"; + foreach (var item in pendingContracts) + { + var sendResult = await _smsService.SendInstitutionCreationVerificationLink(item.Number, item.FullName, + item.InstitutionId, item.ContractingPartyId, item.InstitutionContractId, typeOfSms); + Thread.Sleep(1000); + } + + Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); + } + } + + #endregion + + #region ReminderSMS + /// + /// دریافت لیست - ارسال پیامک + /// فراخوانی از سمت بک گراند سرویس + /// + /// + public async Task SendReminderSmsForBackgroundTask() + { + 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.InstitutionContractDebtReminder && + x.IsActive + ); + } + else + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth == dayOfMonth && + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder && + x.IsActive + ); + } + + + if (checkAnyToExecute) + { + //اجرای تسک + _logger.LogInformation("اجرای تسک پیامک های یاد آور SendReminderSmsForBackgroundTask" + persianNow + " - " + + hour + ":" + minute); + //دریافت لیست بدهکاران + var smsListData = await GetSmsListData(now, TypeOfSmsSetting.InstitutionContractDebtReminder); + string typeOfSms = "یادآور بدهی ماهانه"; + string sendMessStart = "شروع پیامک یادآور"; + string sendMessEnd = "پایان پیامک یادآور"; + //ارسال پیامک + await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); + + + Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); + return true; + } + + return false; + } + + /// + /// ارسال پیامک صورت حساب ماهانه + /// + /// + /// + public async Task SendMonthlySms(DateTime now) + { + //دریافت لیست بدهکاران + var smsListData = await GetSmsListData(now, TypeOfSmsSetting.MonthlyInstitutionContract); + + string typeOfSms = "صورت حساب ماهانه"; + string sendMessStart = "شروع پیامک ماهانه"; + string sendMessEnd = "پایان پیامک ماهانه"; + //ارسال پیامک + await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); + } + + /// + ///دریافت لیست بدهکارن + /// جهت ارسال پیامک + /// + /// + public async Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting) + { + var watch = new Stopwatch(); + var smsList = new List(); + var currentMonthStart = ($"{(checkDate.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); + var previusMonthEnd = currentMonthStart.AddDays(-1); + var previusMonthStart = ($"{(previusMonthEnd.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); + + watch.Start(); + //دریافت اطلاعات بدهکارن و ساخت لیست پیامک + + #region GetSmsListData + + //var rollcallServiceList = _context.RollCallServices.Where(x => x.StartService.Date <= previusMonthStart.Date && x.EndService.Date >= previusMonthEnd.Date).ToList(); + var institutionContracts = await _context.InstitutionContractSet.AsSplitQuery() + .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(); + + Console.WriteLine("database query: " + watch.Elapsed); + watch.Stop(); + watch.Start(); + + //var a = new FinancialInvoice(balance, item.ContractingPartyId, ""); + //var b = new FinancialInvoiceItem("", balance, a.id, FinancialInvoiceItemType.PreviousDebt, + // 0); + //a.AddItem(b); + //_context.Add(a); + 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); + //var isSend = sendedSms.Any(x => x.ContractingPatyId == contractingParty.Id); + if (!string.IsNullOrWhiteSpace(contractingParty.LName)) + { + //Thread.Sleep(500); + 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; + if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) + { + 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) // اگر بدهکار بود + { + //var employers = _context.Employers.Where(x => x.ContractingPartyId == item.ContractingPartyId) + // .Select(x => x.id); + //var workshops = _context.WorkshopEmployers.Where(x => employers.Contains(x.EmployerId)) + // .Select(x => x.WorkshopId).Distinct().ToList(); + + + //var services = + // rollcallServiceList.Where(x => workshops.Contains(x.WorkshopId)).ToList(); + + //var hasRollCallService = services.Count > 0; + + //موقت + var hasRollCallService = false; + + //if (hasRollCallService) + //{ + // var employees = + // _context.RollCallEmployees.Where(x => workshops.Contains(x.WorkshopId)) + // .Select(x => x.id); + + // var employeeCount = _context.RollCallEmployeesStatus + // .Where(x => employees.Contains(x.RollCallEmployeeId)) + // .Count(x => x.EndDate.Date == activeStatusDate.Date); + + // if (employeeCount == 0) + // hasRollCallService = false; + //} + + 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 templateId = 161233; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 394006; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + 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 templateId = 347415; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 679068; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + 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 templateId = 998180; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 646040; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + 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 templateId = 810539; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 566537; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBill", + Code1 = "", + Code2 = "", + InstitutionContractId = item.Id + }); + + } + } + } + } + } + + + phoneNumbers = new List(); + } + } + } + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + // _smsService.Alarm("09114221321", errMess); + } + } + + foreach (var item in electronicInstitutionContract) + { + try + { + var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); + if (!string.IsNullOrWhiteSpace(contractingParty.LName)) + { + 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; + + if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) + { + 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 (isLegal) + { + templateId = 789638; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 983035; + } + } + else + { + templateId = 768277; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 479624; + } + } + + 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 = templateId, + 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; + } + } + + + #endregion + + Console.WriteLine("SmsListData: " + watch.Elapsed); + return smsList; + } + + /// + /// ارسال پیامک های یاد آور بدهی + /// + /// + public async Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, + string sendMessStart, string sendMessEnd) + { + //ارسال پیامک با اساس لیست + + #region SendSMSFromList + + 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.TypeOfSmsMethod == "MonthlyBill") + { + var res = await _smsService.MonthlyBill(item.PhoneNumber, item.TemplateId, item.PartyName, + item.Amount, + $"{item.ContractingPartyId}", item.AproveId); + + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + else + { + var res = await _smsService.MonthlyBillNew(item.PhoneNumber, item.TemplateId, item.PartyName, + item.Amount, item.Code1, item.Code2); + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + + Thread.Sleep(600); + } + catch (Exception e) + { + string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; + string errMess = $"{name}-خطا"; + _logger.LogError(errMess); + await _smsService.Alarm("09114221321", errMess); + } + + var percent = (successProcess / (double)countList) * 100; + await _hubContext.Clients.Group(SendSmsHub.GetGroupName(7)) + .SendAsync("showStatus", (int)percent); + + successProcess += 1; + } + + + //await _smsService.Alarm("09114221321", sendMessEnd); + //Thread.Sleep(1000); + //await _smsService.Alarm("09111485044", sendMessEnd); + } + + #endregion + } + + #endregion } From d9c431e20e05753ce8a7f887d5834397e09b09df Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 13 Jan 2026 09:23:53 +0330 Subject: [PATCH 16/19] add project name search for board list --- .../ProjectBoardList/ProjectBoardListQuery.cs | 1 + .../ProjectBoardListQueryHandler.cs | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs index 73ea9a9e..d550cdbe 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs @@ -7,5 +7,6 @@ namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.Project public record ProjectBoardListQuery: IBaseQuery> { public long? UserId { get; set; } + public string? SearchText { get; set; } public TaskSectionStatus? Status { get; set; } } \ No newline at end of file diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs index 4ff4f377..a5b171f4 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs @@ -3,7 +3,6 @@ using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Domain.ProjectAgg.Enums; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Query.Internal; namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.ProjectBoardList; @@ -24,7 +23,8 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler x.InitialEstimatedHours > TimeSpan.Zero && x.Status != TaskSectionStatus.Completed) + .Where(x => x.InitialEstimatedHours > TimeSpan.Zero + && x.Status != TaskSectionStatus.Completed) .Include(x => x.Task) .ThenInclude(x => x.Phase) .ThenInclude(x => x.Project) @@ -45,10 +45,18 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler x.CurrentAssignedUserId == request.UserId); } + + if (!string.IsNullOrWhiteSpace(request.SearchText)) + { + queryable = queryable.Where(x=>x.Task.Name.Contains(request.SearchText) + || x.Task.Phase.Name.Contains(request.SearchText) + || x.Task.Phase.Project.Name.Contains(request.SearchText)); + } var data = await queryable.ToListAsync(cancellationToken); - var activityUserIds = data.SelectMany(x => x.Activities).Select(a => a.UserId).Distinct().ToList(); + var activityUserIds = data.SelectMany(x => x.Activities) + .Select(a => a.UserId).Distinct().ToList(); var assignedUser = data.Select(x => x.CurrentAssignedUserId) .Concat(data.Select(x => x.OriginalAssignedUserId)).ToList(); var allUserIds = activityUserIds.Concat(assignedUser).Distinct().ToList(); @@ -72,7 +80,7 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler Date: Tue, 13 Jan 2026 10:50:53 +0330 Subject: [PATCH 17/19] add fine api client controller --- .../Client/Controllers/FineController.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 ServiceHost/Areas/Client/Controllers/FineController.cs diff --git a/ServiceHost/Areas/Client/Controllers/FineController.cs b/ServiceHost/Areas/Client/Controllers/FineController.cs new file mode 100644 index 00000000..bdf60832 --- /dev/null +++ b/ServiceHost/Areas/Client/Controllers/FineController.cs @@ -0,0 +1,51 @@ +using _0_Framework.Application; +using CompanyManagment.App.Contracts.Fine; +using Microsoft.AspNetCore.Mvc; +using ServiceHost.BaseControllers; + +namespace ServiceHost.Areas.Client.Controllers; + +public class FineController:ClientBaseController +{ + private readonly IFineApplication _fineApplication; + + public FineController(IFineApplication fineApplication) + { + _fineApplication = fineApplication; + } + + [HttpGet] + public ActionResult GetList([FromQuery]FineSearchViewModel searchModel) + { + var res = _fineApplication.GetSearchListAsGrouped(searchModel); + return res; + } + + [HttpPost] + public ActionResult Create([FromBody]CreateFineViewModel command) + { + var res =_fineApplication.Create(command); + return res; + } + + [HttpPut] + public ActionResult Edit([FromBody]EditFineViewModel command) + { + var res = _fineApplication.Edit(command); + return res; + } + + [HttpGet("{id:long}")] + public ActionResult Details(long id) + { + var res = _fineApplication.GetDetails(id); + return res; + } + + [HttpDelete(("{id:long}"))] + public ActionResult Remove(long id) + { + var res = _fineApplication.Remove(id); + return res; + } +} \ No newline at end of file From a9df0669c6dc3e8bf311644d6aad6a2ae1a25447 Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 13 Jan 2026 11:08:03 +0330 Subject: [PATCH 18/19] add client api FineController.cs --- .../Client/Controllers/FineController.cs | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/ServiceHost/Areas/Client/Controllers/FineController.cs b/ServiceHost/Areas/Client/Controllers/FineController.cs index bdf60832..c06f90d7 100644 --- a/ServiceHost/Areas/Client/Controllers/FineController.cs +++ b/ServiceHost/Areas/Client/Controllers/FineController.cs @@ -1,5 +1,6 @@ using _0_Framework.Application; using CompanyManagment.App.Contracts.Fine; +using CompanyManagment.App.Contracts.FineSubject; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; @@ -8,15 +9,21 @@ namespace ServiceHost.Areas.Client.Controllers; public class FineController:ClientBaseController { private readonly IFineApplication _fineApplication; + private readonly IFineSubjectApplication _fineSubjectApplication; + private readonly long _workshopId; - public FineController(IFineApplication fineApplication) + public FineController(IFineApplication fineApplication, IFineSubjectApplication fineSubjectApplication, + IAuthHelper authHelper) { _fineApplication = fineApplication; + _fineSubjectApplication = fineSubjectApplication; + _workshopId = authHelper.GetWorkshopId(); } [HttpGet] public ActionResult GetList([FromQuery]FineSearchViewModel searchModel) { + searchModel.WorkshopId = _workshopId; var res = _fineApplication.GetSearchListAsGrouped(searchModel); return res; } @@ -24,6 +31,7 @@ public class FineController:ClientBaseController [HttpPost] public ActionResult Create([FromBody]CreateFineViewModel command) { + command.WorkshopId = _workshopId; var res =_fineApplication.Create(command); return res; } @@ -31,6 +39,7 @@ public class FineController:ClientBaseController [HttpPut] public ActionResult Edit([FromBody]EditFineViewModel command) { + command.WorkshopId = _workshopId; var res = _fineApplication.Edit(command); return res; } @@ -48,4 +57,37 @@ public class FineController:ClientBaseController var res = _fineApplication.Remove(id); return res; } + + #region FineSubject + + [HttpGet("subject")] + public ActionResult> GetList() + { + var res = _fineSubjectApplication.GetAll(_workshopId); + return res; + } + + [HttpPost("subject/{id:long}")] + public ActionResult CreateSubject(CreateFineSubjectViewModel command) + { + var res = _fineSubjectApplication.Create(command); + return res; + } + + [HttpPut("subject/{id:long}")] + public ActionResult EditSubject(EditFineSubjectViewModel command) + { + var res = _fineSubjectApplication.Edit(command); + return res; + } + + [HttpDelete("subject/{id:long}")] + public ActionResult RemoveSubject(long id) + { + var res = _fineSubjectApplication.Delete(id); + return res; + } + + #endregion + } \ No newline at end of file From 18867b49298eaf1707f3a0c005c9fa18a32e9082 Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 13 Jan 2026 11:10:48 +0330 Subject: [PATCH 19/19] set workshopId for FineController.cs --- ServiceHost/Areas/Client/Controllers/FineController.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ServiceHost/Areas/Client/Controllers/FineController.cs b/ServiceHost/Areas/Client/Controllers/FineController.cs index c06f90d7..d6233699 100644 --- a/ServiceHost/Areas/Client/Controllers/FineController.cs +++ b/ServiceHost/Areas/Client/Controllers/FineController.cs @@ -70,6 +70,7 @@ public class FineController:ClientBaseController [HttpPost("subject/{id:long}")] public ActionResult CreateSubject(CreateFineSubjectViewModel command) { + command.WorkshopId = _workshopId; var res = _fineSubjectApplication.Create(command); return res; } @@ -77,6 +78,7 @@ public class FineController:ClientBaseController [HttpPut("subject/{id:long}")] public ActionResult EditSubject(EditFineSubjectViewModel command) { + command.WorkshopId = _workshopId; var res = _fineSubjectApplication.Edit(command); return res; }