block and unblock
This commit is contained in:
@@ -3653,385 +3653,7 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
|
||||
|
||||
#endregion
|
||||
|
||||
//مسدودی
|
||||
#region BlockSms
|
||||
|
||||
/// <summary>
|
||||
/// پیامک بلاک
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
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<List<BlockSmsListData>> GetBlockListData(DateTime checkDate)
|
||||
{
|
||||
var smsList = new List<BlockSmsListData>();
|
||||
|
||||
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<CreateContactInfo>();
|
||||
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<CreateContactInfo>();
|
||||
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<BlockSmsListData> 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<long, InstitutionCon
|
||||
public async Task CreateTransactionForInstitutionContracts(DateTime endOfMonthGr, string endOfMonthFa,
|
||||
string description)
|
||||
{
|
||||
|
||||
#region FindeNextMonth 1th
|
||||
|
||||
var firstDayOfMonthGr = ($"{endOfMonthFa.Substring(0, 8)}01").ToGeorgianDateTime();
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using _0_Framework.Application.Enums;
|
||||
using _0_Framework.Application.Sms;
|
||||
using _0_Framework.InfraStructure;
|
||||
|
||||
using Company.Domain.InstitutionContractAgg;
|
||||
using Company.Domain.SmsResultAgg;
|
||||
using CompanyManagment.App.Contracts.Hubs;
|
||||
@@ -17,6 +18,7 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Company.Domain.ContarctingPartyAgg;
|
||||
|
||||
namespace CompanyManagment.EFCore.Repository;
|
||||
|
||||
@@ -26,14 +28,19 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase<long, Inst
|
||||
private readonly ILogger<InstitutionContractSmsServiceRepository> _logger;
|
||||
private readonly ISmsService _smsService;
|
||||
private readonly ISmsResultRepository _smsResultRepository;
|
||||
public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger<InstitutionContractSmsServiceRepository> logger, ISmsResultRepository smsResultRepository) : base(context)
|
||||
private readonly IHubContext<SendSmsHub> _hubContext;
|
||||
private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository;
|
||||
public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger<InstitutionContractSmsServiceRepository> logger, ISmsResultRepository smsResultRepository, IHubContext<SendSmsHub> 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<long, Inst
|
||||
|
||||
if (checkAnyToExecute)
|
||||
{
|
||||
|
||||
var getSmsData =await GetWarningOrLegalActionSmsListData(typeOfSmsSetting);
|
||||
|
||||
var getSmsData = await GetWarningOrLegalActionSmsListData(typeOfSmsSetting);
|
||||
await SendWarningOrLegalActionSms(getSmsData, typeOfSmsSetting);
|
||||
|
||||
}
|
||||
@@ -606,6 +613,720 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase<long, Inst
|
||||
|
||||
#endregion
|
||||
|
||||
//بلاک - آنبلاک - پیامک بلاک
|
||||
#region Block
|
||||
|
||||
/// <summary>
|
||||
/// پیامک بلاک
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
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<List<BlockSmsListData>> GetBlockListData(DateTime checkDate)
|
||||
{
|
||||
var smsList = new List<BlockSmsListData>();
|
||||
|
||||
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<CreateContactInfo>();
|
||||
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<CreateContactInfo>();
|
||||
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<BlockSmsListData> 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<List<long>> GetToBeBlockList(DateTime checkDate)
|
||||
{
|
||||
var contractingPartyIdList = new List<long>();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// بلاک سازی
|
||||
/// </summary>
|
||||
/// <param name="checkDate"></param>
|
||||
/// <returns></returns>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// آنبلاک
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user