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 @@
تمدید قرارداد
-