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