From 63edb33bf5c61bc12269b2e6049b404deeca3423 Mon Sep 17 00:00:00 2001 From: SamSys Date: Wed, 7 Jan 2026 14:49:44 +0330 Subject: [PATCH 01/13] Sms Report Init --- .../SmsResultAgg/ISmsResultRepository.cs | 16 +++++++- .../SmsResult/Dto/SmsReportDto.cs | 13 +++++++ .../SmsResult/Dto/SmsReportSearchModel.cs | 38 +++++++++++++++++++ .../SmsResult/ISmsResultApplication.cs | 16 +++++++- .../SmsResultApplication.cs | 14 +++++++ .../Repository/SmsResultRepository.cs | 28 +++++++++++++- .../Admin/Controllers/SmsReportController.cs | 24 ++++++++++++ ServiceHost/Properties/launchSettings.json | 2 +- 8 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs create mode 100644 CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs create mode 100644 ServiceHost/Areas/Admin/Controllers/SmsReportController.cs diff --git a/Company.Domain/SmsResultAgg/ISmsResultRepository.cs b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs index ce631aa5..1dac4376 100644 --- a/Company.Domain/SmsResultAgg/ISmsResultRepository.cs +++ b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs @@ -1,10 +1,22 @@ -using CompanyManagment.App.Contracts.SmsResult; +using _0_Framework.Domain; +using CompanyManagment.App.Contracts.SmsResult; +using CompanyManagment.App.Contracts.SmsResult.Dto; using System.Collections.Generic; -using _0_Framework.Domain; +using System.Threading.Tasks; namespace Company.Domain.SmsResultAgg; public interface ISmsResultRepository : IRepository { + #region ForApi + + /// + /// دریافت لیست پیامکها + /// + /// + /// + Task> GetSmsReportList(SmsReportSearchModel command); + + #endregion List Search(SmsResultSearchModel searchModel); } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs new file mode 100644 index 00000000..9158d59d --- /dev/null +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs @@ -0,0 +1,13 @@ +namespace CompanyManagment.App.Contracts.SmsResult.Dto; + +public class SmsReportDto +{ + /// + /// تاریخ ارسال + /// + public string SentDate { get; set; } + + +} + + diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs new file mode 100644 index 00000000..a386d47e --- /dev/null +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs @@ -0,0 +1,38 @@ +using _0_Framework.Application.Enums; + +namespace CompanyManagment.App.Contracts.SmsResult.Dto; + +public class SmsReportSearchModel +{ + //نوع پیامک + public TypeOfSmsSetting TypeOfSms { get; set; } + + /// + /// شماره موبایل + /// + public string Mobile { get; set; } + + /// + /// آی دی طرف حساب + /// + public long ContractingPatyId { get; set; } + + /// + /// سال + /// + public string Year { get; set; } + /// + /// ماه + /// + public string Month { get; set; } + + /// + /// تاریخ شروع + /// + public string StartDateFa { get; set; } + + /// + /// تاریخ پایان + /// + public string EndDateFa { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs index 8d8a9b52..786716c3 100644 --- a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs +++ b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs @@ -1,14 +1,26 @@ -using System; +using _0_Framework.Application; +using CompanyManagment.App.Contracts.SmsResult.Dto; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using _0_Framework.Application; namespace CompanyManagment.App.Contracts.SmsResult; public interface ISmsResultApplication { + #region ForApi + + /// + /// دریافت لیست پیامکها + /// + /// + /// + Task> GetSmsReportList(SmsReportSearchModel command); + + #endregion + OperationResult Create(CreateSmsResult command); List Search(SmsResultSearchModel searchModel); } \ No newline at end of file diff --git a/CompanyManagment.Application/SmsResultApplication.cs b/CompanyManagment.Application/SmsResultApplication.cs index 03f01b29..abf9b4f4 100644 --- a/CompanyManagment.Application/SmsResultApplication.cs +++ b/CompanyManagment.Application/SmsResultApplication.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using _0_Framework.Application; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.SmsResult; +using CompanyManagment.App.Contracts.SmsResult.Dto; namespace CompanyManagment.Application; @@ -15,6 +17,18 @@ public class SmsResultApplication : ISmsResultApplication _smsResultRepository = smsResultRepository; } + + #region ForApi + + public async Task> GetSmsReportList(SmsReportSearchModel command) + { + return await _smsResultRepository.GetSmsReportList(command); + } + + #endregion + + + public OperationResult Create(CreateSmsResult command) { var op = new OperationResult(); diff --git a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs index 0b555a7a..496d6085 100644 --- a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs +++ b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs @@ -1,9 +1,14 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Diagnostics; using System.Linq; +using System.Threading.Tasks; using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.SmsResult; +using CompanyManagment.App.Contracts.SmsResult.Dto; +using Microsoft.EntityFrameworkCore; namespace CompanyManagment.EFCore.Repository; @@ -15,6 +20,27 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR _context = context; } + #region ForApi + + public async Task> GetSmsReportList(SmsReportSearchModel command) + { + var watch = new Stopwatch(); + watch.Start(); + var res = _context.SmsResults.GroupBy(x => x.CreationDate); + Console.WriteLine("query : " + watch.Elapsed); + watch.Stop(); + watch.Reset(); + watch.Start(); + var b = await res.Take(9000).Select(x => new SmsReportDto() + { + SentDate = x.Key.ToFarsi() + }).ToListAsync(); + Console.WriteLine("ToList : " + watch.Elapsed); + return b; + } + + #endregion + public List Search(SmsResultSearchModel searchModel) { diff --git a/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs b/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs new file mode 100644 index 00000000..da294057 --- /dev/null +++ b/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs @@ -0,0 +1,24 @@ +using CompanyManagment.App.Contracts.SmsResult; +using CompanyManagment.App.Contracts.SmsResult.Dto; +using Microsoft.AspNetCore.Mvc; +using ServiceHost.BaseControllers; + +namespace ServiceHost.Areas.Admin.Controllers; + +public class SmsReportController : AdminBaseController +{ + private readonly ISmsResultApplication _smsResultApplication; + + public SmsReportController(ISmsResultApplication smsResultApplication) + { + _smsResultApplication = smsResultApplication; + } + + [HttpGet] + public async Task> GetSmsReportList() + { + var search = new SmsReportSearchModel(); + var result =await _smsResultApplication.GetSmsReportList(search); + return result; + } +} \ No newline at end of file diff --git a/ServiceHost/Properties/launchSettings.json b/ServiceHost/Properties/launchSettings.json index f5214c2b..29cf7c0a 100644 --- a/ServiceHost/Properties/launchSettings.json +++ b/ServiceHost/Properties/launchSettings.json @@ -19,7 +19,7 @@ "sqlDebugging": true, "dotnetRunMessages": "true", "nativeDebugging": true, - "applicationUrl": "https://localhost:5004;http://localhost:5003;https://192.168.0.117:5006", + "applicationUrl": "https://localhost:5004;http://localhost:5003;", "jsWebView2Debugging": false, "hotReloadEnabled": true }, From 48b75d2baa4de71a43427b849f4da0048a92ac5c Mon Sep 17 00:00:00 2001 From: SamSys Date: Wed, 7 Jan 2026 16:29:03 +0330 Subject: [PATCH 02/13] Sms Report get list init --- .../Application/Enums/TypeOfSmsSetting.cs | 14 +- .../SmsResultAgg/ISmsResultRepository.cs | 2 +- .../SmsResult/Dto/SendStatus.cs | 15 ++ .../SmsResult/Dto/SmsReportSearchModel.cs | 5 + .../SmsResult/ISmsResultApplication.cs | 4 +- .../SmsResultApplication.cs | 4 +- .../Repository/SmsResultRepository.cs | 178 +++++++++++++++--- .../Admin/Controllers/SmsReportController.cs | 6 +- 8 files changed, 191 insertions(+), 37 deletions(-) create mode 100644 CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs diff --git a/0_Framework/Application/Enums/TypeOfSmsSetting.cs b/0_Framework/Application/Enums/TypeOfSmsSetting.cs index 6d66fc47..28089ced 100644 --- a/0_Framework/Application/Enums/TypeOfSmsSetting.cs +++ b/0_Framework/Application/Enums/TypeOfSmsSetting.cs @@ -2,6 +2,8 @@ public enum TypeOfSmsSetting { + //همه انواع پیامک + All = 0, /// /// پیامک @@ -23,7 +25,7 @@ public enum TypeOfSmsSetting /// /// پیامک - /// هشدار اول + /// هشدار بدهی /// Warning, @@ -38,4 +40,14 @@ public enum TypeOfSmsSetting /// InstitutionContractConfirm, + /// + /// ارسال کد تاییدیه قرارداد مالی + /// + SendInstitutionContractConfirmationCode, + + /// + /// یادآور وظایف + /// + TaskReminder, + } \ No newline at end of file diff --git a/Company.Domain/SmsResultAgg/ISmsResultRepository.cs b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs index 1dac4376..6a4ab25c 100644 --- a/Company.Domain/SmsResultAgg/ISmsResultRepository.cs +++ b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs @@ -15,7 +15,7 @@ public interface ISmsResultRepository : IRepository /// /// /// - Task> GetSmsReportList(SmsReportSearchModel command); + Task> GetSmsReportList(SmsReportSearchModel searchModel); #endregion List Search(SmsResultSearchModel searchModel); diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs new file mode 100644 index 00000000..a2bee8d0 --- /dev/null +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs @@ -0,0 +1,15 @@ +namespace CompanyManagment.App.Contracts.SmsResult.Dto; + +/// +/// وضعیت ارسال پیامک +/// +public enum SendStatus +{ + All=0, + /// + /// موفق + /// + Success, + //ناموفق + Failed, +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs index a386d47e..cec3162a 100644 --- a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportSearchModel.cs @@ -7,6 +7,11 @@ public class SmsReportSearchModel //نوع پیامک public TypeOfSmsSetting TypeOfSms { get; set; } + /// + /// وضعیت ارسال پیامک + /// + public SendStatus SendStatus { get; set; } + /// /// شماره موبایل /// diff --git a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs index 786716c3..b3aee079 100644 --- a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs +++ b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs @@ -15,9 +15,9 @@ public interface ISmsResultApplication /// /// دریافت لیست پیامکها /// - /// + /// /// - Task> GetSmsReportList(SmsReportSearchModel command); + Task> GetSmsReportList(SmsReportSearchModel searchModel); #endregion diff --git a/CompanyManagment.Application/SmsResultApplication.cs b/CompanyManagment.Application/SmsResultApplication.cs index abf9b4f4..85ce62a6 100644 --- a/CompanyManagment.Application/SmsResultApplication.cs +++ b/CompanyManagment.Application/SmsResultApplication.cs @@ -20,9 +20,9 @@ public class SmsResultApplication : ISmsResultApplication #region ForApi - public async Task> GetSmsReportList(SmsReportSearchModel command) + public async Task> GetSmsReportList(SmsReportSearchModel searchModel) { - return await _smsResultRepository.GetSmsReportList(command); + return await _smsResultRepository.GetSmsReportList(searchModel); } #endregion diff --git a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs index 496d6085..943b32d1 100644 --- a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs +++ b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs @@ -1,18 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; -using _0_Framework.Application; +using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.SmsResult; using CompanyManagment.App.Contracts.SmsResult.Dto; using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using _0_Framework.Application.Enums; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace CompanyManagment.EFCore.Repository; -public class SmsResultRepository : RepositoryBase , ISmsResultRepository +public class SmsResultRepository : RepositoryBase, ISmsResultRepository { private readonly CompanyContext _context; public SmsResultRepository(CompanyContext context) : base(context) @@ -22,28 +24,148 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR #region ForApi - public async Task> GetSmsReportList(SmsReportSearchModel command) + + + public async Task> GetSmsReportList(SmsReportSearchModel searchModel) { - var watch = new Stopwatch(); - watch.Start(); - var res = _context.SmsResults.GroupBy(x => x.CreationDate); - Console.WriteLine("query : " + watch.Elapsed); - watch.Stop(); - watch.Reset(); - watch.Start(); - var b = await res.Take(9000).Select(x => new SmsReportDto() + + // مرحله 1: همه رکوردها را با projection ساده بگیرید + var rawQuery = await _context.SmsResults + .Select(x => new + { + x.id, + x.ContractingPatyId, + x.Mobile, + x.Status, + x.TypeOfSms, + x.CreationDate, + DateOnly = x.CreationDate.Date // فقط تاریخ بدون ساعت + }) + .AsNoTracking() + .ToListAsync(); // اینجا SQL اجرا می‌شود و همه داده‌ها به client می‌آیند + + if (searchModel.ContractingPatyId > 0) { - SentDate = x.Key.ToFarsi() - }).ToListAsync(); - Console.WriteLine("ToList : " + watch.Elapsed); - return b; + rawQuery = rawQuery.Where(x => x.ContractingPatyId == searchModel.ContractingPatyId).ToList(); + } + + if (!string.IsNullOrWhiteSpace(searchModel.Mobile)) + { + rawQuery = rawQuery.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList(); + } + + if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning) + { + var typeOfSms = "All"; + switch (searchModel.TypeOfSms) + { + case TypeOfSmsSetting.InstitutionContractDebtReminder: + typeOfSms = "یادآور بدهی ماهانه"; + break; + case TypeOfSmsSetting.MonthlyInstitutionContract: + typeOfSms = "صورت حساب ماهانه"; + break; + case TypeOfSmsSetting.BlockContractingParty: + typeOfSms = "اعلام مسدودی طرف حساب"; + break; + case TypeOfSmsSetting.LegalAction: + typeOfSms = "اقدام قضایی"; + break; + case TypeOfSmsSetting.InstitutionContractConfirm: + typeOfSms = "یادآور تایید قرارداد مالی"; + break; + case TypeOfSmsSetting.SendInstitutionContractConfirmationCode: + typeOfSms = "کد تاییدیه قرارداد مالی"; + break; + case TypeOfSmsSetting.TaskReminder: + typeOfSms = "یادآور وظایف"; + break; + } + + rawQuery = rawQuery.Where(x => x.TypeOfSms == typeOfSms).ToList(); + } + + if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning) + { + rawQuery = rawQuery.Where(x => x.TypeOfSms.Contains("هشدار")).ToList(); + } + + if (searchModel.SendStatus != SendStatus.All) + { + var status = "All"; + + switch (searchModel.SendStatus) + { + case SendStatus.Success: status = "موفق"; + break; + case SendStatus.Failed: status = "ناموفق"; + break; + + + } + + rawQuery = rawQuery.Where(x => x.Status == status).ToList(); + + } + #region searchByDate + + if (!string.IsNullOrWhiteSpace(searchModel.StartDateFa) && + !string.IsNullOrWhiteSpace(searchModel.EndDateFa)) + { + if (searchModel.StartDateFa.TryToGeorgianDateTime(out var startGr) == false || + searchModel.EndDateFa.TryToGeorgianDateTime(out var endGr) == false) + return new List(); + + rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList(); + + } + else + { + if (!string.IsNullOrWhiteSpace(searchModel.Year) && !string.IsNullOrWhiteSpace(searchModel.Month)) + { + var start = searchModel.Year + "/" + searchModel.Month + "/01"; + var end = start.FindeEndOfMonth(); + var startGr = start.ToGeorgianDateTime(); + var endGr = end.ToGeorgianDateTime(); + rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList(); + + + } + else if (!string.IsNullOrWhiteSpace(searchModel.Year) && string.IsNullOrWhiteSpace(searchModel.Month)) + { + var start = searchModel.Year + "/01/01"; + var findEndOfYear = searchModel.Year + "/12/01"; + var end = findEndOfYear.FindeEndOfMonth(); + var startGr = start.ToGeorgianDateTime(); + var endGr = end.ToGeorgianDateTime(); + rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList(); + + } + } + + #endregion + + // مرحله 2: گروه‌بندی و انتخاب آخرین رکورد هر روز روی Client + var grouped = rawQuery + .GroupBy(x => x.DateOnly) + .Select(g => g.OrderByDescending(x => x.CreationDate).First()) + .OrderByDescending(x => x.CreationDate) + .ToList(); + + // مرحله 3: تبدیل به DTO و ToFarsi + var result = grouped.Select(x => new SmsReportDto + { + SentDate = x.CreationDate.ToFarsi() + }).ToList(); + return result; } + #endregion public List Search(SmsResultSearchModel searchModel) { - + var query = _context.SmsResults.Select(x => new App.Contracts.SmsResult.SmsResultViewModel() { Id = x.id, @@ -90,7 +212,7 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR var endGr = end.ToGeorgianDateTime(); query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); - + } else if (!string.IsNullOrWhiteSpace(searchModel.Year) && string.IsNullOrWhiteSpace(searchModel.Month)) { @@ -100,7 +222,7 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR var startGr = start.ToGeorgianDateTime(); var endGr = end.ToGeorgianDateTime(); query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); - + } } @@ -108,12 +230,12 @@ public class SmsResultRepository : RepositoryBase , ISmsResultR query = query.OrderByDescending(x => x.CreationDate) - .ThenByDescending(x=>x.CreationDate.Hour).ThenByDescending(x=>x.CreationDate.Minute); - + .ThenByDescending(x => x.CreationDate.Hour).ThenByDescending(x => x.CreationDate.Minute); + return query.Skip(searchModel.PageIndex).Take(30).ToList(); - - + + } - + } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs b/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs index da294057..c3d42a97 100644 --- a/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs +++ b/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs @@ -15,10 +15,10 @@ public class SmsReportController : AdminBaseController } [HttpGet] - public async Task> GetSmsReportList() + public async Task> GetSmsReportList(SmsReportSearchModel searchModel) { - var search = new SmsReportSearchModel(); - var result =await _smsResultApplication.GetSmsReportList(search); + + var result =await _smsResultApplication.GetSmsReportList(searchModel); return result; } } \ No newline at end of file From 23b65cfbfe3f4b28703f3f9c471e94b7768b0a3d Mon Sep 17 00:00:00 2001 From: SamSys Date: Wed, 7 Jan 2026 16:59:21 +0330 Subject: [PATCH 03/13] GetSms Report Expand List --- .../SmsResult/Dto/SmsReportDto.cs | 43 +++++- .../Repository/SmsResultRepository.cs | 141 ++++++++++++++++++ 2 files changed, 183 insertions(+), 1 deletion(-) diff --git a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs index 9158d59d..445ed2b0 100644 --- a/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs +++ b/CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs @@ -1,4 +1,6 @@ -namespace CompanyManagment.App.Contracts.SmsResult.Dto; +using System; + +namespace CompanyManagment.App.Contracts.SmsResult.Dto; public class SmsReportDto { @@ -10,4 +12,43 @@ public class SmsReportDto } +public class SmsReportListDto +{ + /// + /// آی دی + /// + public long Id { get; set; } + /// + /// آی دی پیامک در sms.ir + /// + public int MessageId { get; set; } + + /// + /// وضعیت ارسال + /// + public string Status { get; set; } + + /// + /// نوع پیامک + /// + public string TypeOfSms { get; set; } + + /// + /// نام طرف حساب + /// + public string ContractingPartyName { get; set; } + + /// + /// شماره موبایل + /// + public string Mobile { get; set; } + + + /// + /// ساعت و دقیقه + /// + public string HourAndMinute { get; set; } +} + + diff --git a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs index 943b32d1..326def5f 100644 --- a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs +++ b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs @@ -161,6 +161,147 @@ public class SmsResultRepository : RepositoryBase, ISmsResultRe } + public async Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date) + { + if (date.TryToGeorgianDateTime(out var searchDate) == false) + return new List(); + var query = _context.SmsResults.Where(x => x.CreationDate == searchDate).Select(x => + new App.Contracts.SmsResult.SmsResultViewModel() + { + Id = x.id, + MessageId = x.MessageId, + Status = x.Status, + TypeOfSms = x.TypeOfSms, + ContractingPartyName = x.ContractingPartyName, + Mobile = x.Mobile, + ContractingPartyId = x.ContractingPatyId, + InstitutionContractId = x.InstitutionContractId, + CreationDate = x.CreationDate, + Hour = x.CreationDate.Hour > 9 ? $"{x.CreationDate.Hour}" : $"0{x.CreationDate.Hour}", + Minute = x.CreationDate.Minute > 9 ? $"{x.CreationDate.Minute}" : $"0{x.CreationDate.Minute}", + + }); + + if (searchModel.ContractingPatyId > 0) + { + query = query.Where(x => x.ContractingPartyId == searchModel.ContractingPatyId); + } + + if (!string.IsNullOrWhiteSpace(searchModel.Mobile)) + { + query = query.Where(x => x.Mobile.Contains(searchModel.Mobile)); + } + + if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning) + { + var typeOfSms = "All"; + switch (searchModel.TypeOfSms) + { + case TypeOfSmsSetting.InstitutionContractDebtReminder: + typeOfSms = "یادآور بدهی ماهانه"; + break; + case TypeOfSmsSetting.MonthlyInstitutionContract: + typeOfSms = "صورت حساب ماهانه"; + break; + case TypeOfSmsSetting.BlockContractingParty: + typeOfSms = "اعلام مسدودی طرف حساب"; + break; + case TypeOfSmsSetting.LegalAction: + typeOfSms = "اقدام قضایی"; + break; + case TypeOfSmsSetting.InstitutionContractConfirm: + typeOfSms = "یادآور تایید قرارداد مالی"; + break; + case TypeOfSmsSetting.SendInstitutionContractConfirmationCode: + typeOfSms = "کد تاییدیه قرارداد مالی"; + break; + case TypeOfSmsSetting.TaskReminder: + typeOfSms = "یادآور وظایف"; + break; + } + + query = query.Where(x => x.TypeOfSms == typeOfSms); + } + + if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning) + { + query = query.Where(x => x.TypeOfSms.Contains("هشدار")); + } + + if (searchModel.SendStatus != SendStatus.All) + { + var status = "All"; + + switch (searchModel.SendStatus) + { + case SendStatus.Success: + status = "موفق"; + break; + case SendStatus.Failed: + status = "ناموفق"; + break; + + + } + + query = query.Where(x => x.Status == status); + + } + + #region searchByDate + + if (!string.IsNullOrWhiteSpace(searchModel.StartDateFa) && + !string.IsNullOrWhiteSpace(searchModel.EndDateFa)) + { + if (searchModel.StartDateFa.TryToGeorgianDateTime(out var startGr) == false || + searchModel.EndDateFa.TryToGeorgianDateTime(out var endGr) == false) + return new List(); + + query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); + + } + else + { + if (!string.IsNullOrWhiteSpace(searchModel.Year) && !string.IsNullOrWhiteSpace(searchModel.Month)) + { + var start = searchModel.Year + "/" + searchModel.Month + "/01"; + var end = start.FindeEndOfMonth(); + var startGr = start.ToGeorgianDateTime(); + var endGr = end.ToGeorgianDateTime(); + query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); + + + } + else if (!string.IsNullOrWhiteSpace(searchModel.Year) && string.IsNullOrWhiteSpace(searchModel.Month)) + { + var start = searchModel.Year + "/01/01"; + var findEndOfYear = searchModel.Year + "/12/01"; + var end = findEndOfYear.FindeEndOfMonth(); + var startGr = start.ToGeorgianDateTime(); + var endGr = end.ToGeorgianDateTime(); + query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); + + } + } + #endregion + var result = await query.OrderByDescending(x => x.CreationDate) + .ThenByDescending(x => x.CreationDate.Hour).ThenByDescending(x => x.CreationDate.Minute).Select(x => + new SmsReportListDto + { + Id = x.Id, + MessageId = x.MessageId, + Status = x.Status, + TypeOfSms = x.TypeOfSms, + ContractingPartyName = x.ContractingPartyName, + Mobile = x.Mobile, + HourAndMinute = $"{x.Hour}:{x.Minute}" + + }).ToListAsync(); + + return result; + + } + #endregion public List Search(SmsResultSearchModel searchModel) From 4de2e12ac5a4d70301bbe55b0edc222831204605 Mon Sep 17 00:00:00 2001 From: SamSys Date: Wed, 7 Jan 2026 18:38:12 +0330 Subject: [PATCH 04/13] AmaApiReport --- .../Application/Sms/ApiResultViewModel.cs | 14 +++ 0_Framework/Application/Sms/ISmsService.cs | 7 ++ .../SmsResultAgg/ISmsResultRepository.cs | 8 ++ .../SmsResult/ISmsResultApplication.cs | 8 ++ .../SmsResultApplication.cs | 5 + .../Repository/SmsResultRepository.cs | 96 +++++++------------ .../Services/SmsService.cs | 53 ++++++++-- .../Admin/Controllers/SmsReportController.cs | 39 +++++++- 8 files changed, 156 insertions(+), 74 deletions(-) diff --git a/0_Framework/Application/Sms/ApiResultViewModel.cs b/0_Framework/Application/Sms/ApiResultViewModel.cs index 0afaddc1..0d5c1ca1 100644 --- a/0_Framework/Application/Sms/ApiResultViewModel.cs +++ b/0_Framework/Application/Sms/ApiResultViewModel.cs @@ -17,4 +17,18 @@ public class ApiResultViewModel public string DeliveryUnixTime { get; set; } public string DeliveryColor { get; set; } public string FullName { get; set; } +} + + +public class ApiReportDto +{ + public int MessageId { get; set; } + + public long Mobile { get; set; } + + public string SendUnixTime { get; set; } + public string DeliveryState { get; set; } + public string DeliveryUnixTime { get; set; } + public string DeliveryColor { get; set; } + } \ No newline at end of file diff --git a/0_Framework/Application/Sms/ISmsService.cs b/0_Framework/Application/Sms/ISmsService.cs index 9590bf27..20e41608 100644 --- a/0_Framework/Application/Sms/ISmsService.cs +++ b/0_Framework/Application/Sms/ISmsService.cs @@ -19,6 +19,13 @@ public interface ISmsService bool SendAccountsInfo(string number,string fullName, string userName); Task GetByMessageId(int messId); Task> GetApiResult(string startDate, string endDate); + + #region ForApi + + Task> GetApiReport(string startDate, string endDate); + +#endregion + string DeliveryStatus(byte? dv); string DeliveryColorStatus(byte? dv); string UnixTimeStampToDateTime(int? unixTimeStamp); diff --git a/Company.Domain/SmsResultAgg/ISmsResultRepository.cs b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs index 6a4ab25c..24ee411b 100644 --- a/Company.Domain/SmsResultAgg/ISmsResultRepository.cs +++ b/Company.Domain/SmsResultAgg/ISmsResultRepository.cs @@ -17,6 +17,14 @@ public interface ISmsResultRepository : IRepository /// Task> GetSmsReportList(SmsReportSearchModel searchModel); + /// + /// دریافت اکسپند لیست هر تاریخ + /// + /// + /// + /// + Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date); + #endregion List Search(SmsResultSearchModel searchModel); } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs index b3aee079..2c857396 100644 --- a/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs +++ b/CompanyManagment.App.Contracts/SmsResult/ISmsResultApplication.cs @@ -19,6 +19,14 @@ public interface ISmsResultApplication /// Task> GetSmsReportList(SmsReportSearchModel searchModel); + /// + /// دریافت اکسپند لیست هر تاریخ + /// + /// + /// + /// + Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date); + #endregion OperationResult Create(CreateSmsResult command); diff --git a/CompanyManagment.Application/SmsResultApplication.cs b/CompanyManagment.Application/SmsResultApplication.cs index 85ce62a6..2c94d837 100644 --- a/CompanyManagment.Application/SmsResultApplication.cs +++ b/CompanyManagment.Application/SmsResultApplication.cs @@ -25,6 +25,11 @@ public class SmsResultApplication : ISmsResultApplication return await _smsResultRepository.GetSmsReportList(searchModel); } + public async Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date) + { + return await _smsResultRepository.GetSmsReportExpandList(searchModel, date); + } + #endregion diff --git a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs index 326def5f..18ccbe1d 100644 --- a/CompanyManagment.EFCore/Repository/SmsResultRepository.cs +++ b/CompanyManagment.EFCore/Repository/SmsResultRepository.cs @@ -163,33 +163,39 @@ public class SmsResultRepository : RepositoryBase, ISmsResultRe public async Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date) { + if(string.IsNullOrWhiteSpace(date)) + return new List(); + if (date.TryToGeorgianDateTime(out var searchDate) == false) return new List(); - var query = _context.SmsResults.Where(x => x.CreationDate == searchDate).Select(x => - new App.Contracts.SmsResult.SmsResultViewModel() - { - Id = x.id, - MessageId = x.MessageId, - Status = x.Status, - TypeOfSms = x.TypeOfSms, - ContractingPartyName = x.ContractingPartyName, - Mobile = x.Mobile, - ContractingPartyId = x.ContractingPatyId, - InstitutionContractId = x.InstitutionContractId, - CreationDate = x.CreationDate, - Hour = x.CreationDate.Hour > 9 ? $"{x.CreationDate.Hour}" : $"0{x.CreationDate.Hour}", - Minute = x.CreationDate.Minute > 9 ? $"{x.CreationDate.Minute}" : $"0{x.CreationDate.Minute}", - }); + var query = await _context.SmsResults.Where(x => x.CreationDate.Date == searchDate.Date) + .Select(x => + new + { + x.id, + x.MessageId, + x.Status, + x.TypeOfSms, + x.ContractingPartyName, + x.Mobile, + x.ContractingPatyId, + x.InstitutionContractId, + x.CreationDate, + x.CreationDate.Hour, + x.CreationDate.Minute + + }).AsNoTracking() + .ToListAsync(); ; if (searchModel.ContractingPatyId > 0) { - query = query.Where(x => x.ContractingPartyId == searchModel.ContractingPatyId); + query = query.Where(x => x.ContractingPatyId == searchModel.ContractingPatyId).ToList(); } if (!string.IsNullOrWhiteSpace(searchModel.Mobile)) { - query = query.Where(x => x.Mobile.Contains(searchModel.Mobile)); + query = query.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList(); } if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning) @@ -220,12 +226,12 @@ public class SmsResultRepository : RepositoryBase, ISmsResultRe break; } - query = query.Where(x => x.TypeOfSms == typeOfSms); + query = query.Where(x => x.TypeOfSms == typeOfSms).ToList(); } if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning) { - query = query.Where(x => x.TypeOfSms.Contains("هشدار")); + query = query.Where(x => x.TypeOfSms.Contains("هشدار")).ToList(); } if (searchModel.SendStatus != SendStatus.All) @@ -244,59 +250,25 @@ public class SmsResultRepository : RepositoryBase, ISmsResultRe } - query = query.Where(x => x.Status == status); + query = query.Where(x => x.Status == status).ToList(); } - #region searchByDate + if (query.Count == 0) + return new List(); - if (!string.IsNullOrWhiteSpace(searchModel.StartDateFa) && - !string.IsNullOrWhiteSpace(searchModel.EndDateFa)) - { - if (searchModel.StartDateFa.TryToGeorgianDateTime(out var startGr) == false || - searchModel.EndDateFa.TryToGeorgianDateTime(out var endGr) == false) - return new List(); - - query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); - - } - else - { - if (!string.IsNullOrWhiteSpace(searchModel.Year) && !string.IsNullOrWhiteSpace(searchModel.Month)) - { - var start = searchModel.Year + "/" + searchModel.Month + "/01"; - var end = start.FindeEndOfMonth(); - var startGr = start.ToGeorgianDateTime(); - var endGr = end.ToGeorgianDateTime(); - query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); - - - } - else if (!string.IsNullOrWhiteSpace(searchModel.Year) && string.IsNullOrWhiteSpace(searchModel.Month)) - { - var start = searchModel.Year + "/01/01"; - var findEndOfYear = searchModel.Year + "/12/01"; - var end = findEndOfYear.FindeEndOfMonth(); - var startGr = start.ToGeorgianDateTime(); - var endGr = end.ToGeorgianDateTime(); - query = query.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date); - - } - } - #endregion - var result = await query.OrderByDescending(x => x.CreationDate) - .ThenByDescending(x => x.CreationDate.Hour).ThenByDescending(x => x.CreationDate.Minute).Select(x => - new SmsReportListDto + var result = query.OrderByDescending(x => x.CreationDate.Hour) + .ThenByDescending(x => x.CreationDate.Minute).Select(x => + new SmsReportListDto() { - Id = x.Id, + Id = x.id, MessageId = x.MessageId, Status = x.Status, TypeOfSms = x.TypeOfSms, ContractingPartyName = x.ContractingPartyName, Mobile = x.Mobile, - HourAndMinute = $"{x.Hour}:{x.Minute}" - - }).ToListAsync(); + HourAndMinute = x.CreationDate.TimeOfDay.ToString(@"hh\:mm"), + }).ToList(); return result; diff --git a/CompanyManagment.EFCore/Services/SmsService.cs b/CompanyManagment.EFCore/Services/SmsService.cs index 82cf6917..11ea7adb 100644 --- a/CompanyManagment.EFCore/Services/SmsService.cs +++ b/CompanyManagment.EFCore/Services/SmsService.cs @@ -207,16 +207,11 @@ public class SmsService : ISmsService } public async Task> GetApiResult(string startDate, string endDate) { - var st = new DateTime(2024, 6, 2); - var ed = new DateTime(2024, 7, 1); - if (!string.IsNullOrWhiteSpace(startDate) && startDate.Length == 10) - { - st = startDate.ToGeorgianDateTime(); - } - if (!string.IsNullOrWhiteSpace(endDate) && endDate.Length == 10) - { - ed = endDate.ToGeorgianDateTime(); - } + + + if(startDate.TryToGeorgianDateTime(out var st) == false || endDate.TryToGeorgianDateTime(out var ed) == false) + return new List(); + var res = new List(); Int32 unixTimestamp = (int)st.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; Int32 unixTimestamp2 = (int)ed.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; @@ -248,6 +243,44 @@ public class SmsService : ISmsService return res; } + public async Task> GetApiReport(string startDate, string endDate) + { + + + if (startDate.TryToGeorgianDateTime(out var st) == false || endDate.TryToGeorgianDateTime(out var ed) == false) + return new List(); + + var res = new List(); + Int32 unixTimestamp = (int)st.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + Int32 unixTimestamp2 = (int)ed.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + // int? fromDateUnixTime = null; // unix time - for instance: 1700598600 + //int? toDateUnixTime = null; // unix time - for instance: 1703190600 + int pageNumber = 2; + int pageSize = 100; // max: 100 + SmsIr smsIr = new SmsIr("Og5M562igmzJRhQPnq0GdtieYdLgtfikjzxOmeQBPxJjZtyge5Klc046Lfw1mxSa"); + var response = await smsIr.GetArchivedReportAsync(pageNumber, pageSize, unixTimestamp, unixTimestamp2); + + MessageReportResult[] messages = response.Data; + foreach (var message in messages) + { + var appendData = new ApiReportDto() + { + MessageId = message.MessageId, + + Mobile = message.Mobile, + + SendUnixTime = UnixTimeStampToDateTime(message.SendDateTime), + DeliveryState = DeliveryStatus(message.DeliveryState), + DeliveryUnixTime = UnixTimeStampToDateTime(message.DeliveryDateTime), + DeliveryColor = DeliveryColorStatus(message.DeliveryState), + }; + res.Add(appendData); + } + + + return res; + } + public string DeliveryStatus(byte? dv) { string mess = ""; diff --git a/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs b/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs index c3d42a97..254d5d05 100644 --- a/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs +++ b/ServiceHost/Areas/Admin/Controllers/SmsReportController.cs @@ -1,4 +1,5 @@ -using CompanyManagment.App.Contracts.SmsResult; +using _0_Framework.Application.Sms; +using CompanyManagment.App.Contracts.SmsResult; using CompanyManagment.App.Contracts.SmsResult.Dto; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; @@ -8,12 +9,19 @@ namespace ServiceHost.Areas.Admin.Controllers; public class SmsReportController : AdminBaseController { private readonly ISmsResultApplication _smsResultApplication; + private readonly ISmsService _smsService; - public SmsReportController(ISmsResultApplication smsResultApplication) + public SmsReportController(ISmsResultApplication smsResultApplication, ISmsService smsService) { _smsResultApplication = smsResultApplication; + _smsService = smsService; } + /// + /// دریافت لیست پیامک ها + /// + /// + /// [HttpGet] public async Task> GetSmsReportList(SmsReportSearchModel searchModel) { @@ -21,4 +29,31 @@ public class SmsReportController : AdminBaseController var result =await _smsResultApplication.GetSmsReportList(searchModel); return result; } + + /// + /// دریافت اطلاعات هر تاریخ برای اکسپند + /// + /// + /// + /// + [HttpGet("GetExpandedList")] + public async Task> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date) + { + var result =await _smsResultApplication.GetSmsReportExpandList(searchModel, date); + return result; + } + + /// + /// گزارش ای پی آی + /// + /// + /// + /// + [HttpGet("GetApiReport")] + public async Task> GetApiReport(string startDate, string endDate) + { + var result =await _smsService.GetApiReport(startDate, endDate); + return result; + } + } \ No newline at end of file From 35e6355069e249c1ca1ba8e745a7b8b333bb47d4 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 11:19:25 +0330 Subject: [PATCH 05/13] get Warning sms List on new repo --- .../Jobs/JobSchedulerRegistrator.cs | 64 +-- .../IInstitutionContractRepository.cs | 10 +- ...InstitutionContractSmsServiceRepository.cs | 18 + .../InstitutionContractRepository.cs | 323 +------------- ...InstitutionContractSmsServiceRepository.cs | 393 ++++++++++++++++++ .../PersonalBootstrapper.cs | 1 + 6 files changed, 449 insertions(+), 360 deletions(-) create mode 100644 Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs create mode 100644 CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index f368cb3e..70517f47 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -12,57 +12,59 @@ public class JobSchedulerRegistrator private readonly IBackgroundJobClient _backgroundJobClient; private readonly SmsReminder _smsReminder; private readonly IInstitutionContractRepository _institutionContractRepository; + private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository; private static DateTime? _lastRunCreateTransaction; private static DateTime? _lastRunSendMonthlySms; private readonly ISmsService _smsService; private readonly ILogger _logger; - public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger logger) + public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger logger, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository) { _smsReminder = smsReminder; _backgroundJobClient = backgroundJobClient; _institutionContractRepository = institutionContractRepository; _smsService = smsService; _logger = logger; + _institutionContractSmsServiceRepository = institutionContractSmsServiceRepository; } public void Register() { _logger.LogInformation("hangfire Started"); - RecurringJob.AddOrUpdate( - "InstitutionContract.CreateFinancialTransaction", - () => CreateFinancialTransaction(), - "*/30 * * * *" // هر 30 دقیقه یکبار چک کن - ); - - RecurringJob.AddOrUpdate( - "InstitutionContract.SendMonthlySms", - () => SendFirstDayOfMonthSms(), - "*/20 * * * *" // هر 30 دقیقه یکبار چک کن - ); - - RecurringJob.AddOrUpdate( - "InstitutionContract.SendReminderSms", - () => SendReminderSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); - RecurringJob.AddOrUpdate( - "InstitutionContract.SendBlockSms", - () => SendBlockSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); - RecurringJob.AddOrUpdate( - "InstitutionContract.SendInstitutionContractConfirmSms", - () => SendInstitutionContractConfirmSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.CreateFinancialTransaction", + // () => CreateFinancialTransaction(), + // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + //); //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendWarningSms", - // () => SendWarningSms(), + // "InstitutionContract.SendMonthlySms", + // () => SendFirstDayOfMonthSms(), + // "*/20 * * * *" // هر 30 دقیقه یکبار چک کن + //); + + //RecurringJob.AddOrUpdate( + // "InstitutionContract.SendReminderSms", + // () => SendReminderSms(), // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن //); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.SendBlockSms", + // () => SendBlockSms(), + // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + //); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.SendInstitutionContractConfirmSms", + // () => SendInstitutionContractConfirmSms(), + // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + //); + + RecurringJob.AddOrUpdate( + "InstitutionContract.SendWarningSms", + () => SendWarningSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); //RecurringJob.AddOrUpdate( // "InstitutionContract.SendLegalActionSms", @@ -190,7 +192,7 @@ public class JobSchedulerRegistrator public async System.Threading.Tasks.Task SendWarningSms() { _logger.LogInformation("SendWarningSms job run"); - await _institutionContractRepository.SendWarningSmsTask(); + await _institutionContractSmsServiceRepository.SendWarningSmsTask(); } [DisableConcurrentExecution(timeoutInSeconds: 100)] diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 61097777..c576da00 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -162,14 +162,7 @@ public interface IInstitutionContractRepository : IRepository - /// پیامک های هشدار - /// - /// - Task SendWarningSmsTask(); - #endregion #region legalAction @@ -181,6 +174,9 @@ public interface IInstitutionContractRepository : IRepository GetIdByInstallmentId(long installmentId); Task GetPreviousContract(long currentInstitutionContractId); Task CreationInquiry(InstitutionContractCreationInquiryRequest request); diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs new file mode 100644 index 00000000..32c14c5e --- /dev/null +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -0,0 +1,18 @@ +using _0_Framework.Application.Enums; +using _0_Framework.Domain; +using CompanyManagment.App.Contracts.InstitutionContract; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Company.Domain.InstitutionContractAgg; + +public interface IInstitutionContractSmsServiceRepository : IRepository +{ + + #region WarningOrLegalActionSmsListData + + Task SendWarningSmsTask(); + Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting); + + #endregion +} \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 4ea52bbb..6b624087 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -6282,328 +6282,7 @@ public class InstitutionContractRepository : RepositoryBase - x.DayOfMonth >= dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.Warning && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.Warning && - x.IsActive - ); - } - - - if (checkAnyToExecute) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک ارسال پیامک هشدار SendWarningSms" + - persianNow + " - " + hour + ":" + minute); - - - } - } - - /// - ///دریافت لیست پیامک قراداد های آبی بدهکار - /// - /// - //public async Task> GetWarningSmsListData() - //{ - - // var institutionContracts = await _context.InstitutionContractSet.AsQueryable().Select(x => new InstitutionContractViewModel - // { - // Id = x.id, - // ContractingPartyId = x.ContractingPartyId, - // ContractingPartyName = x.ContractingPartyName, - // ContractStartGr = x.ContractStartGr, - // ContractStartFa = x.ContractStartFa, - // ContractEndGr = x.ContractEndGr, - // ContractEndFa = x.ContractEndFa, - // IsActiveString = x.IsActiveString, - // ContractAmountDouble = x.ContractAmount, - // OfficialCompany = x.OfficialCompany, - // IsInstallment = x.IsInstallment, - // VerificationStatus = x.VerificationStatus, - // SigningType = x.SigningType, - // }).Where(x => x.IsActiveString == "blue" && - // x.ContractAmountDouble > 0).GroupBy(x => x.ContractingPartyId).Select(x => x.First()).ToListAsync(); - - // var institutionContractsIds = institutionContracts.Select(x => x.id).ToList(); - - // // قرارداد هایی که بطور یکجا پرداخت شده اند - // var paidInFull = institutionContracts.Where(x => - // x.SigningType != InstitutionContractSigningType.Legacy && x.IsInstallment == false && x.SigningType != null).ToList(); - - // //حذف قراداد هایی که یکجا پرداخت شده اند از لیست ایجاد سند ماهانه - // institutionContracts = institutionContracts.Except(paidInFull).ToList(); - - // var contractingPartyList = await _context.PersonalContractingParties - // .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.id)).ToListAsync(); - - // var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() - // .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) - // .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); - - // var phoneNumberList = await _context.InstitutionContractContactInfos - // .Where(x => institutionContracts.Select(ins => ins.Id).Contains(x.InstitutionContractId)) - // .Where(x => x.SendSms && x.PhoneType == "شماره همراه" && !string.IsNullOrWhiteSpace(x.PhoneNumber) && - // x.PhoneNumber.Length == 11).ToListAsync(); - // var legalActionSentSms = await _context.SmsResults - // .Where(x => x.TypeOfSms == "اقدام قضایی").ToListAsync(); - // var warningSentSms = await _context.SmsResults.Where(x => x.TypeOfSms.Contains("هشدار")).ToListAsync(); - - // var oldInstitutionContract = institutionContracts.Where(x => x.IsInstallment == false).ToList(); - // var electronicInstitutionContract = institutionContracts.Where(x => x.IsInstallment == true).ToList(); - - // foreach (var item in oldInstitutionContract) - // { - // try - // { - // var contractingParty = GetDetails(item.ContractingPartyId); - // bool hasLegalActionSentSms = legalActionSentSms.Any(x => x.InstitutionContractId == item.Id); - // int year = Convert.ToInt32(item.ContractEndFa.Substring(0, 4)); - // int month = Convert.ToInt32(item.ContractEndFa.Substring(5, 2)); - // var endOfContractNextMonthStart = new PersianDateTime(year, month, 1).AddMonths(1); - // var endOfContractNextMonthEnd = (($"{endOfContractNextMonthStart}").FindeEndOfMonth()).ToGeorgianDateTime(); - // var now = DateTime.Now - - // if (!string.IsNullOrWhiteSpace(contractingParty.LName) && !hasLegalActionSentSms && now.Date <= endOfContractNextMonthEnd.Date) - // { - // //Thread.Sleep(500); - // var partyName = contractingParty.LName; - - // if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; - - // var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; - // var isBlock = contractingParty.IsBlock == "true" ? true : false; - // var isActive = contractingParty.IsActiveString == "true" ? true : false; - // if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString)) - // { - // var hasFinancialStatement = - // financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); - - // var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - - // if (hasFinancialStatement && hasPhonNumber) - // { - // var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) - // .Select(x => new CreateContactInfo - // { - // PhoneType = x.PhoneType, - // PhoneNumber = x.PhoneNumber, - - // InstitutionContractId = x.InstitutionContractId, - // SendSms = x.SendSms - // }).Where(x => x.PhoneNumber.Length == 11).ToList(); - - // var transactions = financialStatmentList.FirstOrDefault(x => - // x.ContractingPartyId == item.ContractingPartyId); - - - // var debtor = transactions.FinancialTransactionViewModels.Sum(x => x.Deptor); - // var creditor = transactions.FinancialTransactionViewModels.Sum(x => x.Creditor); - - - // var id = $"{item.ContractingPartyId}"; - // var aprove = $"{transactions.Id}"; - // var balance = debtor - creditor; - - // if (balance > 0) // اگر بدهکار بود - // { - - // if (isLegal) - // { - // if (item.OfficialCompany == "Official") // حقوقی بدهکار رسمی - // { - // var balanceToMoney = balance.ToMoney(); - - // foreach (var number in phoneNumbers) - // { - - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // var t = warningSentSms.Any(x=> x.) - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - - // var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 608443, - // partyName, - // balanceToMoney, id, aprove); - // Thread.Sleep(1000); - // if (smsResult.IsSuccedded) - // { - // var createSmsResult = new SmsResult(smsResult.MessageId, - // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, - // item.ContractingPartyId, item.Id); - // _smsResultRepository.Create(createSmsResult); - // _smsResultRepository.SaveChanges(); - // Thread.Sleep(1000); - // } - - // } - // } - - - - // } - // else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی - // { - // var balanceToMoney = balance.ToMoney(); - // foreach (var number in phoneNumbers) - // { - // var isSend = _context.SmsResults.Any(x => - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber && x.TypeOfSms == typeOfSms); - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - - // var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 351691, - // partyName, - // balanceToMoney, id, aprove); - // Thread.Sleep(1000); - // if (smsResult.IsSuccedded) - // { - // var createSmsResult = new SmsResult(smsResult.MessageId, - // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, - // item.ContractingPartyId, item.Id); - // _smsResultRepository.Create(createSmsResult); - // _smsResultRepository.SaveChanges(); - // Thread.Sleep(1000); - // } - - - - // } - // } - - - // } - // } - // else - // { - // if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی - // { - // var balanceToMoney = balance.ToMoney(); - - // foreach (var number in phoneNumbers) - // { - // var isSend = _context.SmsResults.Any(x => - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber && x.TypeOfSms == typeOfSms); - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - - // var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 190430, - // partyName, - // balanceToMoney, id, aprove); - // Thread.Sleep(1000); - // if (smsResult.IsSuccedded) - // { - // var createSmsResult = new SmsResult(smsResult.MessageId, - // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, - // item.ContractingPartyId, item.Id); - // _smsResultRepository.Create(createSmsResult); - // _smsResultRepository.SaveChanges(); - // Thread.Sleep(1000); - // } - // } - // } - - - // } - // else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی - // { - // var balanceToMoney = balance.ToMoney(); - - // foreach (var number in phoneNumbers) - // { - // var isSend = _context.SmsResults.Any(x => - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber && x.TypeOfSms == typeOfSms); - // var isLastAlarmSend = _context.SmsResults.Any(x => ( - // x.ContractingPatyId == contractingParty.Id && - // x.Mobile == number.PhoneNumber) && (x.TypeOfSms == "اقدام قضایی" || x.TypeOfSms == "هشدار دوم")); - // if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - // number.PhoneNumber.Length == 11 && !isSend && !isLastAlarmSend) - // { - // var smsResult = _smsService.MonthlyBill(number.PhoneNumber, 412829, - // partyName, - // balanceToMoney, id, aprove); - // Thread.Sleep(1000); - // if (smsResult.IsSuccedded) - // { - // var createSmsResult = new SmsResult(smsResult.MessageId, - // smsResult.Message, typeOfSms, partyName, number.PhoneNumber, - // item.ContractingPartyId, item.Id); - // _smsResultRepository.Create(createSmsResult); - // _smsResultRepository.SaveChanges(); - // Thread.Sleep(1000); - // } - - - // } - // } - - - // } - // } - // } - // } - // } - // } - // } - // catch (Exception e) - // { - - - // string name = item.ContractingPartyName.Length > 18 ? item.ContractingPartyName.Substring(0, 18) : item.ContractingPartyName; - // string errMess = $"{name}-خطا"; - // _smsService.Alarm("09114221321", errMess); - // _logger.LogError(e, "BlueWarningSms"); - // } - // } - //} - #endregion + #region LegalActionSms diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs new file mode 100644 index 00000000..d8a5da00 --- /dev/null +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -0,0 +1,393 @@ +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, IInstitutionContractSmsServiceRepository +{ + private readonly CompanyContext _context; + private readonly ILogger _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 + /// + ///دریافت لیست پیامک قراداد های آبی بدهکار + /// + /// + public async Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting) + { + var smsList = new List(); + var institutionContracts = await _context.InstitutionContractSet.AsQueryable().Select(x => new InstitutionContractViewModel + { + Id = x.id, + ContractingPartyId = x.ContractingPartyId, + ContractingPartyName = x.ContractingPartyName, + ContractStartGr = x.ContractStartGr, + ContractStartFa = x.ContractStartFa, + ContractEndGr = x.ContractEndGr, + ContractEndFa = x.ContractEndFa, + IsActiveString = x.IsActiveString, + ContractAmountDouble = x.ContractAmount, + OfficialCompany = x.OfficialCompany, + IsInstallment = x.IsInstallment, + VerificationStatus = x.VerificationStatus, + SigningType = x.SigningType, + }).Where(x => x.IsActiveString == "blue" && + x.ContractAmountDouble > 0).GroupBy(x => x.ContractingPartyId).Select(x => x.First()).ToListAsync(); + + var institutionContractsIds = institutionContracts.Select(x => x.Id).ToList(); + + // قرارداد هایی که بطور یکجا پرداخت شده اند + var paidInFull = institutionContracts.Where(x => + x.SigningType != InstitutionContractSigningType.Legacy && x.IsInstallment == false && x.SigningType != null).ToList(); + + //حذف قراداد هایی که یکجا پرداخت شده اند از لیست ایجاد سند ماهانه + institutionContracts = institutionContracts.Except(paidInFull).ToList(); + + var contractingPartyList = await _context.PersonalContractingParties + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.id)).ToListAsync(); + + var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) + .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); + + var phoneNumberList = await _context.InstitutionContractContactInfos + .Where(x => institutionContracts.Select(ins => ins.Id).Contains(x.InstitutionContractId)) + .Where(x => x.SendSms && x.PhoneType == "شماره همراه" && !string.IsNullOrWhiteSpace(x.PhoneNumber) && + x.PhoneNumber.Length == 11).ToListAsync(); + var legalActionSentSms = await _context.SmsResults + .Where(x => x.TypeOfSms == "اقدام قضایی").AsNoTracking().ToListAsync(); + var warningSentSms = await _context.SmsResults.Where(x => x.TypeOfSms.Contains("هشدار")).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; + if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString)) + { + var hasFinancialStatement = + financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); + + var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); + + if (hasFinancialStatement && hasPhonNumber) + { + var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) + .Select(x => new CreateContactInfo + { + PhoneType = x.PhoneType, + PhoneNumber = x.PhoneNumber, + + InstitutionContractId = x.InstitutionContractId, + SendSms = x.SendSms + }).Where(x => x.PhoneNumber.Length == 11).ToList(); + + var transactions = financialStatmentList.FirstOrDefault(x => + x.ContractingPartyId == item.ContractingPartyId); + + + var debtor = transactions.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 = 608443, + 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 = 351691, + 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 = 190430, + 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 = 412829, + 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"); + } + } + + return smsList; + } +} + + diff --git a/PersonalContractingParty.Config/PersonalBootstrapper.cs b/PersonalContractingParty.Config/PersonalBootstrapper.cs index 4765fafb..24c110a5 100644 --- a/PersonalContractingParty.Config/PersonalBootstrapper.cs +++ b/PersonalContractingParty.Config/PersonalBootstrapper.cs @@ -561,6 +561,7 @@ public class PersonalBootstrapper services.AddTransient(); services.AddTransient(); + services.AddTransient(); #endregion From 5202779d9f04a7c8a79167a12567356748e2b0e6 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 12:18:01 +0330 Subject: [PATCH 06/13] changes --- ...InstitutionContractSmsServiceRepository.cs | 120 ++++++++++++++++-- ServiceHost/Program.cs | 17 +-- 2 files changed, 109 insertions(+), 28 deletions(-) diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index d8a5da00..3661fbf1 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -104,7 +104,6 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.IsActiveString == "blue" && x.ContractAmountDouble > 0).GroupBy(x => x.ContractingPartyId).Select(x => x.First()).ToListAsync(); - var institutionContractsIds = institutionContracts.Select(x => x.Id).ToList(); // قرارداد هایی که بطور یکجا پرداخت شده اند var paidInFull = institutionContracts.Where(x => @@ -126,7 +125,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.TypeOfSms == "اقدام قضایی").AsNoTracking().ToListAsync(); - var warningSentSms = await _context.SmsResults.Where(x => x.TypeOfSms.Contains("هشدار")).AsNoTracking().ToListAsync(); + var oldInstitutionContract = institutionContracts.Where(x => x.IsInstallment == false).ToList(); var electronicInstitutionContract = institutionContracts.Where(x => x.IsInstallment == true).ToList(); @@ -151,10 +150,10 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 25) partyName = $"{partyName.Substring(0, 25)}"; var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; - var isBlock = contractingParty.IsBlock == "true" ? true : false; - var isActive = contractingParty.IsActiveString == "true" ? true : false; - if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString)) - { + //var isBlock = contractingParty.IsBlock == "true" ? true : false; + //var isActive = contractingParty.IsActiveString == "true" ? true : false; + + var hasFinancialStatement = financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); @@ -180,7 +179,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.Creditor); - var id = $"{item.ContractingPartyId}"; + //var id = $"{item.ContractingPartyId}"; var aprove = $"{transactions.id}"; var balance = debtor - creditor; @@ -220,7 +219,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 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; } } diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index ee563bb8..4f707f61 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -381,22 +381,7 @@ builder.Services.AddParbad().ConfigureGateways(gateways => // فقط Serilog برای File استفاده می‌شه، کنسول از لاگر پیش‌فرض ASP.NET استفاده می‌کنه -builder.Host.UseSerilog((context, services, configuration) => -{ - var logConfig = configuration - .ReadFrom.Configuration(context.Configuration) - .ReadFrom.Services(services) - .Enrich.FromLogContext(); - - - logConfig.WriteTo.File( - path: Path.Combine(logDirectory, "gozareshgir_log.txt"), - rollingInterval: RollingInterval.Day, - retainedFileCountLimit: 30, - shared: true, - outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}" - ); -}, writeToProviders: true); // این باعث میشه کنسول پیش‌فرض هم کار کنه +builder.Host.UseSerilog(); // این باعث میشه کنسول پیش‌فرض هم کار کنه Log.Information("SERILOG STARTED SUCCESSFULLY"); From 0ab3052251852c600b1025c7ff1dc31ea5f4fab9 Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 14:04:34 +0330 Subject: [PATCH 07/13] Send Warning and leagal action Message --- .../Jobs/JobSchedulerRegistrator.cs | 219 +++--- .../IInstitutionContractRepository.cs | 8 - ...InstitutionContractSmsServiceRepository.cs | 20 +- .../InstitutionContractRepository.cs | 52 -- ...InstitutionContractSmsServiceRepository.cs | 622 +++++++++++------- 5 files changed, 501 insertions(+), 420 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index 70517f47..da463579 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -1,5 +1,6 @@ using _0_Framework.Application; +using _0_Framework.Application.Enums; using _0_Framework.Application.Sms; using Company.Domain.ContarctingPartyAgg; using Company.Domain.InstitutionContractAgg; @@ -60,146 +61,146 @@ public class JobSchedulerRegistrator // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن //); - RecurringJob.AddOrUpdate( - "InstitutionContract.SendWarningSms", - () => SendWarningSms(), - "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendLegalActionSms", - // () => SendLegalActionSms(), + // "InstitutionContract.SendWarningSms", + // () => SendWarningSms(), // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن //); + + RecurringJob.AddOrUpdate( + "InstitutionContract.SendLegalActionSms", + () => SendLegalActionSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); } - /// - /// ایجاد سند بدهی ماهیانه برای قراداد مالی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 1200)] - public async System.Threading.Tasks.Task CreateFinancialTransaction() - { - 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) - { + ///// + ///// ایجاد سند بدهی ماهیانه برای قراداد مالی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 1200)] + //public async System.Threading.Tasks.Task CreateFinancialTransaction() + //{ + // 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(); - var description = $"{monthName} {year}"; + // var month = endOfMonth.Substring(5, 2); + // var year = endOfMonth.Substring(0, 4); + // var monthName = month.ToFarsiMonthByNumber(); + // var description = $"{monthName} {year}"; - var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); + // var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); - var endNewGr = endnew.ToGeorgianDateTime(); - var endNewFa = endNewGr.ToFarsi(); + // var endNewGr = endnew.ToGeorgianDateTime(); + // var endNewFa = endNewGr.ToFarsi(); - try - { - await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); - _lastRunCreateTransaction = now; - Console.WriteLine("CreateTransAction executed"); + // try + // { + // await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); + // _lastRunCreateTransaction = now; + // Console.WriteLine("CreateTransAction executed"); - } - catch (Exception e) - { - await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + // } + // catch (Exception e) + // { + // await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - } + // } - } - } + // } + //} - /// - /// ارسال پیامک صورت حساب ماهانه - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 600)] - public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() - { - //var now = new DateTime(2025,11,21, 10,30,0); - var now = DateTime.Now; - var endOfMonth = now.ToFarsi().FindeEndOfMonth(); - var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); - _logger.LogInformation("SendFirstDayOfMonthSms job run"); - if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && - now.Date != _lastRunSendMonthlySms?.Date) - { + ///// + ///// ارسال پیامک صورت حساب ماهانه + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 600)] + //public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() + //{ + // //var now = new DateTime(2025,11,21, 10,30,0); + // var now = DateTime.Now; + // var endOfMonth = now.ToFarsi().FindeEndOfMonth(); + // var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); + // _logger.LogInformation("SendFirstDayOfMonthSms job run"); + // if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && + // now.Date != _lastRunSendMonthlySms?.Date) + // { - try - { - await _institutionContractRepository.SendMonthlySms(now); - _lastRunSendMonthlySms = now; - Console.WriteLine("Send Monthly sms executed"); + // try + // { + // await _institutionContractRepository.SendMonthlySms(now); + // _lastRunSendMonthlySms = now; + // Console.WriteLine("Send Monthly sms executed"); - } - catch (Exception e) - { - //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + // } + // catch (Exception e) + // { + // //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - } + // } - } - } + // } + //} - /// - /// ارسال پیامک یاد آور بدهی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 1200)] - public async System.Threading.Tasks.Task SendReminderSms() - { - _logger.LogInformation("SendReminderSms job run"); - await _institutionContractRepository.SendReminderSmsForBackgroundTask(); - } + ///// + ///// ارسال پیامک یاد آور بدهی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 1200)] + //public async System.Threading.Tasks.Task SendReminderSms() + //{ + // _logger.LogInformation("SendReminderSms job run"); + // await _institutionContractRepository.SendReminderSmsForBackgroundTask(); + //} - /// - /// ارسال پیامک مسدودی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task SendBlockSms() - { - _logger.LogInformation("SendBlockSms job run"); - await _institutionContractRepository.SendBlockSmsForBackgroundTask(); - } + ///// + ///// ارسال پیامک مسدودی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task SendBlockSms() + //{ + // _logger.LogInformation("SendBlockSms job run"); + // await _institutionContractRepository.SendBlockSmsForBackgroundTask(); + //} - /// - /// ارسال پیامک یادآور تایید قراداد مالی - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() - { - _logger.LogInformation("SendInstitutionContractConfirmSms job run"); - await _institutionContractRepository.SendInstitutionContractConfirmSmsTask(); - } + ///// + ///// ارسال پیامک یادآور تایید قراداد مالی + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() + //{ + // _logger.LogInformation("SendInstitutionContractConfirmSms job run"); + // await _institutionContractRepository.SendInstitutionContractConfirmSmsTask(); + //} - /// - /// ارسال پیامک هشدار - /// - /// - [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task SendWarningSms() - { - _logger.LogInformation("SendWarningSms job run"); - await _institutionContractSmsServiceRepository.SendWarningSmsTask(); - } + ///// + ///// ارسال پیامک هشدار + ///// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task SendWarningSms() + //{ + // _logger.LogInformation("SendWarningSms job run"); + // await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning); + //} [DisableConcurrentExecution(timeoutInSeconds: 100)] public async System.Threading.Tasks.Task SendLegalActionSms() { _logger.LogInformation("SendWarningSms job run"); - await _institutionContractRepository.SendLegalActionSmsTask(); + await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction); } } \ No newline at end of file diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index c576da00..97bbab67 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -165,14 +165,6 @@ public interface IInstitutionContractRepository : IRepository - /// پیامک اقدام قضائی - /// - /// - Task SendLegalActionSmsTask(); - - #endregion diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs index 32c14c5e..9d8703d4 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -10,9 +10,27 @@ public interface IInstitutionContractSmsServiceRepository : IRepository + /// اجرای تسک پیامک هشدار یا اقدام قضایی + /// + /// + /// + Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting); - Task SendWarningSmsTask(); + /// + /// دریافت لیست بدهکاران آبی جهت هشدار یا اقدام قضایی + /// + /// + /// Task> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting); + /// + /// ارسال پیامک هشدار یا اقدام قضایی + /// + /// + /// + /// + Task SendWarningOrLegalActionSms(List smsListData, TypeOfSmsSetting typeOfSmsSetting); + #endregion } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 6b624087..875e3b91 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -6285,58 +6285,6 @@ public class InstitutionContractRepository : RepositoryBase - x.DayOfMonth >= dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.LegalAction && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.LegalAction && - x.IsActive - ); - } - - if (checkAnyToExecute) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک ارسال پیامک اقدام قضائی SendLegalActionSms" + - persianNow + " - " + hour + ":" + minute); - - - } - - } - #endregion #region CustomViewModels diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index 3661fbf1..da4029cd 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -1,18 +1,22 @@ -using _0_Framework.Application.Enums; +using _0_Framework.Application; +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; using CompanyManagment.App.Contracts.InstitutionContract; +using CompanyManagment.App.Contracts.InstitutionContractContactinfo; +using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using PersianTools.Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; 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; @@ -21,15 +25,18 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase _logger; private readonly ISmsService _smsService; - public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService) : base(context) + private readonly ISmsResultRepository _smsResultRepository; + public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger logger, ISmsResultRepository smsResultRepository) : base(context) { _context = context; _smsService = smsService; + _logger = logger; + _smsResultRepository = smsResultRepository; } - #region WarningSms + #region WarninSmsAndLegalActionSms - public async Task SendWarningSmsTask() + public async Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting) { var now = DateTime.Now; @@ -51,7 +58,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase= dayOfMonth && x.TimeOfDay.Hours == hour && x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.Warning && + x.TypeOfSmsSetting == typeOfSmsSetting && x.IsActive ); } @@ -62,7 +69,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase ///دریافت لیست پیامک قراداد های آبی بدهکار /// @@ -141,237 +146,253 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase endOfContractNextMonthEnd.Date; + break; + } + + if (!string.IsNullOrWhiteSpace(contractingParty.LName) && executeCondition) + { + //Thread.Sleep(500);x.IsLegal == "حقیقی" ? $"{x.FName.Trim()} {x.LName.Trim()}" : $"{x.LName.Trim()}" + var partyName = contractingParty.IsLegal == "حقیقی" + ? $"{contractingParty.FName} {contractingParty.LName}" + : $"{contractingParty.LName}"; + if (!string.IsNullOrWhiteSpace(contractingParty.SureName)) + partyName = $"{partyName} ({contractingParty.SureName})"; if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; //var isBlock = contractingParty.IsBlock == "true" ? true : false; //var isActive = contractingParty.IsActiveString == "true" ? true : false; - - - var hasFinancialStatement = - financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); - - var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - - if (hasFinancialStatement && hasPhonNumber) - { - var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) - .Select(x => new CreateContactInfo - { - PhoneType = x.PhoneType, - PhoneNumber = x.PhoneNumber, - - InstitutionContractId = x.InstitutionContractId, - SendSms = x.SendSms - }).Where(x => x.PhoneNumber.Length == 11).ToList(); - - var transactions = financialStatmentList.FirstOrDefault(x => - x.ContractingPartyId == item.ContractingPartyId); - var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); - var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + var hasFinancialStatement = + financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); + var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - //var id = $"{item.ContractingPartyId}"; - var aprove = $"{transactions.id}"; - var balance = debtor - creditor; - - if (balance > 0) // اگر بدهکار بود + if (hasFinancialStatement && hasPhonNumber) + { + var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) + .Select(x => new CreateContactInfo { + PhoneType = x.PhoneType, + PhoneNumber = x.PhoneNumber, - if (isLegal) + 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") // حقوقی بدهکار رسمی { - if (item.OfficialCompany == "Official") // حقوقی بدهکار رسمی - { - var balanceToMoney = balance.ToMoney(); + var balanceToMoney = balance.ToMoney(); - foreach (var number in phoneNumbers) + 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); + //} - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) + smsList.Add(new SmsListData() { - - //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 - }); - } + 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 + else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی { - if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی + var balanceToMoney = balance.ToMoney(); + foreach (var number in phoneNumbers) { - var balanceToMoney = balance.ToMoney(); - foreach (var number in phoneNumbers) + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) { - 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 + }); - //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 == "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") // حقیقی بدهکار غیر رسمی + + + } + else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) { - 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); + //} - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) + smsList.Add(new SmsListData() { - //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 - }); - } + 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) @@ -397,7 +418,20 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase endOfContractNextMonthEnd.Date; + break; + } + if (!string.IsNullOrWhiteSpace(contractingParty.LName) && executeCondition) { var partyName = contractingParty.IsLegal == "حقیقی" ? $"{contractingParty.FName} {contractingParty.LName}" @@ -411,68 +445,68 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); + + var hasFinancialStatement = + financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); - var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); + 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) // اگر بدهکار بود + if (hasFinancialStatement && hasPhonNumber) + { + var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) + .Select(x => new CreateContactInfo { - var balanceToMoney = balance.ToMoney(); + PhoneType = x.PhoneType, + PhoneNumber = x.PhoneNumber, - foreach (var number in phoneNumbers) + 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() { - string publicId = transactions.PublicIdStr; - string code1 = publicId.Substring(0, 25); - string code2 = publicId.Substring(25); + PhoneNumber = number.PhoneNumber, + TemplateId = typeOfSmsSetting == TypeOfSmsSetting.Warning ? 530657 : 665145, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBillNew", + Code1 = code1, + Code2 = code2, + InstitutionContractId = item.Id + }); - - 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 - }); - - } } } - + } + } } @@ -484,6 +518,94 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase smsListData, TypeOfSmsSetting typeOfSmsSetting) + { + //ارسال پیامک با اساس لیست + + var typeOfSms = ""; + + switch (typeOfSmsSetting) + { + case TypeOfSmsSetting.Warning: + typeOfSms = "هشدار"; + break; + case TypeOfSmsSetting.LegalAction: + typeOfSms = "اقدام قضایی"; + break; + } + #region SendSMSFromList + + if (smsListData.Any() && !string.IsNullOrWhiteSpace(typeOfSms)) + { + + + // int successProcess = 1; + //int countList = smsListData.Count; + + + foreach (var item in smsListData.Take(1)) + { + try + { + if (item.TypeOfSmsMethod == "MonthlyBill") + { + var res = await _smsService.MonthlyBill("09114221321", item.TemplateId, item.PartyName, + item.Amount, + $"{item.ContractingPartyId}", item.AproveId); + + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + else + { + var res = await _smsService.MonthlyBillNew(item.PhoneNumber, item.TemplateId, item.PartyName, + item.Amount, item.Code1, item.Code2); + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + + Thread.Sleep(600); + } + catch (Exception e) + { + string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; + string errMess = $"{name}-خطا"; + _logger.LogError(errMess); + await _smsService.Alarm("09114221321", errMess); + } + + //var percent = (successProcess / (double)countList) * 100; + //await _hubContext.Clients.Group(SendSmsHub.GetGroupName(7)) + //.SendAsync("showStatus", (int)percent); + + // successProcess += 1; + } + + + + } + + #endregion + } + + #endregion + } From 8aa93e089af82a314d999154c4d51e02bc39c9ce Mon Sep 17 00:00:00 2001 From: SamSys Date: Thu, 8 Jan 2026 14:56:33 +0330 Subject: [PATCH 08/13] legal Action Sms completed --- .../InstitutionContractSmsServiceRepository.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index da4029cd..73049d4b 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -240,7 +240,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase Date: Sun, 11 Jan 2026 21:10:29 +0330 Subject: [PATCH 09/13] block and unblock --- .../Jobs/JobSchedulerRegistrator.cs | 69 +- .../IInstitutionContractRepository.cs | 23 - ...InstitutionContractSmsServiceRepository.cs | 53 +- .../SmsSettingApplication.cs | 19 +- .../InstitutionContractRepository.cs | 379 +-------- ...InstitutionContractSmsServiceRepository.cs | 727 +++++++++++++++++- 6 files changed, 844 insertions(+), 426 deletions(-) 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 } From 0d33d79620f9bf17556ff8a7599279b619909628 Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Sun, 11 Jan 2026 22:07:58 +0330 Subject: [PATCH 10/13] unblock hangfire completed --- .../Jobs/JobSchedulerRegistrator.cs | 2 +- .../InstitutionContractSmsServiceRepository.cs | 12 +++++------- .../Pages/Company/InstitutionContracts/Index.cshtml | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index 96c2cbb4..ce5f76cd 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -84,7 +84,7 @@ public class JobSchedulerRegistrator RecurringJob.AddOrUpdate( "InstitutionContract.UnBlock", () => UnBlock(), - "*/1 * * * *" + "*/10 * * * *" ); } diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index 8e5c7b0a..d8958c53 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -1234,8 +1234,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 0) - { + var jobRelation = "بابت قرارداد مابین (روابط کار)"; var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; @@ -1258,9 +1257,9 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.Creditor); var balance = debtor - creditor; - if (balance > 0) - { + var instalment = item.InstallmentList .FirstOrDefault()!.AmountDouble; @@ -1306,7 +1304,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase -

From 1c7e8824c7744024e27ba6f76e58943f47b1b61d Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Mon, 12 Jan 2026 13:10:58 +0330 Subject: [PATCH 11/13] DeActiveInstitutionEndOfContract hangfire completed --- .../Jobs/JobSchedulerRegistrator.cs | 71 +++-- ...InstitutionContractSmsServiceRepository.cs | 8 + ...InstitutionContractSmsServiceRepository.cs | 244 +++++++++++++----- 3 files changed, 232 insertions(+), 91 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index ce5f76cd..7a93180c 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -75,16 +75,22 @@ public class JobSchedulerRegistrator - RecurringJob.AddOrUpdate( - "InstitutionContract.Block", - () => Block(), - "*/30 * * * *" // هر 30 دقیقه یکبار چک کن - ); + //RecurringJob.AddOrUpdate( + // "InstitutionContract.Block", + // () => Block(), + // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + //); + + //RecurringJob.AddOrUpdate( + // "InstitutionContract.UnBlock", + // () => UnBlock(), + // "*/10 * * * *" + //); RecurringJob.AddOrUpdate( - "InstitutionContract.UnBlock", - () => UnBlock(), - "*/10 * * * *" + "InstitutionContract.DeActiveInstitutionEndOfContract", + () => DeActiveInstitutionEndOfContract(), + "*/30 * * * *" ); } @@ -220,30 +226,49 @@ public class JobSchedulerRegistrator ///

/// بلاگ سازی /// - /// + ///// + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task Block() + //{ + // _logger.LogInformation("block job run"); + // var now = DateTime.Now; + // var executeDate = now.ToFarsi().Substring(8, 2); + // if (executeDate == "20") + // { + // if (now.Hour >= 9 && now.Hour < 10) + // { + // await _institutionContractSmsServiceRepository.Block(now); + // } + + // } + //} + + //[DisableConcurrentExecution(timeoutInSeconds: 100)] + //public async System.Threading.Tasks.Task UnBlock() + //{ + // _logger.LogInformation("UnBlock job run"); + + // await _institutionContractSmsServiceRepository.UnBlock(); + + //} + [DisableConcurrentExecution(timeoutInSeconds: 100)] - public async System.Threading.Tasks.Task Block() + public async System.Threading.Tasks.Task DeActiveInstitutionEndOfContract() { - _logger.LogInformation("block job run"); + _logger.LogInformation("DeActiveInstitutionEndOfContract job run"); + + var now = DateTime.Now; var executeDate = now.ToFarsi().Substring(8, 2); - if (executeDate == "20") + if (executeDate == "01") { if (now.Hour >= 9 && now.Hour < 10) { - await _institutionContractSmsServiceRepository.Block(now); + await _institutionContractSmsServiceRepository.DeActiveInstitutionEndOfContract(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/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs index fbd199c0..b143d711 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -83,5 +83,13 @@ public interface IInstitutionContractSmsServiceRepository : IRepository Task UnBlock(); + + /// + /// غیر فعالسازی قرارداد های پایان یافته + /// + /// + /// + Task DeActiveInstitutionEndOfContract(DateTime checkDate); + #endregion } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index d8958c53..b1632dae 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -2,12 +2,13 @@ using _0_Framework.Application.Enums; using _0_Framework.Application.Sms; using _0_Framework.InfraStructure; - +using Company.Domain.ContarctingPartyAgg; using Company.Domain.InstitutionContractAgg; using Company.Domain.SmsResultAgg; using CompanyManagment.App.Contracts.Hubs; using CompanyManagment.App.Contracts.InstitutionContract; using CompanyManagment.App.Contracts.InstitutionContractContactinfo; +using CompanyManagment.EFCore.Migrations; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -18,7 +19,6 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using Company.Domain.ContarctingPartyAgg; namespace CompanyManagment.EFCore.Repository; @@ -30,6 +30,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase _hubContext; private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository; + public InstitutionContractSmsServiceRepository(CompanyContext context, ISmsService smsService, ILogger logger, ISmsResultRepository smsResultRepository, IHubContext hubContext, IPersonalContractingPartyRepository personalContractingPartyRepository) : base(context) { _context = context; @@ -999,7 +1000,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase(); - var institutionContracts = await _context.InstitutionContractSet.Where(x=>x.IsActiveString == "true") + var institutionContracts = await _context.InstitutionContractSet.Where(x => x.IsActiveString == "true") .Include(x => x.Installments) .Select(x => new InstitutionContractViewModel { @@ -1051,7 +1052,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); - + if (transactions != null) { var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); @@ -1085,7 +1086,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase public async Task UnBlock() { - var getBlockedParties =await _context.PersonalContractingParties - .Where(x => x.IsBlock == "true" && x.IsActiveString == "true").Select(x=>x.id).ToArrayAsync(); + 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)) + var institutionContracts = await _context.InstitutionContractSet.Where(x => getBlockedParties.Contains(x.ContractingPartyId)) .Include(x => x.Installments) .Select(x => new InstitutionContractViewModel { @@ -1198,7 +1199,7 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase new InstitutionContractInstallmentViewModel - { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) + { 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()) @@ -1222,48 +1223,48 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); - if (transactions != null) + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + + if (transactions != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + + var balance = debtor - creditor; + + var jobRelation = "بابت قرارداد مابین (روابط کار)"; + var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; + + + var jobRelationContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == jobRelation); + var taxAndFinancialContract = transactions.FinancialTransactionList + .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => + x.TypeOfTransaction == "debt" && x.DescriptionOption == taxAndFinancial); + + var jobRelationContractAmounts = + jobRelationContract != null ? jobRelationContract.Deptor : 0; + var taxAndFinancialContractAmounts = + taxAndFinancialContract != null ? taxAndFinancialContract.Deptor : 0; + + var sumOfAmounts = jobRelationContractAmounts * 2 + taxAndFinancialContractAmounts * 2; + if (balance < sumOfAmounts) { - var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); - var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); + var blockTime = res.BlockTimes + 1; + res.DisableBlock(blockTime); - - - var balance = debtor - creditor; - - var jobRelation = "بابت قرارداد مابین (روابط کار)"; - var taxAndFinancial = "بابت قرارداد مابین (حسابداری و مالیات)"; - - - var jobRelationContract = transactions.FinancialTransactionList - .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => - x.TypeOfTransaction == "debt" && x.DescriptionOption == jobRelation); - var taxAndFinancialContract = transactions.FinancialTransactionList - .OrderByDescending(x => x.TdateGr).FirstOrDefault(x => - x.TypeOfTransaction == "debt" && x.DescriptionOption == taxAndFinancial); - - var jobRelationContractAmounts = - jobRelationContract != null ? jobRelationContract.Deptor : 0; - var taxAndFinancialContractAmounts = - taxAndFinancialContract != null ? taxAndFinancialContract.Deptor : 0; - - var sumOfAmounts = jobRelationContractAmounts * 2 + taxAndFinancialContractAmounts * 2; - if (balance < sumOfAmounts) - { - var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); - var blockTime = res.BlockTimes + 1; - res.DisableBlock(blockTime); - - } - } + } + + - } catch (Exception e) @@ -1280,34 +1281,34 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase x.ContractingPartyId == item.ContractingPartyId); - if (transactions != null) + + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + if (transactions != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + var balance = debtor - creditor; + + + var instalment = item.InstallmentList + .FirstOrDefault()!.AmountDouble; + + var sumOfAmounts = instalment * 2; + if (balance < sumOfAmounts) { - var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); - var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); + var blockTime = res.BlockTimes + 1; + res.DisableBlock(blockTime); - var balance = debtor - creditor; - - var instalment = item.InstallmentList - .FirstOrDefault()!.AmountDouble; - - var sumOfAmounts = instalment * 2; - if (balance < sumOfAmounts) - { - var res = _personalContractingPartyRepository.Get(item.ContractingPartyId); - var blockTime = res.BlockTimes + 1; - res.DisableBlock(blockTime); - - - } - } - + } + + } catch (Exception e) { @@ -1322,9 +1323,116 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase (x.IsActiveString == "true" || x.IsActiveString == "blue") && (x.ContractEndGr.Date < checkDate.Date && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify)) + .Include(x => x.Installments) + .Select(x => new InstitutionContractViewModel + { + Id = x.id, + ContractingPartyId = x.ContractingPartyId, + ContractingPartyName = x.ContractingPartyName, + ContractStartGr = x.ContractStartGr, + ContractStartFa = x.ContractStartFa, + ContractEndGr = x.ContractEndGr, + ContractEndFa = x.ContractEndFa, + IsActiveString = x.IsActiveString, + ContractAmountDouble = x.ContractAmount, + OfficialCompany = x.OfficialCompany, + IsInstallment = x.IsInstallment, + VerificationStatus = x.VerificationStatus, + SigningType = x.SigningType, + InstallmentList = x.Installments + .Select(ins => new InstitutionContractInstallmentViewModel + { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) + .OrderBy(ins => ins.InstallmentDateGr).Skip(1).ToList(), + }).ToListAsync(); + + // قرارداد هایی که بطور یکجا پرداخت شده اند + var paidInFull = institutionContracts.Where(x => + x.SigningType != InstitutionContractSigningType.Legacy && x.IsInstallment == false && x.SigningType != null).ToList(); + + //حذف قراداد هایی که یکجا پرداخت شده اند از لیست ایجاد سند ماهانه + institutionContracts = institutionContracts.Except(paidInFull).ToList(); + + + var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) + .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); + //قرارداد های جاری فعال + var currentActiveContracts = await _context.InstitutionContractSet.Where(x => + x.ContractEndGr.Date > checkDate.Date && x.IsActiveString == "true" && + x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify).ToListAsync(); + + + + var institutionContractIds = institutionContracts.Select(x => x.Id).ToList(); + var queryableContracts =await _context.InstitutionContractSet.Where(x => institutionContractIds.Contains(x.id)).ToListAsync(); + foreach (var item in institutionContracts) + { + try + { + var existContractAfterThis = currentActiveContracts.Any(x => + x.ContractingPartyId == item.ContractingPartyId); + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + var contract = queryableContracts.FirstOrDefault(x => x.id == item.Id); + if (transactions != null && contract != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + + var balance = debtor - creditor; + + + if (balance > 0) + { + if (existContractAfterThis) // اگر بعد از این قراداد مالی قراردادی داشت حتی اگر بدهکار بود فقط غیرفعالش کن + contract.DeActive(); + else // اگر نداشت غیر فعال آبیش کن + contract.DeActiveBlue(); + + } + else // اگر بدهکار نبود چه بعدش قرارداد مالی داشت چه نداشت غیرفعال کن + { + contract.DeActive(); + + } + + await _context.SaveChangesAsync(); + if (!existContractAfterThis) // اگر بعد از این قراداد مالی قرادادی نداشت همه وابستگی ها را غیر فعال کن + { + await _personalContractingPartyRepository.DeActiveAllAsync(item.ContractingPartyId); + Thread.Sleep(500); + } + } + + + + + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } } #endregion + + + } From 77dbb505129584aba3171bf8186d548b1cf077f1 Mon Sep 17 00:00:00 2001 From: gozareshgir Date: Mon, 12 Jan 2026 14:32:50 +0330 Subject: [PATCH 12/13] BlueDeActiveAfterZeroDebt hangfire completed --- .../Jobs/JobSchedulerRegistrator.cs | 386 ++++----- .../IInstitutionContractRepository.cs | 37 +- ...InstitutionContractSmsServiceRepository.cs | 52 +- .../SmsSettingApplication.cs | 4 +- .../InstitutionContractRepository.cs | 699 +---------------- ...InstitutionContractSmsServiceRepository.cs | 740 ++++++++++++++++++ 6 files changed, 1004 insertions(+), 914 deletions(-) diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs index 7a93180c..7395e737 100644 --- a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs +++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs @@ -32,226 +32,245 @@ public class JobSchedulerRegistrator public void Register() { - //_logger.LogInformation("hangfire Started"); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.CreateFinancialTransaction", - // () => CreateFinancialTransaction(), - // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن - //); + _logger.LogInformation("hangfire Started"); + RecurringJob.AddOrUpdate( + "InstitutionContract.CreateFinancialTransaction", + () => CreateFinancialTransaction(), + "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendMonthlySms", - // () => SendFirstDayOfMonthSms(), - // "*/20 * * * *" // هر 30 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendMonthlySms", + () => SendFirstDayOfMonthSms(), + "*/20 * * * *" // هر 30 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendReminderSms", - // () => SendReminderSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendBlockSms", - // () => SendBlockSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendInstitutionContractConfirmSms", - // () => SendInstitutionContractConfirmSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendReminderSms", + () => SendReminderSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendBlockSms", + () => SendBlockSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendInstitutionContractConfirmSms", + () => SendInstitutionContractConfirmSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendWarningSms", - // () => SendWarningSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendWarningSms", + () => SendWarningSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.SendLegalActionSms", - // () => SendLegalActionSms(), - // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.SendLegalActionSms", + () => SendLegalActionSms(), + "*/1 * * * *" // هر 1 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.Block", - // () => Block(), - // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.Block", + () => Block(), + "*/30 * * * *" // هر 30 دقیقه یکبار چک کن + ); - //RecurringJob.AddOrUpdate( - // "InstitutionContract.UnBlock", - // () => UnBlock(), - // "*/10 * * * *" - //); + RecurringJob.AddOrUpdate( + "InstitutionContract.UnBlock", + () => UnBlock(), + "*/10 * * * *" + ); RecurringJob.AddOrUpdate( "InstitutionContract.DeActiveInstitutionEndOfContract", () => DeActiveInstitutionEndOfContract(), - "*/30 * * * *" + "*/30 * * * *" + ); + + RecurringJob.AddOrUpdate( + "InstitutionContract.BlueDeActiveAfterZeroDebt", + () => BlueDeActiveAfterZeroDebt(), + "*/10 * * * *" ); } - ///// - ///// ایجاد سند بدهی ماهیانه برای قراداد مالی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 1200)] - //public async System.Threading.Tasks.Task CreateFinancialTransaction() - //{ - // 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) - // { + /// + /// ایجاد سند بدهی ماهیانه برای قراداد مالی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 1200)] + public async System.Threading.Tasks.Task CreateFinancialTransaction() + { + 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(); - // var description = $"{monthName} {year}"; + var month = endOfMonth.Substring(5, 2); + var year = endOfMonth.Substring(0, 4); + var monthName = month.ToFarsiMonthByNumber(); + var description = $"{monthName} {year}"; - // var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); + var endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth(); - // var endNewGr = endnew.ToGeorgianDateTime(); - // var endNewFa = endNewGr.ToFarsi(); + var endNewGr = endnew.ToGeorgianDateTime(); + var endNewFa = endNewGr.ToFarsi(); - // try - // { - // await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); - // _lastRunCreateTransaction = now; - // Console.WriteLine("CreateTransAction executed"); + try + { + await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description); + _lastRunCreateTransaction = now; + Console.WriteLine("CreateTransAction executed"); - // } - // catch (Exception e) - // { - // await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + } + catch (Exception e) + { + await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - // } + } - // } - //} + } + } - ///// - ///// ارسال پیامک صورت حساب ماهانه - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 600)] - //public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() - //{ - // //var now = new DateTime(2025,11,21, 10,30,0); - // var now = DateTime.Now; - // var endOfMonth = now.ToFarsi().FindeEndOfMonth(); - // var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); - // _logger.LogInformation("SendFirstDayOfMonthSms job run"); - // if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && - // now.Date != _lastRunSendMonthlySms?.Date) - // { + /// + /// ارسال پیامک صورت حساب ماهانه + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 600)] + public async System.Threading.Tasks.Task SendFirstDayOfMonthSms() + { + //var now = new DateTime(2025,11,21, 10,30,0); + var now = DateTime.Now; + var endOfMonth = now.ToFarsi().FindeEndOfMonth(); + var endOfMonthGr = endOfMonth.ToGeorgianDateTime(); + _logger.LogInformation("SendFirstDayOfMonthSms job run"); + if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 && + now.Date != _lastRunSendMonthlySms?.Date) + { - // try - // { - // await _institutionContractRepository.SendMonthlySms(now); - // _lastRunSendMonthlySms = now; - // Console.WriteLine("Send Monthly sms executed"); + try + { + await _institutionContractSmsServiceRepository.SendMonthlySms(now); + _lastRunSendMonthlySms = now; + Console.WriteLine("Send Monthly sms executed"); - // } - // catch (Exception e) - // { - // //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); + } + catch (Exception e) + { + //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی"); - // } + } - // } - //} + } + } - ///// - ///// ارسال پیامک یاد آور بدهی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 1200)] - //public async System.Threading.Tasks.Task SendReminderSms() - //{ - // _logger.LogInformation("SendReminderSms job run"); - // await _institutionContractRepository.SendReminderSmsForBackgroundTask(); - //} + /// + /// ارسال پیامک یاد آور بدهی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 1200)] + public async System.Threading.Tasks.Task SendReminderSms() + { + _logger.LogInformation("SendReminderSms job run"); + await _institutionContractSmsServiceRepository.SendReminderSmsForBackgroundTask(); + } - ///// - ///// ارسال پیامک مسدودی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task SendBlockSms() - //{ - // _logger.LogInformation("SendBlockSms job run"); - // await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask(); - //} + /// + /// ارسال پیامک مسدودی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task SendBlockSms() + { + _logger.LogInformation("SendBlockSms job run"); + await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask(); + } - ///// - ///// ارسال پیامک یادآور تایید قراداد مالی - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() - //{ - // _logger.LogInformation("SendInstitutionContractConfirmSms job run"); - // await _institutionContractRepository.SendInstitutionContractConfirmSmsTask(); - //} + /// + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms() + { + _logger.LogInformation("SendInstitutionContractConfirmSms job run"); + await _institutionContractSmsServiceRepository.SendInstitutionContractConfirmSmsTask(); + } - ///// - ///// ارسال پیامک هشدار - ///// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task SendWarningSms() - //{ - // _logger.LogInformation("SendWarningSms job run"); - // await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning); - //} + /// + /// ارسال پیامک هشدار + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task SendWarningSms() + { + _logger.LogInformation("SendWarningSms job run"); + 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() + { + _logger.LogInformation("SendWarningSms job run"); + await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction); + } /// /// بلاگ سازی /// - ///// - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task Block() - //{ - // _logger.LogInformation("block job run"); - // var now = DateTime.Now; - // var executeDate = now.ToFarsi().Substring(8, 2); - // if (executeDate == "20") - // { - // if (now.Hour >= 9 && now.Hour < 10) - // { - // await _institutionContractSmsServiceRepository.Block(now); - // } + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task Block() + { + _logger.LogInformation("block job run"); + var now = DateTime.Now; + var executeDate = now.ToFarsi().Substring(8, 2); + if (executeDate == "20") + { + if (now.Hour >= 9 && now.Hour < 10) + { + await _institutionContractSmsServiceRepository.Block(now); + } - // } - //} + } + } - //[DisableConcurrentExecution(timeoutInSeconds: 100)] - //public async System.Threading.Tasks.Task UnBlock() - //{ - // _logger.LogInformation("UnBlock job run"); - - // await _institutionContractSmsServiceRepository.UnBlock(); - - //} + /// + /// آنبلاک + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 100)] + public async System.Threading.Tasks.Task UnBlock() + { + _logger.LogInformation("UnBlock job run"); + await _institutionContractSmsServiceRepository.UnBlock(); + + } + + + /// + /// غیر فعال سازی قراداد های پایان یافته + /// + /// [DisableConcurrentExecution(timeoutInSeconds: 100)] public async System.Threading.Tasks.Task DeActiveInstitutionEndOfContract() { @@ -266,9 +285,20 @@ public class JobSchedulerRegistrator { await _institutionContractSmsServiceRepository.DeActiveInstitutionEndOfContract(now); } - + } - + + } + + /// + /// غیرفعال سازس قرارداد های آبی که بدهی ندارند + /// + /// + [DisableConcurrentExecution(timeoutInSeconds: 800)] + public async System.Threading.Tasks.Task BlueDeActiveAfterZeroDebt() + { + _logger.LogInformation("BlueDeActiveAfterZeroDebt job run"); + await _institutionContractSmsServiceRepository.BlueDeActiveAfterZeroDebt(); } } \ No newline at end of file diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 97325103..48d94271 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -91,42 +91,7 @@ public interface IInstitutionContractRepository : IRepository> PrintAllAsync(List ids); - #region ReminderSMS - /// - /// دریافت لیست - ارسال پیامک - /// فراخوانی از سمت بک گراند سرویس - /// - /// - Task SendReminderSmsForBackgroundTask(); - - /// - /// ارسال پیامک صورت حساب ماهانه - /// - /// - /// - Task SendMonthlySms(DateTime now); - - - - /// - ///دریافت لیست بدهکارن - /// جهت ارسال پیامک - /// - /// - Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting); - - /// - /// ارسال پیامک های یاد آور بدهی - /// - /// - Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, string sendMessStart, string sendMessEnd); - - /// - /// ارسال پیامک یادآور تایید قراداد مالی - /// - /// - Task SendInstitutionContractConfirmSmsTask(); - #endregion + #region CreateMontlyTransaction diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs index b143d711..cef62c5d 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractSmsServiceRepository.cs @@ -9,6 +9,16 @@ namespace Company.Domain.InstitutionContractAgg; public interface IInstitutionContractSmsServiceRepository : IRepository { + #region reminderSMs + + + /// + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + Task SendInstitutionContractConfirmSmsTask(); + #endregion + //هشدار و اقدام قضایی #region WarningOrLegalActionSmsListData /// @@ -35,7 +45,8 @@ public interface IInstitutionContractSmsServiceRepository : IRepository @@ -91,5 +102,44 @@ public interface IInstitutionContractSmsServiceRepository : IRepository Task DeActiveInstitutionEndOfContract(DateTime checkDate); + /// + /// غیرفعال سازس قرارداد های آبی که بدهی ندارند + /// + /// + Task BlueDeActiveAfterZeroDebt(); + #endregion + + + #region ReminderSMS + + /// + /// دریافت لیست - ارسال پیامک + /// فراخوانی از سمت بک گراند سرویس + /// + /// + Task SendReminderSmsForBackgroundTask(); + + /// + /// ارسال پیامک صورت حساب ماهانه + /// + /// + /// + Task SendMonthlySms(DateTime now); + + + + /// + ///دریافت لیست بدهکارن + /// جهت ارسال پیامک + /// + /// + Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting); + + /// + /// ارسال پیامک های یاد آور بدهی + /// + /// + Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, string sendMessStart, string sendMessEnd); + #endregion } \ No newline at end of file diff --git a/CompanyManagment.Application/SmsSettingApplication.cs b/CompanyManagment.Application/SmsSettingApplication.cs index 9666fb2f..203a9e23 100644 --- a/CompanyManagment.Application/SmsSettingApplication.cs +++ b/CompanyManagment.Application/SmsSettingApplication.cs @@ -119,7 +119,7 @@ public class SmsSettingApplication : ISmsSettingApplication public async Task> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting) { - return await _institutionContractRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting); + return await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting); } public async Task> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting) @@ -137,7 +137,7 @@ public class SmsSettingApplication : ISmsSettingApplication if (command.Any()) { - await _institutionContractRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd); + await _institutionContractSmsServiceRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd); return op.Succcedded(); } else diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 4e578cbe..234c4461 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -3562,623 +3562,10 @@ public class InstitutionContractRepository : RepositoryBase - /// دریافت لیست - ارسال پیامک - /// فراخوانی از سمت بک گراند سرویس - /// - /// - public async Task SendReminderSmsForBackgroundTask() - { - var now = DateTime.Now; - // تبدیل تاریخ میلادی به شمسی - var persianNow = now.ToFarsi(); - var persianEndOfMonth = int.Parse(persianNow.FindeEndOfMonth().Substring(8, 2)); - var dayOfMonth = int.Parse(persianNow.Substring(8, 2)); - var hour = now.Hour; - var minute = now.Minute; - var checkAnyToExecute = false; - - //اگر آخرین روز ماه باشد - //اگر روز مثلا عدد روز 31 بود ولی آخرین روز ماه 30 بود - if (dayOfMonth == persianEndOfMonth) - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth >= dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder && - x.IsActive - ); - } - - - if (checkAnyToExecute) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک پیامک های یاد آور SendReminderSmsForBackgroundTask" + persianNow + " - " + - hour + ":" + minute); - //دریافت لیست بدهکاران - var smsListData = await GetSmsListData(now, TypeOfSmsSetting.InstitutionContractDebtReminder); - string typeOfSms = "یادآور بدهی ماهانه"; - string sendMessStart = "شروع پیامک یادآور"; - string sendMessEnd = "پایان پیامک یادآور"; - //ارسال پیامک - await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); - - - Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); - return true; - } - - return false; - } - #endregion - - //ماهانه - #region MonthlySms - - /// - /// ارسال پیامک صورت حساب ماهانه - /// - /// - /// - public async Task SendMonthlySms(DateTime now) - { - //دریافت لیست بدهکاران - var smsListData = await GetSmsListData(now, TypeOfSmsSetting.MonthlyInstitutionContract); - - string typeOfSms = "صورت حساب ماهانه"; - string sendMessStart = "شروع پیامک ماهانه"; - string sendMessEnd = "پایان پیامک ماهانه"; - //ارسال پیامک - await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); - } - - #endregion - - - - //دریافت لیست بدهکاران و ارسال پیامک - #region GetListAndSendSmsMethods - - /// - ///دریافت لیست بدهکارن - /// جهت ارسال پیامک - /// - /// - public async Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting) - { - var watch = new Stopwatch(); - var smsList = new List(); - var currentMonthStart = ($"{(checkDate.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); - var previusMonthEnd = currentMonthStart.AddDays(-1); - var previusMonthStart = ($"{(previusMonthEnd.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); - - watch.Start(); - //دریافت اطلاعات بدهکارن و ساخت لیست پیامک - - #region GetSmsListData - - //var rollcallServiceList = _context.RollCallServices.Where(x => x.StartService.Date <= previusMonthStart.Date && x.EndService.Date >= previusMonthEnd.Date).ToList(); - var institutionContracts = await _context.InstitutionContractSet.AsSplitQuery() - .Include(x => x.Installments) - .Select(x => - new InstitutionContractViewModel - { - Id = x.id, - ContractingPartyId = x.ContractingPartyId, - ContractingPartyName = x.ContractingPartyName, - ContractStartGr = x.ContractStartGr, - ContractStartFa = x.ContractStartFa, - ContractEndGr = x.ContractEndGr, - ContractEndFa = x.ContractEndFa, - IsActiveString = x.IsActiveString, - ContractAmountDouble = x.ContractAmount, - OfficialCompany = x.OfficialCompany, - IsInstallment = x.IsInstallment, - VerificationStatus = x.VerificationStatus, - SigningType = x.SigningType, - InstallmentList = x.Installments - .Select(ins => new InstitutionContractInstallmentViewModel - { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) - .OrderBy(ins => ins.InstallmentDateGr).Skip(1).ToList(), - }).Where(x => x.ContractStartGr < checkDate && x.ContractEndGr >= checkDate && - x.ContractAmountDouble > 0 && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify) - .GroupBy(x => x.ContractingPartyId).Select(x => x.First()) - .ToListAsync(); - // قرارداد هایی که بطور یکجا پرداخت شده اند - var paidInFull = institutionContracts.Where(x => - x.SigningType != InstitutionContractSigningType.Legacy && x.IsInstallment == false && x.SigningType != null).ToList(); - - //حذف قراداد هایی که یکجا پرداخت شده اند از لیست ایجاد سند ماهانه - institutionContracts = institutionContracts.Except(paidInFull).ToList(); - - var contractingPartyList = await _context.PersonalContractingParties - .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.id)).ToListAsync(); - - var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() - .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) - .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); - - var phoneNumberList = await _context.InstitutionContractContactInfos - .Where(x => institutionContracts.Select(ins => ins.Id).Contains(x.InstitutionContractId)) - .Where(x => x.SendSms && x.PhoneType == "شماره همراه" && !string.IsNullOrWhiteSpace(x.PhoneNumber) && - x.PhoneNumber.Length == 11).ToListAsync(); - - Console.WriteLine("database query: " + watch.Elapsed); - watch.Stop(); - watch.Start(); - - //var a = new FinancialInvoice(balance, item.ContractingPartyId, ""); - //var b = new FinancialInvoiceItem("", balance, a.id, FinancialInvoiceItemType.PreviousDebt, - // 0); - //a.AddItem(b); - //_context.Add(a); - var oldInstitutionContract = institutionContracts.Where(x => x.IsInstallment == false).ToList(); - var electronicInstitutionContract = institutionContracts.Where(x => x.IsInstallment == true).ToList(); - foreach (var item in oldInstitutionContract) - { - try - { - var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); - //var isSend = sendedSms.Any(x => x.ContractingPatyId == contractingParty.Id); - if (!string.IsNullOrWhiteSpace(contractingParty.LName)) - { - //Thread.Sleep(500); - var partyName = contractingParty.IsLegal == "حقیقی" - ? $"{contractingParty.FName} {contractingParty.LName}" - : $"{contractingParty.LName}"; - if (!string.IsNullOrWhiteSpace(contractingParty.SureName)) - partyName = $"{partyName} ({contractingParty.SureName})"; - - if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; - - var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; - var isBlock = contractingParty.IsBlock == "true" ? true : false; - var isActive = contractingParty.IsActiveString == "true" ? true : false; - if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) - { - var hasFinancialStatement = - financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); - - - var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - - - if (hasFinancialStatement && hasPhonNumber) - { - var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) - .Select(x => new CreateContactInfo - { - PhoneType = x.PhoneType, - PhoneNumber = x.PhoneNumber, - - InstitutionContractId = x.InstitutionContractId, - SendSms = x.SendSms - }).Where(x => x.PhoneNumber.Length == 11).ToList(); - - var transactions = financialStatmentList.FirstOrDefault(x => - x.ContractingPartyId == item.ContractingPartyId); - - var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); - var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); - - - var id = $"{item.ContractingPartyId}"; - var aprove = $"{transactions.id}"; - var balance = debtor - creditor; - - - - if (balance > 0) // اگر بدهکار بود - { - //var employers = _context.Employers.Where(x => x.ContractingPartyId == item.ContractingPartyId) - // .Select(x => x.id); - //var workshops = _context.WorkshopEmployers.Where(x => employers.Contains(x.EmployerId)) - // .Select(x => x.WorkshopId).Distinct().ToList(); - - - //var services = - // rollcallServiceList.Where(x => workshops.Contains(x.WorkshopId)).ToList(); - - //var hasRollCallService = services.Count > 0; - - //موقت - var hasRollCallService = false; - - //if (hasRollCallService) - //{ - // var employees = - // _context.RollCallEmployees.Where(x => workshops.Contains(x.WorkshopId)) - // .Select(x => x.id); - - // var employeeCount = _context.RollCallEmployeesStatus - // .Where(x => employees.Contains(x.RollCallEmployeeId)) - // .Count(x => x.EndDate.Date == activeStatusDate.Date); - - // if (employeeCount == 0) - // hasRollCallService = false; - //} - - if (isLegal) - { - if (item.OfficialCompany == "Official") // حقوقی بدهکار رسمی - { - var balanceToMoney = balance.ToMoney(); - - foreach (var number in phoneNumbers) - { - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) - { - - var templateId = 161233; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 394006; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - PartyName = partyName, - Amount = balanceToMoney, - ContractingPartyId = contractingParty.id, - AproveId = aprove, - TypeOfSmsMethod = "MonthlyBill", - Code1 = "", - Code2 = "", - InstitutionContractId = item.Id - }); - - } - } - } - else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی - { - var balanceToMoney = balance.ToMoney(); - foreach (var number in phoneNumbers) - { - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) - { - - var templateId = 347415; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 679068; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - PartyName = partyName, - Amount = balanceToMoney, - ContractingPartyId = contractingParty.id, - AproveId = aprove, - TypeOfSmsMethod = "MonthlyBill", - Code1 = "", - Code2 = "", - InstitutionContractId = item.Id - }); - - } - } - } - } - else - { - if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی - { - var balanceToMoney = balance.ToMoney(); - - foreach (var number in phoneNumbers) - { - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) - { - - var templateId = 998180; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 646040; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - PartyName = partyName, - Amount = balanceToMoney, - ContractingPartyId = contractingParty.id, - AproveId = aprove, - TypeOfSmsMethod = "MonthlyBill", - Code1 = "", - Code2 = "", - InstitutionContractId = item.Id - }); - - } - } - } - else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی - { - var balanceToMoney = balance.ToMoney(); - - foreach (var number in phoneNumbers) - { - if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && - number.PhoneNumber.Length == 11) - { - - - var templateId = 810539; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 566537; - } - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - PartyName = partyName, - Amount = balanceToMoney, - ContractingPartyId = contractingParty.id, - AproveId = aprove, - TypeOfSmsMethod = "MonthlyBill", - Code1 = "", - Code2 = "", - InstitutionContractId = item.Id - }); - - } - } - } - } - } - - - phoneNumbers = new List(); - } - } - } - } - catch (Exception e) - { - string name = item.ContractingPartyName.Length > 18 - ? item.ContractingPartyName.Substring(0, 18) - : item.ContractingPartyName; - string errMess = $"{name}-خطا"; - // _smsService.Alarm("09114221321", errMess); - } - } - - foreach (var item in electronicInstitutionContract) - { - try - { - var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); - if (!string.IsNullOrWhiteSpace(contractingParty.LName)) - { - var partyName = contractingParty.IsLegal == "حقیقی" - ? $"{contractingParty.FName} {contractingParty.LName}" - : $"{contractingParty.LName}"; - if (!string.IsNullOrWhiteSpace(contractingParty.SureName)) - partyName = $"{partyName} ({contractingParty.SureName})"; - - if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; - - var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; - var isBlock = contractingParty.IsBlock == "true" ? true : false; - var isActive = contractingParty.IsActiveString == "true" ? true : false; - - if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) - { - var hasFinancialStatement = - financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); - - - var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); - - if (hasFinancialStatement && hasPhonNumber) - { - var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) - .Select(x => new CreateContactInfo - { - PhoneType = x.PhoneType, - PhoneNumber = x.PhoneNumber, - - InstitutionContractId = x.InstitutionContractId, - SendSms = x.SendSms - }).Where(x => x.PhoneNumber.Length == 11).ToList(); - - var transactions = financialStatmentList.FirstOrDefault(x => - x.ContractingPartyId == item.ContractingPartyId); - - var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); - var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); - - - var id = $"{item.ContractingPartyId}"; - var aprove = $"{transactions.id}"; - var balance = debtor - creditor; - int templateId = 0; - //انتخاب قالب پیامک بر اساس حقیق/حقوقی - if (isLegal) - { - templateId = 789638; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 983035; - } - } - else - { - templateId = 768277; - if (typeOfSmsSetting == - TypeOfSmsSetting.MonthlyInstitutionContract) - { - templateId = 479624; - } - } - - if (balance > 0) // اگر بدهکار بود - { - var balanceToMoney = balance.ToMoney(); - - foreach (var number in phoneNumbers) - { - string publicId = transactions.PublicIdStr; - string code1 = publicId.Substring(0, 25); - string code2 = publicId.Substring(25); - - - smsList.Add(new SmsListData() - { - PhoneNumber = number.PhoneNumber, - TemplateId = templateId, - PartyName = partyName, - Amount = balanceToMoney, - ContractingPartyId = contractingParty.id, - AproveId = aprove, - TypeOfSmsMethod = "MonthlyBillNew", - Code1 = code1, - Code2 = code2, - InstitutionContractId = item.Id - }); - - } - } - } - } - } - - } - catch (Exception e) - { - _logger.LogError($"ContractingPartyId : {item.ContractingPartyId} - ContractingPartyName : {item.ContractingPartyName} - InstitutionContractId : {item.Id} خطای دریافت لیست بدهکاران "); - throw; - } - } - - - #endregion - - Console.WriteLine("SmsListData: " + watch.Elapsed); - return smsList; - } - - - - /// - /// ارسال پیامک های یاد آور بدهی - /// - /// - public async Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, - string sendMessStart, string sendMessEnd) - { - //ارسال پیامک با اساس لیست - - #region SendSMSFromList - - if (smsListData.Any()) - { - //await _smsService.Alarm("09114221321", sendMessStart); - //Thread.Sleep(1000); - //await _smsService.Alarm("09111485044", sendMessStart); - //Thread.Sleep(1000); - - int successProcess = 1; - int countList = smsListData.Count; - - - foreach (var item in smsListData) - { - try - { - if (item.TypeOfSmsMethod == "MonthlyBill") - { - var res = await _smsService.MonthlyBill(item.PhoneNumber, item.TemplateId, item.PartyName, - item.Amount, - $"{item.ContractingPartyId}", item.AproveId); - - if (res.isSucceded) - { - var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, - res.message, typeOfSms, item.PartyName, item.PhoneNumber, - item.ContractingPartyId, item.InstitutionContractId); - - await _smsResultRepository.CreateAsync(createSmsResult); - await _smsResultRepository.SaveChangesAsync(); - } - } - else - { - var res = await _smsService.MonthlyBillNew(item.PhoneNumber, item.TemplateId, item.PartyName, - item.Amount, item.Code1, item.Code2); - if (res.isSucceded) - { - var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, - res.message, typeOfSms, item.PartyName, item.PhoneNumber, - item.ContractingPartyId, item.InstitutionContractId); - - await _smsResultRepository.CreateAsync(createSmsResult); - await _smsResultRepository.SaveChangesAsync(); - } - } - - Thread.Sleep(600); - } - catch (Exception e) - { - string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; - string errMess = $"{name}-خطا"; - _logger.LogError(errMess); - await _smsService.Alarm("09114221321", errMess); - } - - var percent = (successProcess / (double)countList) * 100; - await _hubContext.Clients.Group(SendSmsHub.GetGroupName(7)) - .SendAsync("showStatus", (int)percent); - - successProcess += 1; - } - - - //await _smsService.Alarm("09114221321", sendMessEnd); - //Thread.Sleep(1000); - //await _smsService.Alarm("09111485044", sendMessEnd); - } - - #endregion - } - - #endregion + #region PrivateMetods @@ -4224,89 +3611,7 @@ public class InstitutionContractRepository : RepositoryBase - /// ارسال پیامک یادآور تایید قراداد مالی - /// - /// - public async Task SendInstitutionContractConfirmSmsTask() - { - var now = DateTime.Now; - - - // تبدیل تاریخ میلادی به شمسی - var persianNow = now.ToFarsi(); - var persianEndOfMonth = int.Parse(persianNow.FindeEndOfMonth().Substring(8, 2)); - var dayOfMonth = int.Parse(persianNow.Substring(8, 2)); - var hour = now.Hour; - var minute = now.Minute; - var checkAnyToExecute = false; - - //اگر آخرین روز ماه باشد - //اگر روز مثلا عدد روز 31 بود ولی آخرین روز ماه 30 بود - if (dayOfMonth == persianEndOfMonth) - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth >= dayOfMonth && /// اگر بزرگتر یا مساوی رو جاری بود - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractConfirm && - x.IsActive - ); - } - else - { - checkAnyToExecute = await _context.SmsSettings - .AnyAsync(x => - x.DayOfMonth == dayOfMonth && - x.TimeOfDay.Hours == hour && - x.TimeOfDay.Minutes == minute && - x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractConfirm && - x.IsActive - ); - } - - - if (checkAnyToExecute) - { - //اجرای تسک - _logger.LogInformation("اجرای تسک ارسال یاد آور تایید قراداد مالی SendInstitutionContractConfirmSms" + - persianNow + " - " + hour + ":" + minute); - //دریافت لیست قراداد های تایید نشده - var fromAmonthAgo = now.AddDays(-30); - var pendingContracts = await _context.InstitutionContractSet - .Where(x => x.CreationDate >= fromAmonthAgo && x.CreationDate.Date != now.Date && - x.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify) - .Join(_context.PersonalContractingParties, - contract => contract.ContractingPartyId, - contractingParty => contractingParty.id, - (contract, contractingParty) => new { contract, contractingParty }).Select(x => - new InstitutionCreationVerificationSmsDto - { - Number = x.contractingParty.Phone, - FullName = x.contractingParty.IsLegal == "حقیقی" - ? $"{x.contractingParty.FName} {x.contractingParty.LName}" - : $"{x.contractingParty.LName}", - ContractingPartyId = x.contract.ContractingPartyId, - InstitutionContractId = x.contract.id, - InstitutionId = x.contract.PublicId, - }).ToListAsync(); - - string typeOfSms = "یادآور تایید قرارداد مالی"; - foreach (var item in pendingContracts) - { - var sendResult = await _smsService.SendInstitutionCreationVerificationLink(item.Number, item.FullName, - item.InstitutionId, item.ContractingPartyId, item.InstitutionContractId, typeOfSms); - Thread.Sleep(1000); - } - - Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); - } - } - - #endregion + diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs index b1632dae..ef8b77e1 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractSmsServiceRepository.cs @@ -15,6 +15,7 @@ using Microsoft.Extensions.Logging; using PersianTools.Core; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; @@ -1418,6 +1419,59 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + await _smsService.Alarm("09114221321", errMess); + } + } + } + + + public async Task BlueDeActiveAfterZeroDebt() + { + var institutionContracts =await _context.InstitutionContractSet + .Where(x => x.IsActiveString == "blue").ToListAsync(); + + var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) + .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0) + .ToListAsync(); + + foreach (var item in institutionContracts) + { + try + { + + + var transactions = + financialStatmentList.FirstOrDefault(x => x.ContractingPartyId == item.ContractingPartyId); + + if (transactions != null) + { + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + + var balance = debtor - creditor; + + + if (balance <= 0) + { + + item.DeActive(); + await _context.SaveChangesAsync(); + + } + + + } + } catch (Exception e) { @@ -1431,7 +1485,693 @@ public class InstitutionContractSmsServiceRepository : RepositoryBase + /// ارسال پیامک یادآور تایید قراداد مالی + /// + /// + public async Task SendInstitutionContractConfirmSmsTask() + { + var now = DateTime.Now; + + + // تبدیل تاریخ میلادی به شمسی + var persianNow = now.ToFarsi(); + var persianEndOfMonth = int.Parse(persianNow.FindeEndOfMonth().Substring(8, 2)); + var dayOfMonth = int.Parse(persianNow.Substring(8, 2)); + var hour = now.Hour; + var minute = now.Minute; + var checkAnyToExecute = false; + + //اگر آخرین روز ماه باشد + //اگر روز مثلا عدد روز 31 بود ولی آخرین روز ماه 30 بود + if (dayOfMonth == persianEndOfMonth) + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth >= dayOfMonth && /// اگر بزرگتر یا مساوی رو جاری بود + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractConfirm && + x.IsActive + ); + } + else + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth == dayOfMonth && + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractConfirm && + x.IsActive + ); + } + + + if (checkAnyToExecute) + { + //اجرای تسک + _logger.LogInformation("اجرای تسک ارسال یاد آور تایید قراداد مالی SendInstitutionContractConfirmSms" + + persianNow + " - " + hour + ":" + minute); + //دریافت لیست قراداد های تایید نشده + var fromAmonthAgo = now.AddDays(-30); + var pendingContracts = await _context.InstitutionContractSet + .Where(x => x.CreationDate >= fromAmonthAgo && x.CreationDate.Date != now.Date && + x.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify) + .Join(_context.PersonalContractingParties, + contract => contract.ContractingPartyId, + contractingParty => contractingParty.id, + (contract, contractingParty) => new { contract, contractingParty }).Select(x => + new InstitutionCreationVerificationSmsDto + { + Number = x.contractingParty.Phone, + FullName = x.contractingParty.IsLegal == "حقیقی" + ? $"{x.contractingParty.FName} {x.contractingParty.LName}" + : $"{x.contractingParty.LName}", + ContractingPartyId = x.contract.ContractingPartyId, + InstitutionContractId = x.contract.id, + InstitutionId = x.contract.PublicId, + }).ToListAsync(); + + string typeOfSms = "یادآور تایید قرارداد مالی"; + foreach (var item in pendingContracts) + { + var sendResult = await _smsService.SendInstitutionCreationVerificationLink(item.Number, item.FullName, + item.InstitutionId, item.ContractingPartyId, item.InstitutionContractId, typeOfSms); + Thread.Sleep(1000); + } + + Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); + } + } + + #endregion + + #region ReminderSMS + /// + /// دریافت لیست - ارسال پیامک + /// فراخوانی از سمت بک گراند سرویس + /// + /// + public async Task SendReminderSmsForBackgroundTask() + { + var now = DateTime.Now; + + + // تبدیل تاریخ میلادی به شمسی + var persianNow = now.ToFarsi(); + var persianEndOfMonth = int.Parse(persianNow.FindeEndOfMonth().Substring(8, 2)); + var dayOfMonth = int.Parse(persianNow.Substring(8, 2)); + var hour = now.Hour; + var minute = now.Minute; + var checkAnyToExecute = false; + + //اگر آخرین روز ماه باشد + //اگر روز مثلا عدد روز 31 بود ولی آخرین روز ماه 30 بود + if (dayOfMonth == persianEndOfMonth) + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth >= dayOfMonth && + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder && + x.IsActive + ); + } + else + { + checkAnyToExecute = await _context.SmsSettings + .AnyAsync(x => + x.DayOfMonth == dayOfMonth && + x.TimeOfDay.Hours == hour && + x.TimeOfDay.Minutes == minute && + x.TypeOfSmsSetting == TypeOfSmsSetting.InstitutionContractDebtReminder && + x.IsActive + ); + } + + + if (checkAnyToExecute) + { + //اجرای تسک + _logger.LogInformation("اجرای تسک پیامک های یاد آور SendReminderSmsForBackgroundTask" + persianNow + " - " + + hour + ":" + minute); + //دریافت لیست بدهکاران + var smsListData = await GetSmsListData(now, TypeOfSmsSetting.InstitutionContractDebtReminder); + string typeOfSms = "یادآور بدهی ماهانه"; + string sendMessStart = "شروع پیامک یادآور"; + string sendMessEnd = "پایان پیامک یادآور"; + //ارسال پیامک + await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); + + + Console.WriteLine("executed at : " + persianNow + " - " + hour + ":" + minute); + return true; + } + + return false; + } + + /// + /// ارسال پیامک صورت حساب ماهانه + /// + /// + /// + public async Task SendMonthlySms(DateTime now) + { + //دریافت لیست بدهکاران + var smsListData = await GetSmsListData(now, TypeOfSmsSetting.MonthlyInstitutionContract); + + string typeOfSms = "صورت حساب ماهانه"; + string sendMessStart = "شروع پیامک ماهانه"; + string sendMessEnd = "پایان پیامک ماهانه"; + //ارسال پیامک + await SendReminderSmsToContractingParties(smsListData, typeOfSms, sendMessStart, sendMessEnd); + } + + /// + ///دریافت لیست بدهکارن + /// جهت ارسال پیامک + /// + /// + public async Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting) + { + var watch = new Stopwatch(); + var smsList = new List(); + var currentMonthStart = ($"{(checkDate.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); + var previusMonthEnd = currentMonthStart.AddDays(-1); + var previusMonthStart = ($"{(previusMonthEnd.ToFarsi()).Substring(0, 8)}01").ToGeorgianDateTime(); + + watch.Start(); + //دریافت اطلاعات بدهکارن و ساخت لیست پیامک + + #region GetSmsListData + + //var rollcallServiceList = _context.RollCallServices.Where(x => x.StartService.Date <= previusMonthStart.Date && x.EndService.Date >= previusMonthEnd.Date).ToList(); + var institutionContracts = await _context.InstitutionContractSet.AsSplitQuery() + .Include(x => x.Installments) + .Select(x => + new InstitutionContractViewModel + { + Id = x.id, + ContractingPartyId = x.ContractingPartyId, + ContractingPartyName = x.ContractingPartyName, + ContractStartGr = x.ContractStartGr, + ContractStartFa = x.ContractStartFa, + ContractEndGr = x.ContractEndGr, + ContractEndFa = x.ContractEndFa, + IsActiveString = x.IsActiveString, + ContractAmountDouble = x.ContractAmount, + OfficialCompany = x.OfficialCompany, + IsInstallment = x.IsInstallment, + VerificationStatus = x.VerificationStatus, + SigningType = x.SigningType, + InstallmentList = x.Installments + .Select(ins => new InstitutionContractInstallmentViewModel + { AmountDouble = ins.Amount, InstallmentDateGr = ins.InstallmentDateGr }) + .OrderBy(ins => ins.InstallmentDateGr).Skip(1).ToList(), + }).Where(x => x.ContractStartGr < checkDate && x.ContractEndGr >= checkDate && + x.ContractAmountDouble > 0 && x.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify) + .GroupBy(x => x.ContractingPartyId).Select(x => x.First()) + .ToListAsync(); + // قرارداد هایی که بطور یکجا پرداخت شده اند + var paidInFull = institutionContracts.Where(x => + x.SigningType != InstitutionContractSigningType.Legacy && x.IsInstallment == false && x.SigningType != null).ToList(); + + //حذف قراداد هایی که یکجا پرداخت شده اند از لیست ایجاد سند ماهانه + institutionContracts = institutionContracts.Except(paidInFull).ToList(); + + var contractingPartyList = await _context.PersonalContractingParties + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.id)).ToListAsync(); + + var financialStatmentList = await _context.FinancialStatments.AsSplitQuery() + .Where(x => institutionContracts.Select(ins => ins.ContractingPartyId).Contains(x.ContractingPartyId)) + .Include(x => x.FinancialTransactionList).Where(x => x.FinancialTransactionList.Count > 0).ToListAsync(); + + var phoneNumberList = await _context.InstitutionContractContactInfos + .Where(x => institutionContracts.Select(ins => ins.Id).Contains(x.InstitutionContractId)) + .Where(x => x.SendSms && x.PhoneType == "شماره همراه" && !string.IsNullOrWhiteSpace(x.PhoneNumber) && + x.PhoneNumber.Length == 11).ToListAsync(); + + Console.WriteLine("database query: " + watch.Elapsed); + watch.Stop(); + watch.Start(); + + //var a = new FinancialInvoice(balance, item.ContractingPartyId, ""); + //var b = new FinancialInvoiceItem("", balance, a.id, FinancialInvoiceItemType.PreviousDebt, + // 0); + //a.AddItem(b); + //_context.Add(a); + var oldInstitutionContract = institutionContracts.Where(x => x.IsInstallment == false).ToList(); + var electronicInstitutionContract = institutionContracts.Where(x => x.IsInstallment == true).ToList(); + foreach (var item in oldInstitutionContract) + { + try + { + var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); + //var isSend = sendedSms.Any(x => x.ContractingPatyId == contractingParty.Id); + if (!string.IsNullOrWhiteSpace(contractingParty.LName)) + { + //Thread.Sleep(500); + var partyName = contractingParty.IsLegal == "حقیقی" + ? $"{contractingParty.FName} {contractingParty.LName}" + : $"{contractingParty.LName}"; + if (!string.IsNullOrWhiteSpace(contractingParty.SureName)) + partyName = $"{partyName} ({contractingParty.SureName})"; + + if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; + + var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; + var isBlock = contractingParty.IsBlock == "true" ? true : false; + var isActive = contractingParty.IsActiveString == "true" ? true : false; + if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) + { + var hasFinancialStatement = + financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); + + + var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); + + + if (hasFinancialStatement && hasPhonNumber) + { + var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) + .Select(x => new CreateContactInfo + { + PhoneType = x.PhoneType, + PhoneNumber = x.PhoneNumber, + + InstitutionContractId = x.InstitutionContractId, + SendSms = x.SendSms + }).Where(x => x.PhoneNumber.Length == 11).ToList(); + + var transactions = financialStatmentList.FirstOrDefault(x => + x.ContractingPartyId == item.ContractingPartyId); + + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + var id = $"{item.ContractingPartyId}"; + var aprove = $"{transactions.id}"; + var balance = debtor - creditor; + + + + if (balance > 0) // اگر بدهکار بود + { + //var employers = _context.Employers.Where(x => x.ContractingPartyId == item.ContractingPartyId) + // .Select(x => x.id); + //var workshops = _context.WorkshopEmployers.Where(x => employers.Contains(x.EmployerId)) + // .Select(x => x.WorkshopId).Distinct().ToList(); + + + //var services = + // rollcallServiceList.Where(x => workshops.Contains(x.WorkshopId)).ToList(); + + //var hasRollCallService = services.Count > 0; + + //موقت + var hasRollCallService = false; + + //if (hasRollCallService) + //{ + // var employees = + // _context.RollCallEmployees.Where(x => workshops.Contains(x.WorkshopId)) + // .Select(x => x.id); + + // var employeeCount = _context.RollCallEmployeesStatus + // .Where(x => employees.Contains(x.RollCallEmployeeId)) + // .Count(x => x.EndDate.Date == activeStatusDate.Date); + + // if (employeeCount == 0) + // hasRollCallService = false; + //} + + if (isLegal) + { + if (item.OfficialCompany == "Official") // حقوقی بدهکار رسمی + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) + { + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) + { + + var templateId = 161233; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 394006; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBill", + Code1 = "", + Code2 = "", + InstitutionContractId = item.Id + }); + + } + } + } + else if (item.OfficialCompany == "NotOfficial") // حقوقی بدهکار غیر رسمی + { + var balanceToMoney = balance.ToMoney(); + foreach (var number in phoneNumbers) + { + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) + { + + var templateId = 347415; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 679068; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBill", + Code1 = "", + Code2 = "", + InstitutionContractId = item.Id + }); + + } + } + } + } + else + { + if (item.OfficialCompany == "Official") // حقیقی بدهکار رسمی + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) + { + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) + { + + var templateId = 998180; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 646040; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBill", + Code1 = "", + Code2 = "", + InstitutionContractId = item.Id + }); + + } + } + } + else if (item.OfficialCompany == "NotOfficial") // حقیقی بدهکار غیر رسمی + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) + { + if (!string.IsNullOrWhiteSpace(number.PhoneNumber) && + number.PhoneNumber.Length == 11) + { + + + var templateId = 810539; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 566537; + } + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBill", + Code1 = "", + Code2 = "", + InstitutionContractId = item.Id + }); + + } + } + } + } + } + + + phoneNumbers = new List(); + } + } + } + } + catch (Exception e) + { + string name = item.ContractingPartyName.Length > 18 + ? item.ContractingPartyName.Substring(0, 18) + : item.ContractingPartyName; + string errMess = $"{name}-خطا"; + // _smsService.Alarm("09114221321", errMess); + } + } + + foreach (var item in electronicInstitutionContract) + { + try + { + var contractingParty = contractingPartyList.FirstOrDefault(x => x.id == item.ContractingPartyId); + if (!string.IsNullOrWhiteSpace(contractingParty.LName)) + { + var partyName = contractingParty.IsLegal == "حقیقی" + ? $"{contractingParty.FName} {contractingParty.LName}" + : $"{contractingParty.LName}"; + if (!string.IsNullOrWhiteSpace(contractingParty.SureName)) + partyName = $"{partyName} ({contractingParty.SureName})"; + + if (partyName.Length > 25) partyName = $"{partyName.Substring(0, 25)}"; + + var isLegal = contractingParty.IsLegal == "حقوقی" ? true : false; + var isBlock = contractingParty.IsBlock == "true" ? true : false; + var isActive = contractingParty.IsActiveString == "true" ? true : false; + + if (!string.IsNullOrWhiteSpace(contractingParty.IsActiveString) && isActive) + { + var hasFinancialStatement = + financialStatmentList.Any(x => x.ContractingPartyId == item.ContractingPartyId); + + + var hasPhonNumber = phoneNumberList.Any(x => x.InstitutionContractId == item.Id); + + if (hasFinancialStatement && hasPhonNumber) + { + var phoneNumbers = phoneNumberList.Where(x => x.InstitutionContractId == item.Id) + .Select(x => new CreateContactInfo + { + PhoneType = x.PhoneType, + PhoneNumber = x.PhoneNumber, + + InstitutionContractId = x.InstitutionContractId, + SendSms = x.SendSms + }).Where(x => x.PhoneNumber.Length == 11).ToList(); + + var transactions = financialStatmentList.FirstOrDefault(x => + x.ContractingPartyId == item.ContractingPartyId); + + var debtor = transactions.FinancialTransactionList.Sum(x => x.Deptor); + var creditor = transactions.FinancialTransactionList.Sum(x => x.Creditor); + + + var id = $"{item.ContractingPartyId}"; + var aprove = $"{transactions.id}"; + var balance = debtor - creditor; + int templateId = 0; + //انتخاب قالب پیامک بر اساس حقیق/حقوقی + if (isLegal) + { + templateId = 789638; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 983035; + } + } + else + { + templateId = 768277; + if (typeOfSmsSetting == + TypeOfSmsSetting.MonthlyInstitutionContract) + { + templateId = 479624; + } + } + + if (balance > 0) // اگر بدهکار بود + { + var balanceToMoney = balance.ToMoney(); + + foreach (var number in phoneNumbers) + { + string publicId = transactions.PublicIdStr; + string code1 = publicId.Substring(0, 25); + string code2 = publicId.Substring(25); + + + smsList.Add(new SmsListData() + { + PhoneNumber = number.PhoneNumber, + TemplateId = templateId, + PartyName = partyName, + Amount = balanceToMoney, + ContractingPartyId = contractingParty.id, + AproveId = aprove, + TypeOfSmsMethod = "MonthlyBillNew", + Code1 = code1, + Code2 = code2, + InstitutionContractId = item.Id + }); + + } + } + } + } + } + + } + catch (Exception e) + { + _logger.LogError($"ContractingPartyId : {item.ContractingPartyId} - ContractingPartyName : {item.ContractingPartyName} - InstitutionContractId : {item.Id} خطای دریافت لیست بدهکاران "); + throw; + } + } + + + #endregion + + Console.WriteLine("SmsListData: " + watch.Elapsed); + return smsList; + } + + /// + /// ارسال پیامک های یاد آور بدهی + /// + /// + public async Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, + string sendMessStart, string sendMessEnd) + { + //ارسال پیامک با اساس لیست + + #region SendSMSFromList + + if (smsListData.Any()) + { + //await _smsService.Alarm("09114221321", sendMessStart); + //Thread.Sleep(1000); + //await _smsService.Alarm("09111485044", sendMessStart); + //Thread.Sleep(1000); + + int successProcess = 1; + int countList = smsListData.Count; + + + foreach (var item in smsListData) + { + try + { + if (item.TypeOfSmsMethod == "MonthlyBill") + { + var res = await _smsService.MonthlyBill(item.PhoneNumber, item.TemplateId, item.PartyName, + item.Amount, + $"{item.ContractingPartyId}", item.AproveId); + + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + else + { + var res = await _smsService.MonthlyBillNew(item.PhoneNumber, item.TemplateId, item.PartyName, + item.Amount, item.Code1, item.Code2); + if (res.isSucceded) + { + var createSmsResult = new Company.Domain.SmsResultAgg.SmsResult(res.messaeId, + res.message, typeOfSms, item.PartyName, item.PhoneNumber, + item.ContractingPartyId, item.InstitutionContractId); + + await _smsResultRepository.CreateAsync(createSmsResult); + await _smsResultRepository.SaveChangesAsync(); + } + } + + Thread.Sleep(600); + } + catch (Exception e) + { + string name = item.PartyName.Length > 18 ? item.PartyName.Substring(0, 18) : item.PartyName; + string errMess = $"{name}-خطا"; + _logger.LogError(errMess); + await _smsService.Alarm("09114221321", errMess); + } + + var percent = (successProcess / (double)countList) * 100; + await _hubContext.Clients.Group(SendSmsHub.GetGroupName(7)) + .SendAsync("showStatus", (int)percent); + + successProcess += 1; + } + + + //await _smsService.Alarm("09114221321", sendMessEnd); + //Thread.Sleep(1000); + //await _smsService.Alarm("09111485044", sendMessEnd); + } + + #endregion + } + + #endregion } From d9c431e20e05753ce8a7f887d5834397e09b09df Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 13 Jan 2026 09:23:53 +0330 Subject: [PATCH 13/13] add project name search for board list --- .../ProjectBoardList/ProjectBoardListQuery.cs | 1 + .../ProjectBoardListQueryHandler.cs | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs index 73ea9a9e..d550cdbe 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQuery.cs @@ -7,5 +7,6 @@ namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.Project public record ProjectBoardListQuery: IBaseQuery> { public long? UserId { get; set; } + public string? SearchText { get; set; } public TaskSectionStatus? Status { get; set; } } \ No newline at end of file diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs index 4ff4f377..a5b171f4 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Queries/ProjectBoardList/ProjectBoardListQueryHandler.cs @@ -3,7 +3,6 @@ using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Domain.ProjectAgg.Enums; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Query.Internal; namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.ProjectBoardList; @@ -24,7 +23,8 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler x.InitialEstimatedHours > TimeSpan.Zero && x.Status != TaskSectionStatus.Completed) + .Where(x => x.InitialEstimatedHours > TimeSpan.Zero + && x.Status != TaskSectionStatus.Completed) .Include(x => x.Task) .ThenInclude(x => x.Phase) .ThenInclude(x => x.Project) @@ -45,10 +45,18 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler x.CurrentAssignedUserId == request.UserId); } + + if (!string.IsNullOrWhiteSpace(request.SearchText)) + { + queryable = queryable.Where(x=>x.Task.Name.Contains(request.SearchText) + || x.Task.Phase.Name.Contains(request.SearchText) + || x.Task.Phase.Project.Name.Contains(request.SearchText)); + } var data = await queryable.ToListAsync(cancellationToken); - var activityUserIds = data.SelectMany(x => x.Activities).Select(a => a.UserId).Distinct().ToList(); + var activityUserIds = data.SelectMany(x => x.Activities) + .Select(a => a.UserId).Distinct().ToList(); var assignedUser = data.Select(x => x.CurrentAssignedUserId) .Concat(data.Select(x => x.OriginalAssignedUserId)).ToList(); var allUserIds = activityUserIds.Concat(assignedUser).Distinct().ToList(); @@ -72,7 +80,7 @@ public class ProjectBoardListQueryHandler : IBaseQueryHandler