diff --git a/0_Framework/Application/Enums/TypeOfSmsSetting.cs b/0_Framework/Application/Enums/TypeOfSmsSetting.cs index 6d66fc47..28089ced 100644 --- a/0_Framework/Application/Enums/TypeOfSmsSetting.cs +++ b/0_Framework/Application/Enums/TypeOfSmsSetting.cs @@ -2,6 +2,8 @@ public enum TypeOfSmsSetting { + //همه انواع پیامک + All = 0, /// /// پیامک @@ -23,7 +25,7 @@ public enum TypeOfSmsSetting /// /// پیامک - /// هشدار اول + /// هشدار بدهی /// Warning, @@ -38,4 +40,14 @@ public enum TypeOfSmsSetting /// InstitutionContractConfirm, + /// + /// ارسال کد تاییدیه قرارداد مالی + /// + SendInstitutionContractConfirmationCode, + + /// + /// یادآور وظایف + /// + TaskReminder, + } \ No newline at end of file diff --git a/0_Framework/Application/Sms/ApiResultViewModel.cs b/0_Framework/Application/Sms/ApiResultViewModel.cs index 0afaddc1..0d5c1ca1 100644 --- a/0_Framework/Application/Sms/ApiResultViewModel.cs +++ b/0_Framework/Application/Sms/ApiResultViewModel.cs @@ -17,4 +17,18 @@ public class ApiResultViewModel public string DeliveryUnixTime { get; set; } public string DeliveryColor { get; set; } public string FullName { get; set; } +} + + +public class ApiReportDto +{ + public int MessageId { get; set; } + + public long Mobile { get; set; } + + public string SendUnixTime { get; set; } + public string DeliveryState { get; set; } + public string DeliveryUnixTime { get; set; } + public string DeliveryColor { get; set; } + } \ No newline at end of file diff --git a/0_Framework/Application/Sms/ISmsService.cs b/0_Framework/Application/Sms/ISmsService.cs index 9590bf27..20e41608 100644 --- a/0_Framework/Application/Sms/ISmsService.cs +++ b/0_Framework/Application/Sms/ISmsService.cs @@ -19,6 +19,13 @@ public interface ISmsService bool SendAccountsInfo(string number,string fullName, string userName); Task GetByMessageId(int messId); Task> GetApiResult(string startDate, string endDate); + + #region ForApi + + Task> GetApiReport(string startDate, string endDate); + +#endregion + string DeliveryStatus(byte? dv); string DeliveryColorStatus(byte? dv); string UnixTimeStampToDateTime(int? unixTimeStamp); diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index f368cb3e..7395e737 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; @@ -12,19 +13,21 @@ 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() @@ -58,17 +61,43 @@ public class JobSchedulerRegistrator "*/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.UnBlock", + () => UnBlock(), + "*/10 * * * *" + ); + + RecurringJob.AddOrUpdate( + "InstitutionContract.DeActiveInstitutionEndOfContract", + () => DeActiveInstitutionEndOfContract(), + "*/30 * * * *" + ); + + RecurringJob.AddOrUpdate( + "InstitutionContract.BlueDeActiveAfterZeroDebt", + () => BlueDeActiveAfterZeroDebt(), + "*/10 * * * *" + ); } @@ -79,14 +108,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(); @@ -101,17 +130,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", "خطا-ایجاد سند مالی"); } - + } } @@ -134,7 +163,7 @@ public class JobSchedulerRegistrator try { - await _institutionContractRepository.SendMonthlySms(now); + await _institutionContractSmsServiceRepository.SendMonthlySms(now); _lastRunSendMonthlySms = now; Console.WriteLine("Send Monthly sms executed"); @@ -156,7 +185,7 @@ public class JobSchedulerRegistrator public async System.Threading.Tasks.Task SendReminderSms() { _logger.LogInformation("SendReminderSms job run"); - await _institutionContractRepository.SendReminderSmsForBackgroundTask(); + await _institutionContractSmsServiceRepository.SendReminderSmsForBackgroundTask(); } /// @@ -167,7 +196,7 @@ public class JobSchedulerRegistrator public async System.Threading.Tasks.Task SendBlockSms() { _logger.LogInformation("SendBlockSms job run"); - await _institutionContractRepository.SendBlockSmsForBackgroundTask(); + await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask(); } @@ -179,7 +208,7 @@ public class JobSchedulerRegistrator public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() { _logger.LogInformation("SendInstitutionContractConfirmSms job run"); - await _institutionContractRepository.SendInstitutionContractConfirmSmsTask(); + await _institutionContractSmsServiceRepository.SendInstitutionContractConfirmSmsTask(); } /// @@ -190,14 +219,86 @@ public class JobSchedulerRegistrator public async System.Threading.Tasks.Task SendWarningSms() { _logger.LogInformation("SendWarningSms job run"); - await _institutionContractRepository.SendWarningSmsTask(); + 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); + } + + /// + /// بلاگ سازی + /// + /// + [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 DeActiveInstitutionEndOfContract() + { + _logger.LogInformation("DeActiveInstitutionEndOfContract job run"); + + + var now = DateTime.Now; + var executeDate = now.ToFarsi().Substring(8, 2); + if (executeDate == "01") + { + if (now.Hour >= 9 && now.Hour < 10) + { + 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 61097777..48d94271 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -91,65 +91,7 @@ public interface IInstitutionContractRepository : IRepository> PrintAllAsync(List ids); - #region ReminderSMS - /// - /// دریافت لیست - ارسال پیامک - /// فراخوانی از سمت بک گراند سرویس - /// - /// - Task SendReminderSmsForBackgroundTask(); - - /// - /// ارسال پیامک صورت حساب ماهانه - /// - /// - /// - Task SendMonthlySms(DateTime now); - - /// - /// ارسال پیامک مسدودی از طرف بک گراند سرویس - /// - /// - Task SendBlockSmsForBackgroundTask(); - - /// - /// دریافت لیست واجد شرایط بلاک - /// جهت ارسال پیامک مسدودی - /// - /// - /// - Task> GetBlockListData(DateTime checkDate); - - /// - /// ارسال پیامک مسدودی - /// - /// - /// - /// - /// - /// - Task SendBlockSmsToContractingParties(List smsListData, string typeOfSms, - string sendMessStart, string sendMessEnd); - - /// - ///دریافت لیست بدهکارن - /// جهت ارسال پیامک - /// - /// - Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting); - - /// - /// ارسال پیامک های یاد آور بدهی - /// - /// - Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, string sendMessStart, string sendMessEnd); - - /// - /// ارسال پیامک یادآور تایید قراداد مالی - /// - /// - Task SendInstitutionContractConfirmSmsTask(); - #endregion + #region CreateMontlyTransaction @@ -162,24 +104,12 @@ public interface IInstitutionContractRepository : IRepository - /// پیامک های هشدار - /// - /// - Task SendWarningSmsTask(); - - #endregion - #region legalAction - /// - /// پیامک اقدام قضائی - /// - /// - Task SendLegalActionSmsTask(); - #endregion + + + Task GetIdByInstallmentId(long installmentId); Task GetPreviousContract(long currentInstitutionContractId); diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs new file mode 100644 index 00000000..cef62c5d --- /dev/null +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -0,0 +1,145 @@ +using _0_Framework.Application.Enums; +using _0_Framework.Domain; +using CompanyManagment.App.Contracts.InstitutionContract; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Company.Domain.InstitutionContractAgg; + +public interface IInstitutionContractSmsServiceRepository : IRepository +{ + #region reminderSMs + + + /// + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + Task SendInstitutionContractConfirmSmsTask(); + #endregion + + //هشدار و اقدام قضایی + #region WarningOrLegalActionSmsListData + /// + /// اجرای تسک پیامک هشدار یا اقدام قضایی + /// + /// + /// + Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting); + + /// + /// دریافت لیست بدهکاران آبی جهت هشدار یا اقدام قضایی + /// + /// + /// + Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting); + + /// + /// ارسال پیامک هشدار یا اقدام قضایی + /// + /// + /// + /// + Task SendWarningOrLegalActionSms(List 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(); + + + /// + /// غیر فعالسازی قرارداد های پایان یافته + /// + /// + /// + 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/Company.Domain/SmsResultAgg/ISmsResultRepository.cs b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs index ce631aa5..24ee411b 100644 --- a/Company.Domain/SmsResultAgg/ISmsResultRepository.cs +++ b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs @@ -1,10 +1,30 @@ -using CompanyManagment.App.Contracts.SmsResult; +using _0_Framework.Domain; +using CompanyManagment.App.Contracts.SmsResult; +using CompanyManagment.App.Contracts.SmsResult.Dto; using System.Collections.Generic; -using _0_Framework.Domain; +using System.Threading.Tasks; namespace Company.Domain.SmsResultAgg; public interface ISmsResultRepository : IRepository { + #region ForApi + + /// + /// دریافت لیست پیامکها + /// + /// + /// + Task> GetSmsReportList(SmsReportSearchModel searchModel); + + /// + /// دریافت اکسپند لیست هر تاریخ + /// + /// + /// + /// + Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date); + + #endregion List Search(SmsResultSearchModel searchModel); } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs new file mode 100644 index 00000000..a2bee8d0 --- /dev/null +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs @@ -0,0 +1,15 @@ +namespace CompanyManagment.App.Contracts.SmsResult.Dto; + +/// +/// وضعیت ارسال پیامک +/// +public enum SendStatus +{ + All=0, + /// + /// موفق + /// + Success, + //ناموفق + Failed, +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs new file mode 100644 index 00000000..445ed2b0 --- /dev/null +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs @@ -0,0 +1,54 @@ +using System; + +namespace CompanyManagment.App.Contracts.SmsResult.Dto; + +public class SmsReportDto +{ + /// + /// تاریخ ارسال + /// + public string SentDate { get; set; } + + +} + +public class SmsReportListDto +{ + /// + /// آی دی + /// + public long Id { get; set; } + /// + /// آی دی پیامک در sms.ir + /// + public int MessageId { get; set; } + + /// + /// وضعیت ارسال + /// + public string Status { get; set; } + + /// + /// نوع پیامک + /// + public string TypeOfSms { get; set; } + + /// + /// نام طرف حساب + /// + public string ContractingPartyName { get; set; } + + /// + /// شماره موبایل + /// + public string Mobile { get; set; } + + + /// + /// ساعت و دقیقه + /// + public string HourAndMinute { get; set; } +} + + + diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs new file mode 100644 index 00000000..cec3162a --- /dev/null +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs @@ -0,0 +1,43 @@ +using _0_Framework.Application.Enums; + +namespace CompanyManagment.App.Contracts.SmsResult.Dto; + +public class SmsReportSearchModel +{ + //نوع پیامک + public TypeOfSmsSetting TypeOfSms { get; set; } + + /// + /// وضعیت ارسال پیامک + /// + public SendStatus SendStatus { get; set; } + + /// + /// شماره موبایل + /// + public string Mobile { get; set; } + + /// + /// آی دی طرف حساب + /// + public long ContractingPatyId { get; set; } + + /// + /// سال + /// + public string Year { get; set; } + /// + /// ماه + /// + public string Month { get; set; } + + /// + /// تاریخ شروع + /// + public string StartDateFa { get; set; } + + /// + /// تاریخ پایان + /// + public string EndDateFa { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs index 8d8a9b52..2c857396 100644 --- a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs +++ b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs @@ -1,14 +1,34 @@ -using System; +using _0_Framework.Application; +using CompanyManagment.App.Contracts.SmsResult.Dto; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using _0_Framework.Application; namespace CompanyManagment.App.Contracts.SmsResult; public interface ISmsResultApplication { + #region ForApi + + /// + /// دریافت لیست پیامکها + /// + /// + /// + Task> GetSmsReportList(SmsReportSearchModel searchModel); + + /// + /// دریافت اکسپند لیست هر تاریخ + /// + /// + /// + /// + Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date); + + #endregion + OperationResult Create(CreateSmsResult command); List Search(SmsResultSearchModel searchModel); } \ No newline at end of file diff --git a/CompanyManagment.Application/SmsResultApplication.cs b/CompanyManagment.Application/SmsResultApplication.cs index 03f01b29..2c94d837 100644 --- a/CompanyManagment.Application/SmsResultApplication.cs +++ b/CompanyManagment.Application/SmsResultApplication.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using _0_Framework.Application; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.SmsResult; +using CompanyManagment.App.Contracts.SmsResult.Dto; namespace CompanyManagment.Application; @@ -15,6 +17,23 @@ public class SmsResultApplication : ISmsResultApplication _smsResultRepository = smsResultRepository; } + + #region ForApi + + public async Task> GetSmsReportList(SmsReportSearchModel searchModel) + { + return await _smsResultRepository.GetSmsReportList(searchModel); + } + + public async Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date) + { + return await _smsResultRepository.GetSmsReportExpandList(searchModel, date); + } + + #endregion + + + public OperationResult Create(CreateSmsResult command) { var op = new OperationResult(); diff --git a/CompanyManagment.Application/SmsSettingApplication.cs b/CompanyManagment.Application/SmsSettingApplication.cs index 5888d331..203a9e23 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; } @@ -116,12 +119,12 @@ 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) { - return await _institutionContractRepository.GetBlockListData(DateTime.Now); + return await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now); } @@ -134,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 @@ -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 7f7f00d0..234c4461 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -3562,1001 +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 BlockSms - - /// - /// پیامک بلاک - /// - /// - 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 - - /// - ///دریافت لیست بدهکارن - /// جهت ارسال پیامک - /// - /// - 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 @@ -4602,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 + @@ -4698,6 +3625,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 - - - public async Task SendLegalActionSmsTask() - { - 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.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 public class WorkshopsAndEmployeeViewModel diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs new file mode 100644 index 00000000..ef8b77e1 --- /dev/null +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -0,0 +1,2178 @@ +using _0_Framework.Application; +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; +using PersianTools.Core; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace CompanyManagment.EFCore.Repository; + +public class InstitutionContractSmsServiceRepository : RepositoryBase, IInstitutionContractSmsServiceRepository +{ + private readonly CompanyContext _context; + private readonly ILogger _logger; + private readonly ISmsService _smsService; + private readonly ISmsResultRepository _smsResultRepository; + 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) + { + 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 && + x.IsActive + ); + } + else + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth == dayOfMonth && + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == typeOfSmsSetting && + x.IsActive + ); + } + + + if (checkAnyToExecute) + { + + var getSmsData = await GetWarningOrLegalActionSmsListData(typeOfSmsSetting); + await SendWarningOrLegalActionSms(getSmsData, typeOfSmsSetting); + + } + } + + /// + ///دریافت لیست پیامک قراداد های آبی بدهکار + /// + /// + public async Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting) + { + var smsList = new List(); + var institutionContracts = await _context.InstitutionContractSet.AsQueryable().Select(x => new InstitutionContractViewModel + { + Id = x.id, + ContractingPartyId = x.ContractingPartyId, + ContractingPartyName = x.ContractingPartyName, + ContractStartGr = x.ContractStartGr, + ContractStartFa = x.ContractStartFa, + ContractEndGr = x.ContractEndGr, + ContractEndFa = x.ContractEndFa, + IsActiveString = x.IsActiveString, + ContractAmountDouble = x.ContractAmount, + OfficialCompany = x.OfficialCompany, + IsInstallment = x.IsInstallment, + VerificationStatus = x.VerificationStatus, + SigningType = x.SigningType, + }).Where(x => x.IsActiveString == "blue" && + x.ContractAmountDouble > 0).GroupBy(x => x.ContractingPartyId).Select(x => x.First()).ToListAsync(); + + + // قرارداد هایی که بطور یکجا پرداخت شده اند + var paidInFull = institutionContracts.Where(x => + x.SigningType != InstitutionContractSigningType.Legacy && x.IsInstallment == false && x.SigningType != null).ToList(); + + //حذف قراداد هایی که یکجا پرداخت شده اند از لیست ایجاد سند ماهانه + institutionContracts = institutionContracts.Except(paidInFull).ToList(); + + var contractingPartyList = await _context.PersonalContractingParties + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.id)).ToListAsync(); + + var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) + .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); + + var phoneNumberList = await _context.InstitutionContractContactInfos + .Where(x => institutionContracts.Select(ins => ins.Id).Contains(x.InstitutionContractId)) + .Where(x => x.SendSms && x.PhoneType == "شماره همراه" && !string.IsNullOrWhiteSpace(x.PhoneNumber) && + x.PhoneNumber.Length == 11).ToListAsync(); + var legalActionSentSms = await _context.SmsResults + .Where(x => x.TypeOfSms == "اقدام قضایی").AsNoTracking().ToListAsync(); + + + var oldInstitutionContract = institutionContracts.Where(x => x.IsInstallment == false).ToList(); + var electronicInstitutionContract = institutionContracts.Where(x => x.IsInstallment == true).ToList(); + + foreach (var item in oldInstitutionContract) + { + try + { + var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); + bool hasLegalActionSentSms = legalActionSentSms.Any(x => x.InstitutionContractId == item.Id); + int year = Convert.ToInt32(item.ContractEndFa.Substring(0, 4)); + int month = Convert.ToInt32(item.ContractEndFa.Substring(5, 2)); + var endOfContractNextMonthStart = new PersianDateTime(year, month, 1).AddMonths(1); + var endOfContractNextMonthEnd = (($"{endOfContractNextMonthStart}").FindeEndOfMonth()).ToGeorgianDateTime(); + var now = DateTime.Now; + bool executeCondition = false; + + switch (typeOfSmsSetting) + { + case TypeOfSmsSetting.Warning: + executeCondition = !hasLegalActionSentSms && now.Date <= endOfContractNextMonthEnd.Date; + + break; + case TypeOfSmsSetting.LegalAction: + executeCondition = !hasLegalActionSentSms && now.Date > 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 id = $"{item.ContractingPartyId}"; + var aprove = $"{transactions.id}"; + var balance = debtor - creditor; + + if (balance > 0) // اگر بدهکار بود + { + + if (isLegal) + { + if (item.OfficialCompany == "Official") // حقوقی بدهکار رسمی + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) + { + + + + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) + { + + //var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 608443, + // partyName, + // balanceToMoney, id, aprove); + //Thread.Sleep(1000); + //if (smsResult.IsSuccedded) + //{ + // var createSmsResult = new SmsResult(smsResult.MessageId, + // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, + // item.ContractingPartyId, item.Id); + // _smsResultRepository.Create(createSmsResult); + // _smsResultRepository.SaveChanges(); + // Thread.Sleep(1000); + //} + + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 608443 : 313520, + 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 : 181540, + 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 : 478695, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBill", + Code1 = "", + Code2 = "", + InstitutionContractId = item.Id + }); + } + + + } + + + } + else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) + { + + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) + { + //var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 412829, + // partyName, + // balanceToMoney, id, aprove); + //Thread.Sleep(1000); + //if (smsResult.IsSuccedded) + //{ + // var createSmsResult = new SmsResult(smsResult.MessageId, + // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, + // item.ContractingPartyId, item.Id); + // _smsResultRepository.Create(createSmsResult); + // _smsResultRepository.SaveChanges(); + // Thread.Sleep(1000); + //} + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 412829 : 147971, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBill", + Code1 = "", + Code2 = "", + InstitutionContractId = item.Id + }); + } + } + + + } + } + } + } + + } + } + catch (Exception e) + { + + + string name = item.ContractingPartyName.Length > 18 ? item.ContractingPartyName.Substring(0, 18) : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + _smsService.Alarm("09114221321", errMess); + _logger.LogError(e, "BlueWarningSms"); + } + } + + + foreach (var item in electronicInstitutionContract) + { + try + { + var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); + bool hasLegalActionSentSms = legalActionSentSms.Any(x => x.InstitutionContractId == item.Id); + int year = Convert.ToInt32(item.ContractEndFa.Substring(0, 4)); + int month = Convert.ToInt32(item.ContractEndFa.Substring(5, 2)); + var endOfContractNextMonthStart = new PersianDateTime(year, month, 1).AddMonths(1); + var endOfContractNextMonthEnd = (($"{endOfContractNextMonthStart}").FindeEndOfMonth()).ToGeorgianDateTime(); + var now = DateTime.Now; + + bool executeCondition = false; + + switch (typeOfSmsSetting) + { + case TypeOfSmsSetting.Warning: + executeCondition = !hasLegalActionSentSms && now.Date <= endOfContractNextMonthEnd.Date; + + break; + case TypeOfSmsSetting.LegalAction: + executeCondition = !hasLegalActionSentSms && now.Date > endOfContractNextMonthEnd.Date; + break; + } + if (!string.IsNullOrWhiteSpace(contractingParty.LName) && executeCondition) + { + 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 = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 530657 : 665145, + 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; + } + + + public async Task SendWarningOrLegalActionSms(List 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) + { + 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; + } + + + + } + + #endregion + } + + #endregion + + //بلاک - آنبلاک - پیامک بلاک + #region Block + + /// + /// پیامک بلاک + /// + /// + 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; + + 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) + { + 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; + + + 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(); + } + + } + + + public async Task DeActiveInstitutionEndOfContract(DateTime checkDate) + { + var institutionContracts = await _context.InstitutionContractSet + .Where(x => (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); + } + } + } + + + 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) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + } + #endregion + + //ارسال پیامک یادآور تایید قرارداد مالی + #region InstitutionContractConfirm + + /// + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + 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 + +} + + diff --git a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs index 0b555a7a..18ccbe1d 100644 --- a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs +++ b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs @@ -1,13 +1,20 @@ -using System.Collections.Generic; -using System.Linq; -using _0_Framework.Application; +using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.SmsResult; +using CompanyManagment.App.Contracts.SmsResult.Dto; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using _0_Framework.Application.Enums; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace CompanyManagment.EFCore.Repository; -public class SmsResultRepository : RepositoryBase , ISmsResultRepository +public class SmsResultRepository : RepositoryBase, ISmsResultRepository { private readonly CompanyContext _context; public SmsResultRepository(CompanyContext context) : base(context) @@ -15,9 +22,263 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR _context = context; } + #region ForApi + + + + public async Task> GetSmsReportList(SmsReportSearchModel searchModel) + { + + // مرحله 1: همه رکوردها را با projection ساده بگیرید + var rawQuery = await _context.SmsResults + .Select(x => new + { + x.id, + x.ContractingPatyId, + x.Mobile, + x.Status, + x.TypeOfSms, + x.CreationDate, + DateOnly = x.CreationDate.Date // فقط تاریخ بدون ساعت + }) + .AsNoTracking() + .ToListAsync(); // اینجا SQL اجرا می‌شود و همه داده‌ها به client می‌آیند + + if (searchModel.ContractingPatyId > 0) + { + rawQuery = rawQuery.Where(x => x.ContractingPatyId == searchModel.ContractingPatyId).ToList(); + } + + if (!string.IsNullOrWhiteSpace(searchModel.Mobile)) + { + rawQuery = rawQuery.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList(); + } + + if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning) + { + var typeOfSms = "All"; + switch (searchModel.TypeOfSms) + { + case TypeOfSmsSetting.InstitutionContractDebtReminder: + typeOfSms = "یادآور بدهی ماهانه"; + break; + case TypeOfSmsSetting.MonthlyInstitutionContract: + typeOfSms = "صورت حساب ماهانه"; + break; + case TypeOfSmsSetting.BlockContractingParty: + typeOfSms = "اعلام مسدودی طرف حساب"; + break; + case TypeOfSmsSetting.LegalAction: + typeOfSms = "اقدام قضایی"; + break; + case TypeOfSmsSetting.InstitutionContractConfirm: + typeOfSms = "یادآور تایید قرارداد مالی"; + break; + case TypeOfSmsSetting.SendInstitutionContractConfirmationCode: + typeOfSms = "کد تاییدیه قرارداد مالی"; + break; + case TypeOfSmsSetting.TaskReminder: + typeOfSms = "یادآور وظایف"; + break; + } + + rawQuery = rawQuery.Where(x => x.TypeOfSms == typeOfSms).ToList(); + } + + if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning) + { + rawQuery = rawQuery.Where(x => x.TypeOfSms.Contains("هشدار")).ToList(); + } + + if (searchModel.SendStatus != SendStatus.All) + { + var status = "All"; + + switch (searchModel.SendStatus) + { + case SendStatus.Success: status = "موفق"; + break; + case SendStatus.Failed: status = "ناموفق"; + break; + + + } + + rawQuery = rawQuery.Where(x => x.Status == status).ToList(); + + } + #region searchByDate + + if (!string.IsNullOrWhiteSpace(searchModel.StartDateFa) && + !string.IsNullOrWhiteSpace(searchModel.EndDateFa)) + { + if (searchModel.StartDateFa.TryToGeorgianDateTime(out var startGr) == false || + searchModel.EndDateFa.TryToGeorgianDateTime(out var endGr) == false) + return new List(); + + rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList(); + + } + else + { + if (!string.IsNullOrWhiteSpace(searchModel.Year) && !string.IsNullOrWhiteSpace(searchModel.Month)) + { + var start = searchModel.Year + "/" + searchModel.Month + "/01"; + var end = start.FindeEndOfMonth(); + var startGr = start.ToGeorgianDateTime(); + var endGr = end.ToGeorgianDateTime(); + rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList(); + + + } + else if (!string.IsNullOrWhiteSpace(searchModel.Year) && string.IsNullOrWhiteSpace(searchModel.Month)) + { + var start = searchModel.Year + "/01/01"; + var findEndOfYear = searchModel.Year + "/12/01"; + var end = findEndOfYear.FindeEndOfMonth(); + var startGr = start.ToGeorgianDateTime(); + var endGr = end.ToGeorgianDateTime(); + rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList(); + + } + } + + #endregion + + // مرحله 2: گروه‌بندی و انتخاب آخرین رکورد هر روز روی Client + var grouped = rawQuery + .GroupBy(x => x.DateOnly) + .Select(g => g.OrderByDescending(x => x.CreationDate).First()) + .OrderByDescending(x => x.CreationDate) + .ToList(); + + // مرحله 3: تبدیل به DTO و ToFarsi + var result = grouped.Select(x => new SmsReportDto + { + SentDate = x.CreationDate.ToFarsi() + }).ToList(); + return result; + } + + + public async Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date) + { + if(string.IsNullOrWhiteSpace(date)) + return new List(); + + if (date.TryToGeorgianDateTime(out var searchDate) == false) + return new List(); + + var query = await _context.SmsResults.Where(x => x.CreationDate.Date == searchDate.Date) + .Select(x => + new + { + x.id, + x.MessageId, + x.Status, + x.TypeOfSms, + x.ContractingPartyName, + x.Mobile, + x.ContractingPatyId, + x.InstitutionContractId, + x.CreationDate, + x.CreationDate.Hour, + x.CreationDate.Minute + + }).AsNoTracking() + .ToListAsync(); ; + + if (searchModel.ContractingPatyId > 0) + { + query = query.Where(x => x.ContractingPatyId == searchModel.ContractingPatyId).ToList(); + } + + if (!string.IsNullOrWhiteSpace(searchModel.Mobile)) + { + query = query.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList(); + } + + if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning) + { + var typeOfSms = "All"; + switch (searchModel.TypeOfSms) + { + case TypeOfSmsSetting.InstitutionContractDebtReminder: + typeOfSms = "یادآور بدهی ماهانه"; + break; + case TypeOfSmsSetting.MonthlyInstitutionContract: + typeOfSms = "صورت حساب ماهانه"; + break; + case TypeOfSmsSetting.BlockContractingParty: + typeOfSms = "اعلام مسدودی طرف حساب"; + break; + case TypeOfSmsSetting.LegalAction: + typeOfSms = "اقدام قضایی"; + break; + case TypeOfSmsSetting.InstitutionContractConfirm: + typeOfSms = "یادآور تایید قرارداد مالی"; + break; + case TypeOfSmsSetting.SendInstitutionContractConfirmationCode: + typeOfSms = "کد تاییدیه قرارداد مالی"; + break; + case TypeOfSmsSetting.TaskReminder: + typeOfSms = "یادآور وظایف"; + break; + } + + query = query.Where(x => x.TypeOfSms == typeOfSms).ToList(); + } + + if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning) + { + query = query.Where(x => x.TypeOfSms.Contains("هشدار")).ToList(); + } + + if (searchModel.SendStatus != SendStatus.All) + { + var status = "All"; + + switch (searchModel.SendStatus) + { + case SendStatus.Success: + status = "موفق"; + break; + case SendStatus.Failed: + status = "ناموفق"; + break; + + + } + + query = query.Where(x => x.Status == status).ToList(); + + } + + if (query.Count == 0) + return new List(); + + var result = query.OrderByDescending(x => x.CreationDate.Hour) + .ThenByDescending(x => x.CreationDate.Minute).Select(x => + new SmsReportListDto() + { + Id = x.id, + MessageId = x.MessageId, + Status = x.Status, + TypeOfSms = x.TypeOfSms, + ContractingPartyName = x.ContractingPartyName, + Mobile = x.Mobile, + HourAndMinute = x.CreationDate.TimeOfDay.ToString(@"hh\:mm"), + }).ToList(); + + return result; + + } + + #endregion + public List Search(SmsResultSearchModel searchModel) { - + var query = _context.SmsResults.Select(x => new App.Contracts.SmsResult.SmsResultViewModel() { Id = x.id, @@ -64,7 +325,7 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR var endGr = end.ToGeorgianDateTime(); query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); - + } else if (!string.IsNullOrWhiteSpace(searchModel.Year) && string.IsNullOrWhiteSpace(searchModel.Month)) { @@ -74,7 +335,7 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR var startGr = start.ToGeorgianDateTime(); var endGr = end.ToGeorgianDateTime(); query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); - + } } @@ -82,12 +343,12 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR query = query.OrderByDescending(x => x.CreationDate) - .ThenByDescending(x=>x.CreationDate.Hour).ThenByDescending(x=>x.CreationDate.Minute); - + .ThenByDescending(x => x.CreationDate.Hour).ThenByDescending(x => x.CreationDate.Minute); + return query.Skip(searchModel.PageIndex).Take(30).ToList(); - - + + } - + } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Services/SmsService.cs b/CompanyManagment.EFCore/Services/SmsService.cs index 82cf6917..11ea7adb 100644 --- a/CompanyManagment.EFCore/Services/SmsService.cs +++ b/CompanyManagment.EFCore/Services/SmsService.cs @@ -207,16 +207,11 @@ public class SmsService : ISmsService } public async Task> GetApiResult(string startDate, string endDate) { - var st = new DateTime(2024, 6, 2); - var ed = new DateTime(2024, 7, 1); - if (!string.IsNullOrWhiteSpace(startDate) && startDate.Length == 10) - { - st = startDate.ToGeorgianDateTime(); - } - if (!string.IsNullOrWhiteSpace(endDate) && endDate.Length == 10) - { - ed = endDate.ToGeorgianDateTime(); - } + + + if(startDate.TryToGeorgianDateTime(out var st) == false || endDate.TryToGeorgianDateTime(out var ed) == false) + return new List(); + var res = new List(); Int32 unixTimestamp = (int)st.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; Int32 unixTimestamp2 = (int)ed.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; @@ -248,6 +243,44 @@ public class SmsService : ISmsService return res; } + public async Task> GetApiReport(string startDate, string endDate) + { + + + if (startDate.TryToGeorgianDateTime(out var st) == false || endDate.TryToGeorgianDateTime(out var ed) == false) + return new List(); + + var res = new List(); + Int32 unixTimestamp = (int)st.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + Int32 unixTimestamp2 = (int)ed.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + // int? fromDateUnixTime = null; // unix time - for instance: 1700598600 + //int? toDateUnixTime = null; // unix time - for instance: 1703190600 + int pageNumber = 2; + int pageSize = 100; // max: 100 + SmsIr smsIr = new SmsIr("Og5M562igmzJRhQPnq0GdtieYdLgtfikjzxOmeQBPxJjZtyge5Klc046Lfw1mxSa"); + var response = await smsIr.GetArchivedReportAsync(pageNumber, pageSize, unixTimestamp, unixTimestamp2); + + MessageReportResult[] messages = response.Data; + foreach (var message in messages) + { + var appendData = new ApiReportDto() + { + MessageId = message.MessageId, + + Mobile = message.Mobile, + + SendUnixTime = UnixTimeStampToDateTime(message.SendDateTime), + DeliveryState = DeliveryStatus(message.DeliveryState), + DeliveryUnixTime = UnixTimeStampToDateTime(message.DeliveryDateTime), + DeliveryColor = DeliveryColorStatus(message.DeliveryState), + }; + res.Add(appendData); + } + + + return res; + } + public string DeliveryStatus(byte? dv) { string mess = ""; diff --git a/PersonalContractingParty.Config/PersonalBootstrapper.cs b/PersonalContractingParty.Config/PersonalBootstrapper.cs index aab12f1f..022c4f1e 100644 --- a/PersonalContractingParty.Config/PersonalBootstrapper.cs +++ b/PersonalContractingParty.Config/PersonalBootstrapper.cs @@ -563,6 +563,7 @@ public class PersonalBootstrapper services.AddTransient(); services.AddTransient(); + services.AddTransient(); #endregion 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 + /// دریافت لیست پیامک ها + /// + /// + /// + [HttpGet] + public async Task> GetSmsReportList(SmsReportSearchModel searchModel) + { + + var result =await _smsResultApplication.GetSmsReportList(searchModel); + return result; + } + + /// + /// دریافت اطلاعات هر تاریخ برای اکسپند + /// + /// + /// + /// + [HttpGet("GetExpandedList")] + public async Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date) + { + var result =await _smsResultApplication.GetSmsReportExpandList(searchModel, date); + return result; + } + + /// + /// گزارش ای پی آی + /// + /// + /// + /// + [HttpGet("GetApiReport")] + public async Task> GetApiReport(string startDate, string endDate) + { + var result =await _smsService.GetApiReport(startDate, endDate); + return result; + } + +} \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Pages/Company/InstitutionContracts/Index.cshtml b/ServiceHost/Areas/Admin/Pages/Company/InstitutionContracts/Index.cshtml index 73326b1a..dd48c6b3 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/InstitutionContracts/Index.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/InstitutionContracts/Index.cshtml @@ -1289,7 +1289,7 @@ تمدید قرارداد

-