490 lines
25 KiB
C#
490 lines
25 KiB
C#
using _0_Framework.Application.Enums;
|
|
using _0_Framework.InfraStructure;
|
|
using Company.Domain.InstitutionContractAgg;
|
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Logging;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using _0_Framework.Application;
|
|
using _0_Framework.Application.Sms;
|
|
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
|
|
using PersianTools.Core;
|
|
|
|
namespace CompanyManagment.EFCore.Repository;
|
|
|
|
public class InstitutionContractSmsServiceRepository : RepositoryBase<long, InstitutionContract>, IInstitutionContractSmsServiceRepository
|
|
{
|
|
private readonly CompanyContext _context;
|
|
private readonly ILogger<InstitutionContractSmsServiceRepository> _logger;
|
|
private readonly ISmsService _smsService;
|
|
public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService) : base(context)
|
|
{
|
|
_context = context;
|
|
_smsService = smsService;
|
|
}
|
|
|
|
#region WarningSms
|
|
|
|
public async Task SendWarningSmsTask()
|
|
{
|
|
var now = DateTime.Now;
|
|
|
|
|
|
// تبدیل تاریخ میلادی به شمسی
|
|
var persianNow = now.ToFarsi();
|
|
var persianEndOfMonth = int.Parse(persianNow.FindeEndOfMonth().Substring(8, 2));
|
|
var dayOfMonth = int.Parse(persianNow.Substring(8, 2));
|
|
var hour = now.Hour;
|
|
var minute = now.Minute;
|
|
var checkAnyToExecute = false;
|
|
|
|
//اگر آخرین روز ماه باشد
|
|
//اگر روز مثلا عدد روز 31 بود ولی آخرین روز ماه 30 بود
|
|
if (dayOfMonth == persianEndOfMonth)
|
|
{
|
|
checkAnyToExecute = await _context.SmsSettings
|
|
.AnyAsync(x =>
|
|
x.DayOfMonth >= dayOfMonth &&
|
|
x.TimeOfDay.Hours == hour &&
|
|
x.TimeOfDay.Minutes == minute &&
|
|
x.TypeOfSmsSetting == TypeOfSmsSetting.Warning &&
|
|
x.IsActive
|
|
);
|
|
}
|
|
else
|
|
{
|
|
checkAnyToExecute = await _context.SmsSettings
|
|
.AnyAsync(x =>
|
|
x.DayOfMonth == dayOfMonth &&
|
|
x.TimeOfDay.Hours == hour &&
|
|
x.TimeOfDay.Minutes == minute &&
|
|
x.TypeOfSmsSetting == TypeOfSmsSetting.Warning &&
|
|
x.IsActive
|
|
);
|
|
}
|
|
|
|
|
|
if (checkAnyToExecute)
|
|
{
|
|
|
|
var getSmsData =await GetWarningOrLegalActionSmsListData(TypeOfSmsSetting.Warning);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
#endregion
|
|
/// <summary>
|
|
///دریافت لیست پیامک قراداد های آبی بدهکار
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public async Task<List<SmsListData>> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting)
|
|
{
|
|
var smsList = new List<SmsListData>();
|
|
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;
|
|
|
|
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;
|
|
|
|
|
|
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 : 0,
|
|
PartyName = partyName,
|
|
Amount = balanceToMoney,
|
|
ContractingPartyId = contractingParty.id,
|
|
AproveId = aprove,
|
|
TypeOfSmsMethod = "MonthlyBill",
|
|
Code1 = "",
|
|
Code2 = "",
|
|
InstitutionContractId = item.Id
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی
|
|
{
|
|
var balanceToMoney = balance.ToMoney();
|
|
foreach (var number in phoneNumbers)
|
|
{
|
|
|
|
if (!string.IsNullOrWhiteSpace(number.PhoneNumber) &&
|
|
number.PhoneNumber.Length == 11)
|
|
{
|
|
|
|
//var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 351691,
|
|
// partyName,
|
|
// balanceToMoney, id, aprove);
|
|
//Thread.Sleep(1000);
|
|
//if (smsResult.IsSuccedded)
|
|
//{
|
|
// var createSmsResult = new SmsResult(smsResult.MessageId,
|
|
// smsResult.Message, typeOfSms, partyName, number.PhoneNumber,
|
|
// item.ContractingPartyId, item.Id);
|
|
// _smsResultRepository.Create(createSmsResult);
|
|
// _smsResultRepository.SaveChanges();
|
|
// Thread.Sleep(1000);
|
|
//}
|
|
|
|
smsList.Add(new SmsListData()
|
|
{
|
|
PhoneNumber = number.PhoneNumber,
|
|
TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 351691 : 0,
|
|
PartyName = partyName,
|
|
Amount = balanceToMoney,
|
|
ContractingPartyId = contractingParty.id,
|
|
AproveId = aprove,
|
|
TypeOfSmsMethod = "MonthlyBill",
|
|
Code1 = "",
|
|
Code2 = "",
|
|
InstitutionContractId = item.Id
|
|
});
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی
|
|
{
|
|
var balanceToMoney = balance.ToMoney();
|
|
|
|
foreach (var number in phoneNumbers)
|
|
{
|
|
|
|
if (!string.IsNullOrWhiteSpace(number.PhoneNumber) &&
|
|
number.PhoneNumber.Length == 11)
|
|
{
|
|
|
|
//var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 190430,
|
|
// partyName,
|
|
// balanceToMoney, id, aprove);
|
|
//Thread.Sleep(1000);
|
|
//if (smsResult.IsSuccedded)
|
|
//{
|
|
// var createSmsResult = new SmsResult(smsResult.MessageId,
|
|
// smsResult.Message, typeOfSms, partyName, number.PhoneNumber,
|
|
// item.ContractingPartyId, item.Id);
|
|
// _smsResultRepository.Create(createSmsResult);
|
|
// _smsResultRepository.SaveChanges();
|
|
// Thread.Sleep(1000);
|
|
//}
|
|
|
|
smsList.Add(new SmsListData()
|
|
{
|
|
PhoneNumber = number.PhoneNumber,
|
|
TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 190430 : 0,
|
|
PartyName = partyName,
|
|
Amount = balanceToMoney,
|
|
ContractingPartyId = contractingParty.id,
|
|
AproveId = aprove,
|
|
TypeOfSmsMethod = "MonthlyBill",
|
|
Code1 = "",
|
|
Code2 = "",
|
|
InstitutionContractId = item.Id
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی
|
|
{
|
|
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 : 0,
|
|
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;
|
|
if (!string.IsNullOrWhiteSpace(contractingParty.LName) && !hasLegalActionSentSms && now.Date <= endOfContractNextMonthEnd.Date)
|
|
{
|
|
var partyName = contractingParty.IsLegal == "حقیقی"
|
|
? $"{contractingParty.FName} {contractingParty.LName}"
|
|
: $"{contractingParty.LName}";
|
|
if (!string.IsNullOrWhiteSpace(contractingParty.SureName))
|
|
partyName = $"{partyName} ({contractingParty.SureName})";
|
|
|
|
if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}";
|
|
|
|
//var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false;
|
|
//var isBlock = contractingParty.IsBlock == "true" ? true : false;
|
|
//var isActive = contractingParty.IsActiveString == "true" ? true : false;
|
|
|
|
|
|
var hasFinancialStatement =
|
|
financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId);
|
|
|
|
|
|
var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id);
|
|
|
|
if (hasFinancialStatement && hasPhonNumber)
|
|
{
|
|
var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id)
|
|
.Select(x => new CreateContactInfo
|
|
{
|
|
PhoneType = x.PhoneType,
|
|
PhoneNumber = x.PhoneNumber,
|
|
|
|
InstitutionContractId = x.InstitutionContractId,
|
|
SendSms = x.SendSms
|
|
}).Where(x => x.PhoneNumber.Length == 11).ToList();
|
|
|
|
var transactions = financialStatmentList.FirstOrDefault(x =>
|
|
x.ContractingPartyId == item.ContractingPartyId);
|
|
|
|
var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor);
|
|
var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor);
|
|
|
|
|
|
//var id = $"{item.ContractingPartyId}";
|
|
var aprove = $"{transactions.id}";
|
|
var balance = debtor - creditor;
|
|
int templateId = 0;
|
|
//انتخاب قالب پیامک بر اساس حقیق/حقوقی
|
|
|
|
|
|
if (balance > 0) // اگر بدهکار بود
|
|
{
|
|
var balanceToMoney = balance.ToMoney();
|
|
|
|
foreach (var number in phoneNumbers)
|
|
{
|
|
string publicId = transactions.PublicIdStr;
|
|
string code1 = publicId.Substring(0, 25);
|
|
string code2 = publicId.Substring(25);
|
|
|
|
|
|
smsList.Add(new SmsListData()
|
|
{
|
|
PhoneNumber = number.PhoneNumber,
|
|
TemplateId = 530657,
|
|
PartyName = partyName,
|
|
Amount = balanceToMoney,
|
|
ContractingPartyId = contractingParty.id,
|
|
AproveId = aprove,
|
|
TypeOfSmsMethod = "MonthlyBillNew",
|
|
Code1 = code1,
|
|
Code2 = code2,
|
|
InstitutionContractId = item.Id
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_logger.LogError($"ContractingPartyId : {item.ContractingPartyId} - ContractingPartyName : {item.ContractingPartyName} - InstitutionContractId : {item.Id} خطای دریافت لیست بدهکاران ");
|
|
throw;
|
|
}
|
|
}
|
|
return smsList;
|
|
}
|
|
}
|
|
|
|
|