diff --git a/0_Framework/Application/Enums/InstitutionContractVerificationStatus.cs b/0_Framework/Application/Enums/InstitutionContractVerificationStatus.cs
new file mode 100644
index 00000000..2739524a
--- /dev/null
+++ b/0_Framework/Application/Enums/InstitutionContractVerificationStatus.cs
@@ -0,0 +1,22 @@
+namespace _0_Framework.Application.Enums;
+
+///
+/// وضعیت تایید قرادا مالی
+///
+public enum InstitutionContractVerificationStatus
+{
+ ///
+ /// در انتظار تایید
+ ///
+ PendingForVerify = 0,
+
+ ///
+ /// در انتظار کارپوشه
+ ///
+ PendingWorkflow = 1,
+
+ ///
+ /// تایید شده
+ ///
+ Verified = 2
+}
\ No newline at end of file
diff --git a/0_Framework/Application/Enums/TypeOfSmsSetting.cs b/0_Framework/Application/Enums/TypeOfSmsSetting.cs
new file mode 100644
index 00000000..9b4512b7
--- /dev/null
+++ b/0_Framework/Application/Enums/TypeOfSmsSetting.cs
@@ -0,0 +1,36 @@
+namespace _0_Framework.Application.Enums;
+
+public enum TypeOfSmsSetting
+{
+
+ ///
+ /// پیامک
+ /// یادآور بدهی ماهیانه قرارداد مالی
+ ///
+ InstitutionContractDebtReminder,
+
+ ///
+ /// پیامک
+ /// صورت حساب ماهانه قرارداد مالی
+ ///
+ MonthlyInstitutionContract,
+
+ ///
+ /// پیامک
+ /// اعلام مسدودی طرف حساب
+ ///
+ BlockContractingParty,
+
+ ///
+ /// پیامک
+ /// هشدار اول
+ ///
+ Warning,
+
+
+ ///
+ ///پیامک اقدام قضائی
+ ///
+ LegalAction,
+
+}
\ No newline at end of file
diff --git a/0_Framework/Application/PaymentGateway/AqayePardakhtPaymentGateway.cs b/0_Framework/Application/PaymentGateway/AqayePardakhtPaymentGateway.cs
index b71f8681..c68790b9 100644
--- a/0_Framework/Application/PaymentGateway/AqayePardakhtPaymentGateway.cs
+++ b/0_Framework/Application/PaymentGateway/AqayePardakhtPaymentGateway.cs
@@ -39,7 +39,7 @@ public class AqayePardakhtPaymentGateway:IPaymentGateway
amount = command.Amount,
callback = command.CallBackUrl,
card_number = command.CardNumber,
- invoice_id = command.InvoiceId,
+ invoice_id = command.TransactionId,
mobile = command.Mobile,
email = command.Email??"",
description = command.Description,
@@ -73,7 +73,7 @@ public class AqayePardakhtPaymentGateway:IPaymentGateway
amount = command.Amount,
callback = command.CallBackUrl,
card_number = command.Amount,
- invoice_id = command.InvoiceId,
+ invoice_id = command.TransactionId,
mobile = command.Mobile,
email = command.Email,
description = command.Email,
diff --git a/0_Framework/Application/PaymentGateway/IPaymentGateway.cs b/0_Framework/Application/PaymentGateway/IPaymentGateway.cs
index 3565785a..46f43528 100644
--- a/0_Framework/Application/PaymentGateway/IPaymentGateway.cs
+++ b/0_Framework/Application/PaymentGateway/IPaymentGateway.cs
@@ -49,12 +49,13 @@ public class WalletAmountResponse
public class CreatePaymentGatewayRequest
{
public double Amount { get; set; }
+ public string TransactionId { get; set; }
public string CallBackUrl { get; set; }
- public string InvoiceId { get; set; }
public string CardNumber { get; set; }
public string Mobile { get; set; }
public string Email { get; set; }
public string Description { get; set; }
+ public long FinancialInvoiceId { get; set; }
public IDictionary ExtraData { get; set; }
}
diff --git a/0_Framework/Application/PaymentGateway/SepehrPaymentGateway.cs b/0_Framework/Application/PaymentGateway/SepehrPaymentGateway.cs
index f11d1b46..792df36b 100644
--- a/0_Framework/Application/PaymentGateway/SepehrPaymentGateway.cs
+++ b/0_Framework/Application/PaymentGateway/SepehrPaymentGateway.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading;
@@ -16,18 +17,18 @@ public class SepehrPaymentGateway:IPaymentGateway
{
_httpClient = httpClient.CreateClient();
_httpClient.BaseAddress = new Uri("https://sepehr.shaparak.ir/Rest/V1/PeymentApi/");
-
-
}
public async Task Create(CreatePaymentGatewayRequest command, CancellationToken cancellationToken = default)
{
+ command.ExtraData ??= new Dictionary();
+ command.ExtraData.Add("financialInvoiceId", command.FinancialInvoiceId);
var extraData = JsonConvert.SerializeObject(command.ExtraData);
var res = await _httpClient.PostAsJsonAsync("GetToken", new
{
TerminalID = TerminalId,
Amount = command.Amount,
- InvoiceID = command.InvoiceId,
+ InvoiceID = command.TransactionId,
callbackURL = command.CallBackUrl,
payload = extraData
}, cancellationToken: cancellationToken);
diff --git a/0_Framework/Application/Sms/ISmsService.cs b/0_Framework/Application/Sms/ISmsService.cs
index cb1fec3f..6171e87a 100644
--- a/0_Framework/Application/Sms/ISmsService.cs
+++ b/0_Framework/Application/Sms/ISmsService.cs
@@ -33,6 +33,60 @@ public interface ISmsService
public Task SendInstitutionVerificationCode(string number, string code, string contractingPartyFullName,
long contractingPartyId, long institutionContractId);
+ SmsResult TaskReminderSms(string number, string taskCount);
+
+ #endregion
+
+
+ #region InstitutionContractSMS
+ ///
+ /// پیامک اهانه جدید
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task<(byte status, string message, int messaeId, bool isSucceded)> MonthlyBillNew(string number, int tamplateId, string fullname, string amount, string code1,
+ string code2);
+ ///
+ /// پیامک ماهانه قدیم
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task<(byte status, string message, int messaeId, bool isSucceded)> MonthlyBill(string number, int tamplateId, string fullname, string amount, string id, string aprove);
+
+ ///
+ /// پیامک مسدودی طرف حساب
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessage(string number, string fullname, string amount, string accountType, string id, string aprove);
+
+ #endregion
+
+ #region AlarmMessage
+
+ ///
+ /// ارسال پیامک های خطا یا اعمال ارسال
+ ///
+ ///
+ ///
+ ///
+ Task Alarm(string number, string message);
+
#endregion
}
\ No newline at end of file
diff --git a/0_Framework/Application/Sms/SmsResult.cs b/0_Framework/Application/Sms/SmsResult.cs
new file mode 100644
index 00000000..266a76d4
--- /dev/null
+++ b/0_Framework/Application/Sms/SmsResult.cs
@@ -0,0 +1,32 @@
+namespace _0_Framework.Application.Sms;
+
+public class SmsResult
+{
+ public SmsResult()
+ {
+ IsSuccedded = false;
+ }
+
+ public bool IsSuccedded { get; set; }
+ public string Message { get; set; }
+ public byte StatusCode { get; set; }
+ public int MessageId { get; set; }
+
+ public SmsResult Succedded(byte statusCode, string message, int messageId)
+ {
+ IsSuccedded = true;
+ Message = message;
+ StatusCode = statusCode;
+ MessageId = messageId;
+ return this;
+ }
+
+ public SmsResult Failed(byte statusCode, string message, int messageId)
+ {
+ IsSuccedded = false;
+ Message = message;
+ StatusCode = statusCode;
+ MessageId = messageId;
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/BackgroundInstitutionContract.Task.csproj b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/BackgroundInstitutionContract.Task.csproj
new file mode 100644
index 00000000..d30ce3b8
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/BackgroundInstitutionContract.Task.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net8.0
+ enable
+ enable
+ BackgroundInstitutionContract.Task
+ BackgroundInstitutionContract.Task
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/FileUploader.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/FileUploader.cs
new file mode 100644
index 00000000..2334c491
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/FileUploader.cs
@@ -0,0 +1,32 @@
+using _0_Framework.Application;
+
+namespace BackgroundInstitutionContract.Task
+{
+ public class FileUploader : IFileUploader
+ {
+ private readonly IWebHostEnvironment _webHostEnvironment;
+
+ public FileUploader(IWebHostEnvironment webHostEnvironment)
+ {
+ _webHostEnvironment = webHostEnvironment;
+ }
+
+ public string Upload(IFormFile file, string path)
+ {
+ if (file == null) return "";
+
+ var directoryPath = $"{_webHostEnvironment.WebRootPath}\\ProductPictures\\{path}";
+
+ if (!Directory.Exists(directoryPath))
+ Directory.CreateDirectory(directoryPath);
+
+ var fileName = $"{DateTime.Now.ToFileName()}-{file.FileName}";
+ var filePath = $"{directoryPath}\\{fileName}";
+ var output = System.IO.File.Create(filePath);
+ file.CopyTo(output);
+ return $"{path}/{fileName}";
+ }
+
+
+ }
+}
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs
new file mode 100644
index 00000000..a0365042
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/JobSchedulerRegistrator.cs
@@ -0,0 +1,149 @@
+
+using _0_Framework.Application;
+using Company.Domain.ContarctingPartyAgg;
+using Company.Domain.InstitutionContractAgg;
+using Hangfire;
+
+namespace BackgroundInstitutionContract.Task.Jobs;
+
+public class JobSchedulerRegistrator
+{
+ private readonly IBackgroundJobClient _backgroundJobClient;
+ private readonly SmsReminder _smsReminder;
+ private readonly IInstitutionContractRepository _institutionContractRepository;
+ private static DateTime? _lastRunCreateTransaction;
+ private static DateTime? _lastRunSendMonthlySms;
+
+
+ public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository)
+ {
+ _smsReminder = smsReminder;
+ _backgroundJobClient = backgroundJobClient;
+ _institutionContractRepository = institutionContractRepository;
+ }
+
+ public void Register()
+ {
+
+ //RecurringJob.AddOrUpdate(
+ // "InstitutionContract.CreateFinancialTransaction",
+ // () => CreateFinancialTransaction(),
+ // "*/30 * * * *" // هر 30 دقیقه یکبار چک کن
+ //);
+
+ //RecurringJob.AddOrUpdate(
+ // "InstitutionContract.SendMonthlySms",
+ // () => SendMonthlySms(),
+ // "*/20 * * * *" // هر 30 دقیقه یکبار چک کن
+ //);
+
+ //RecurringJob.AddOrUpdate(
+ // "InstitutionContract.SendReminderSms",
+ // () => SendReminderSms(),
+ // "*/1 * * * *" // هر 1 دقیقه یکبار چک کن
+ //);
+ RecurringJob.AddOrUpdate(
+ "InstitutionContract.SendBlockSms",
+ () => SendBlockSms(),
+ "*/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();
+
+ 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 endnew = ($"{endOfMonth.Substring(0, 8)}01").FindeEndOfMonth();
+
+ var endNewGr = endnew.ToGeorgianDateTime();
+ var endNewFa = endNewGr.ToFarsi();
+
+ try
+ {
+ await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description);
+ _lastRunCreateTransaction = now;
+ Console.WriteLine("CreateTransAction executed");
+
+ }
+ catch (Exception e)
+ {
+ //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
+
+ }
+
+ }
+ }
+
+
+ ///
+ /// ارسال پیامک صورت حساب ماهانه
+ ///
+ ///
+ [DisableConcurrentExecution(timeoutInSeconds: 1000)]
+ public async System.Threading.Tasks.Task SendMonthlySms()
+ {
+ //var now = new DateTime(2025,11,21, 10,30,0);
+ var now = DateTime.Now;
+ var endOfMonth = now.ToFarsi().FindeEndOfMonth();
+ var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
+
+ 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");
+
+ }
+ catch (Exception e)
+ {
+ //_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
+
+ }
+
+ }
+ }
+
+ ///
+ /// ارسال پیامک یاد آور بدهی
+ ///
+ ///
+ [DisableConcurrentExecution(timeoutInSeconds: 1200)]
+ public async System.Threading.Tasks.Task SendReminderSms()
+ {
+ await _institutionContractRepository.SendReminderSmsForBackgroundTask();
+ }
+
+ ///
+ /// ارسال پیامک مسدودی
+ ///
+ ///
+ [DisableConcurrentExecution(timeoutInSeconds: 100)]
+ public async System.Threading.Tasks.Task SendBlockSms()
+ {
+ await _institutionContractRepository.SendBlockSmsForBackgroundTask();
+ }
+
+}
\ No newline at end of file
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/SmsReminder.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/SmsReminder.cs
new file mode 100644
index 00000000..c9f1aeaf
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Jobs/SmsReminder.cs
@@ -0,0 +1,116 @@
+using _0_Framework.Application.Sms;
+using AccountManagement.Application.Contracts.Account;
+using AccountMangement.Infrastructure.EFCore;
+using Company.Domain.SmsResultAgg;
+using Microsoft.EntityFrameworkCore;
+using SmsResult = Company.Domain.SmsResultAgg.SmsResult;
+
+namespace BackgroundInstitutionContract.Task.Jobs;
+public class SmsReminder
+{
+ private readonly AccountContext _accountContext;
+ private readonly ISmsService _smsService;
+ private readonly ISmsResultRepository _smsResultRepository;
+
+ public SmsReminder(ISmsService smsService, AccountContext accountContext, ISmsResultRepository smsResultRepository)
+ {
+ _smsService = smsService;
+ _accountContext = accountContext;
+ _smsResultRepository = smsResultRepository;
+ }
+
+ public void Execute()
+ {
+ //var accounts = _accountContext.Accounts.Where(x => x.PositionId > 0 && x.IsActiveString == "true").Select(x => new AccountViewModel() { Id = x.id, Mobile = x.Mobile, Fullname = x.Fullname }).ToList();
+ //Thread.Sleep(300);
+ //var accounts = new List() { new AccountViewModel() { Mobile = "09114221321", Id = 2 } };
+ var accounts= _accountContext.Accounts.Where(x => x.Username.ToLower()=="mahan").Select(x => new AccountViewModel() { Id = x.id, Mobile = x.Mobile, Fullname = x.Fullname }).ToList();
+ var smsVM = accounts.Select(x => new AccountSmsTaskViewModel()
+ {
+ Mobile = x.Mobile,
+ AccountId = x.Id,
+ FullName = x.Fullname,
+ TaskCount = GetLateTasksCount(x.Id)
+ }).Where(x => x.TaskCount > 0 && !string.IsNullOrEmpty(x.Mobile) && x.Mobile.Length == 11).ToList();
+ Thread.Sleep(300);
+
+
+ foreach (var viewmodel in smsVM)
+ {
+ var smsResult = _smsService.TaskReminderSms(viewmodel.Mobile, $"{viewmodel.TaskCount}");
+ Thread.Sleep(1000);
+ var createSmsResult = new SmsResult(smsResult.MessageId, smsResult.Message, "یادآور وظایف",
+ viewmodel.FullName, viewmodel.Mobile, viewmodel.AccountId, viewmodel.AccountId);
+ _smsResultRepository.Create(createSmsResult);
+ _smsResultRepository.SaveChanges();
+ Thread.Sleep(1000);
+ }
+ }
+ private int GetLateTasksCount(long accountId)
+ {
+ var positionValue = _accountContext.Accounts
+ .Where(x => x.id == accountId)
+ .Include(p => p.Position)
+ .Select(x => x.Position.PositionValue)
+ .FirstOrDefault();
+
+ if (positionValue == 0)
+ return 0;
+
+
+ DateTime now = DateTime.Now;
+ int overdueTasksCount;
+
+ if (positionValue == 1)
+ {
+ overdueTasksCount = _accountContext.Assigns.Include(x => x.Task).Where(x => x.AssignedId == accountId &&
+ x.AssignerId == accountId && x.Task.Assigns.Count == 1 &&
+ !x.IsCancel && !x.IsCanceledRequest &&
+ !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true")
+ .GroupBy(x => x.TaskId).Select(x => x.First()).Count();
+
+ //overdueTasksCount = _accountContext.Tasks.Include(x =>
+ // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) &&
+ // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) &&
+ // !x.Assigns.Any(a => a.TimeRequest)
+ // && x.Assigns.Any(a => a.AssignedId == accountId && a.AssignerId == accountId) &&
+ // (x.Assigns.First(a => a.AssignedId == accountId && a.AssignerId == accountId)
+ // .EndTaskDate.Date <= DateTime.Now.Date) && x.Assigns.Count == 1);
+ }
+ else
+ {
+
+ overdueTasksCount = _accountContext.Assigns
+ .Include(x => x.Task)
+ .Where(x => x.AssignedId == accountId &&
+ !x.IsCancel && !x.IsCanceledRequest &&
+ !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true")
+ .GroupBy(x => x.TaskId).Select(x => x.First()).Count();
+ }
+
+
+ //overdueTasksCount = _accountContext.Tasks.Include(x =>
+ // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) &&
+ // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) &&
+ // !x.Assigns.Any(a => a.TimeRequest)
+ // && x.Assigns.Any(a => a.AssignedId == accountId) &&
+ // (x.Assigns.First(a => a.AssignedId == accountId).EndTaskDate.Date <= DateTime.Now.Date));
+
+
+ var overdueRequestsCount = _accountContext.Assigns.Include(x => x.Task)
+ .Where(x => (x.IsCanceledRequest
+ || x.IsDoneRequest || x.TimeRequest) && !x.IsCancel && !x.IsDone &&
+ x.Task.IsActiveString == "true" &&
+ x.Task.SenderId == accountId).GroupBy(x => x.TaskId).Select(x => x.First()).Count();
+
+ return overdueTasksCount + overdueRequestsCount;
+ }
+
+}
+public class AccountSmsTaskViewModel
+{
+ public int TaskCount { get; set; }
+ public long AccountId { get; set; }
+ public string Mobile { get; set; }
+ public string FullName { get; set; }
+}
\ No newline at end of file
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/JobsBootstrapper.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/JobsBootstrapper.cs
new file mode 100644
index 00000000..67c287f7
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/JobsBootstrapper.cs
@@ -0,0 +1,25 @@
+using BackgroundInstitutionContract.Task.Jobs;
+
+
+namespace BackgroundInstitutionContract.Task;
+
+public class JobsBootstrapper
+{
+ public static void Configure(IServiceCollection services)
+ {
+ var currentNamespace = typeof(JobSchedulerRegistrator).Namespace; // همون namespace کلاس
+
+ var assembly = typeof(JobSchedulerRegistrator).Assembly;
+
+ var jobTypes = assembly.GetTypes()
+ .Where(t =>
+ t is { IsClass: true, IsAbstract: false, Namespace: not null } &&
+ t.Namespace.StartsWith(currentNamespace, StringComparison.Ordinal))
+ .ToList();
+
+ foreach (var jobType in jobTypes)
+ {
+ services.AddTransient(jobType);
+ }
+ }
+}
\ No newline at end of file
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Program.cs b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Program.cs
new file mode 100644
index 00000000..0c6798e6
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Program.cs
@@ -0,0 +1,59 @@
+using _0_Framework.Application;
+using _0_Framework.Application.Sms;
+using _0_Framework.Application.UID;
+using _0_Framework.InfraStructure.Mongo;
+using AccountManagement.Configuration;
+using BackgroundInstitutionContract.Task;
+using BackgroundInstitutionContract.Task.Jobs;
+using CompanyManagment.EFCore.Services;
+using Hangfire;
+using Microsoft.AspNetCore.Identity;
+using MongoDB.Driver;
+using PersonalContractingParty.Config;
+using Query.Bootstrapper;
+using WorkFlow.Infrastructure.Config;
+
+var builder = WebApplication.CreateBuilder(args);
+var hangfireConnectionString = builder.Configuration.GetConnectionString("HangfireDb");
+builder.Services.AddHangfire(x => x.UseSqlServerStorage(hangfireConnectionString));
+builder.Services.AddHangfireServer();
+var connectionString = builder.Configuration.GetConnectionString("MesbahDb");
+var connectionStringTestDb = builder.Configuration.GetConnectionString("TestDb");
+builder.Services.AddSingleton();
+builder.Services.AddTransient();
+builder.Services.AddTransient();
+builder.Services.AddTransient();
+builder.Services.AddTransient();
+builder.Services.Configure(builder.Configuration);
+
+#region MongoDb
+
+var mongoConnectionSection = builder.Configuration.GetSection("MongoDb");
+var mongoDbSettings = mongoConnectionSection.Get();
+var mongoClient = new MongoClient(mongoDbSettings.ConnectionString);
+var mongoDatabase = mongoClient.GetDatabase(mongoDbSettings.DatabaseName);
+
+builder.Services.AddSingleton(mongoDatabase);
+
+#endregion
+
+PersonalBootstrapper.Configure(builder.Services, connectionString);
+TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
+AccountManagementBootstrapper.Configure(builder.Services, connectionString);
+WorkFlowBootstrapper.Configure(builder.Services, connectionString);
+QueryBootstrapper.Configure(builder.Services);
+JobsBootstrapper.Configure(builder.Services);
+builder.Services.AddHttpClient();
+builder.Services.AddHttpContextAccessor();
+var app = builder.Build();
+
+app.MapHangfireDashboard();
+app.MapGet("/", () => "Hello World!");
+
+using (var scope = app.Services.CreateScope())
+{
+ var jobScheduler = scope.ServiceProvider.GetRequiredService();
+ jobScheduler.Register();
+}
+
+app.Run();
\ No newline at end of file
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Properties/launchSettings.json b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Properties/launchSettings.json
new file mode 100644
index 00000000..e9f19892
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/Properties/launchSettings.json
@@ -0,0 +1,38 @@
+{
+ "$schema": "http://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:56492",
+ "sslPort": 44378
+ }
+ },
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "http://localhost:5216",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:7223;http://localhost:5217",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/appsettings.Development.json b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/appsettings.Development.json
new file mode 100644
index 00000000..2dc32b9b
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/appsettings.Development.json
@@ -0,0 +1,46 @@
+{
+ "DetailedErrors": true,
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "ConnectionStrings": {
+ //تست
+ //"MesbahDb": "Data Source=DESKTOP-NUE119G\\MSNEW;Initial Catalog=Mesbah_db;Integrated Security=True"
+
+ //server
+ //"MesbahDb": "Data Source=171.22.24.15;Initial Catalog=mesbah_db;Persist Security Info=False;User ID=ir_db;Password=R2rNp[170]18[3019]#@ATt;TrustServerCertificate=true;",
+
+
+ //local
+ "MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;",
+
+ //dad-mehr
+ //"MesbahDb": "Data Source=.;Initial Catalog=teamWork;Integrated Security=True;TrustServerCertificate=true;",
+
+ "TestDb": "Data Source=.;Initial Catalog=TestDb;Integrated Security=True;TrustServerCertificate=true;",
+
+ //mahan Docker
+ //"MesbahDb": "Data Source=localhost,5069;Initial Catalog=mesbah_db;User ID=sa;Password=YourPassword123;TrustServerCertificate=True;",
+ "HangfireDb": "Data Source=.;Initial Catalog=hangfire_db;Integrated Security=True;TrustServerCertificate=true;"
+ },
+
+ "GoogleRecaptchaV3": {
+ "SiteKey": "6Lfhp_AnAAAAAB79WkrMoHd1k8ir4m8VvfjE7FTH",
+ "SecretKey": "6Lfhp_AnAAAAANjDDY6DPrbbUQS7k6ZCRmrVP5Lb"
+ },
+ "SmsSecrets": {
+ "ApiKey": "Og5M562igmzJRhQPnq0GdtieYdLgtfikjzxOmeQBPxJjZtyge5Klc046Lfw1mxSa",
+ "SecretKey": "dadmehr"
+ },
+ "Domain": ".gozareshgir.ir",
+ "MongoDb": {
+ "ConnectionString": "mongodb://localhost:27017",
+ "DatabaseName": "Gozareshgir"
+ }
+
+
+}
\ No newline at end of file
diff --git a/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/appsettings.json b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/appsettings.json
new file mode 100644
index 00000000..10f68b8c
--- /dev/null
+++ b/BackgroundInstitutionContract/BackgroundInstitutionContract.Task/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/BackgroundJobs/BackgroundJobs.Task/BackgroundJobs.Task.csproj b/BackgroundJobs/BackgroundJobs.Task/BackgroundJobs.Task.csproj
new file mode 100644
index 00000000..0ab571f8
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/BackgroundJobs.Task.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BackgroundJobs/BackgroundJobs.Task/FileUploader.cs b/BackgroundJobs/BackgroundJobs.Task/FileUploader.cs
new file mode 100644
index 00000000..0d8610d9
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/FileUploader.cs
@@ -0,0 +1,32 @@
+using _0_Framework.Application;
+
+namespace BackgroundJobs.Task
+{
+ public class FileUploader : IFileUploader
+ {
+ private readonly IWebHostEnvironment _webHostEnvironment;
+
+ public FileUploader(IWebHostEnvironment webHostEnvironment)
+ {
+ _webHostEnvironment = webHostEnvironment;
+ }
+
+ public string Upload(IFormFile file, string path)
+ {
+ if (file == null) return "";
+
+ var directoryPath = $"{_webHostEnvironment.WebRootPath}\\ProductPictures\\{path}";
+
+ if (!Directory.Exists(directoryPath))
+ Directory.CreateDirectory(directoryPath);
+
+ var fileName = $"{DateTime.Now.ToFileName()}-{file.FileName}";
+ var filePath = $"{directoryPath}\\{fileName}";
+ var output = System.IO.File.Create(filePath);
+ file.CopyTo(output);
+ return $"{path}/{fileName}";
+ }
+
+
+ }
+}
diff --git a/BackgroundJobs/BackgroundJobs.Task/Jobs/JobSchedulerRegistrator.cs b/BackgroundJobs/BackgroundJobs.Task/Jobs/JobSchedulerRegistrator.cs
new file mode 100644
index 00000000..50807e29
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/Jobs/JobSchedulerRegistrator.cs
@@ -0,0 +1,62 @@
+using Hangfire;
+
+namespace BackgroundJobs.Task.Jobs;
+
+public class JobSchedulerRegistrator
+{
+ private readonly IBackgroundJobClient _backgroundJobClient;
+ private readonly SmsReminder _smsReminder;
+ private static DateTime? _lastRunDateMorning;
+ private static DateTime? _lastRunDateEvening;
+
+ public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient)
+ {
+ _smsReminder = smsReminder;
+ _backgroundJobClient = backgroundJobClient;
+ }
+
+ public void Register()
+ {
+ RecurringJob.AddOrUpdate(
+ "Task.SmsReminderChecker",
+ () => SmsReminderCheckAndSchedule(),
+ "*/5 * * * *" // هر 5 دقیقه یکبار چک کن
+ );
+ }
+
+ public void SmsReminderCheckAndSchedule()
+ {
+ var now = DateTime.Now;
+
+ var startMorning = new TimeSpan(9, 0, 0);
+ var endMorning = new TimeSpan(9, 40, 0);
+
+ var startEvening = new TimeSpan(15, 30, 0);
+ var endEvening = new TimeSpan(15, 40, 0);
+
+ // صبح
+ if (now.DayOfWeek != DayOfWeek.Friday &&
+ now.TimeOfDay >= startMorning &&
+ now.TimeOfDay < endMorning)
+ {
+ if (_lastRunDateMorning?.Date != now.Date)
+ {
+ _backgroundJobClient.Enqueue(() => _smsReminder.Execute());
+ _lastRunDateMorning = now;
+ }
+ }
+
+ // عصر - پنجشنبه و جمعه تعطیل است
+ if (now.DayOfWeek != DayOfWeek.Friday &&
+ now.DayOfWeek != DayOfWeek.Thursday &&
+ now.TimeOfDay >= startEvening &&
+ now.TimeOfDay < endEvening)
+ {
+ if (_lastRunDateEvening?.Date != now.Date)
+ {
+ _backgroundJobClient.Enqueue(() => _smsReminder.Execute());
+ _lastRunDateEvening = now;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BackgroundJobs/BackgroundJobs.Task/Jobs/SmsReminder.cs b/BackgroundJobs/BackgroundJobs.Task/Jobs/SmsReminder.cs
new file mode 100644
index 00000000..3b1f4980
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/Jobs/SmsReminder.cs
@@ -0,0 +1,116 @@
+using _0_Framework.Application.Sms;
+using AccountManagement.Application.Contracts.Account;
+using AccountMangement.Infrastructure.EFCore;
+using Company.Domain.SmsResultAgg;
+using Microsoft.EntityFrameworkCore;
+using SmsResult = Company.Domain.SmsResultAgg.SmsResult;
+
+namespace BackgroundJobs.Task.Jobs;
+public class SmsReminder
+{
+ private readonly AccountContext _accountContext;
+ private readonly ISmsService _smsService;
+ private readonly ISmsResultRepository _smsResultRepository;
+
+ public SmsReminder(ISmsService smsService, AccountContext accountContext, ISmsResultRepository smsResultRepository)
+ {
+ _smsService = smsService;
+ _accountContext = accountContext;
+ _smsResultRepository = smsResultRepository;
+ }
+
+ public void Execute()
+ {
+ //var accounts = _accountContext.Accounts.Where(x => x.PositionId > 0 && x.IsActiveString == "true").Select(x => new AccountViewModel() { Id = x.id, Mobile = x.Mobile, Fullname = x.Fullname }).ToList();
+ //Thread.Sleep(300);
+ //var accounts = new List() { new AccountViewModel() { Mobile = "09114221321", Id = 2 } };
+ var accounts= _accountContext.Accounts.Where(x => x.Username.ToLower()=="mahan").Select(x => new AccountViewModel() { Id = x.id, Mobile = x.Mobile, Fullname = x.Fullname }).ToList();
+ var smsVM = accounts.Select(x => new AccountSmsTaskViewModel()
+ {
+ Mobile = x.Mobile,
+ AccountId = x.Id,
+ FullName = x.Fullname,
+ TaskCount = GetLateTasksCount(x.Id)
+ }).Where(x => x.TaskCount > 0 && !string.IsNullOrEmpty(x.Mobile) && x.Mobile.Length == 11).ToList();
+ Thread.Sleep(300);
+
+
+ foreach (var viewmodel in smsVM)
+ {
+ var smsResult = _smsService.TaskReminderSms(viewmodel.Mobile, $"{viewmodel.TaskCount}");
+ Thread.Sleep(1000);
+ var createSmsResult = new SmsResult(smsResult.MessageId, smsResult.Message, "یادآور وظایف",
+ viewmodel.FullName, viewmodel.Mobile, viewmodel.AccountId, viewmodel.AccountId);
+ _smsResultRepository.Create(createSmsResult);
+ _smsResultRepository.SaveChanges();
+ Thread.Sleep(1000);
+ }
+ }
+ private int GetLateTasksCount(long accountId)
+ {
+ var positionValue = _accountContext.Accounts
+ .Where(x => x.id == accountId)
+ .Include(p => p.Position)
+ .Select(x => x.Position.PositionValue)
+ .FirstOrDefault();
+
+ if (positionValue == 0)
+ return 0;
+
+
+ DateTime now = DateTime.Now;
+ int overdueTasksCount;
+
+ if (positionValue == 1)
+ {
+ overdueTasksCount = _accountContext.Assigns.Include(x => x.Task).Where(x => x.AssignedId == accountId &&
+ x.AssignerId == accountId && x.Task.Assigns.Count == 1 &&
+ !x.IsCancel && !x.IsCanceledRequest &&
+ !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true")
+ .GroupBy(x => x.TaskId).Select(x => x.First()).Count();
+
+ //overdueTasksCount = _accountContext.Tasks.Include(x =>
+ // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) &&
+ // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) &&
+ // !x.Assigns.Any(a => a.TimeRequest)
+ // && x.Assigns.Any(a => a.AssignedId == accountId && a.AssignerId == accountId) &&
+ // (x.Assigns.First(a => a.AssignedId == accountId && a.AssignerId == accountId)
+ // .EndTaskDate.Date <= DateTime.Now.Date) && x.Assigns.Count == 1);
+ }
+ else
+ {
+
+ overdueTasksCount = _accountContext.Assigns
+ .Include(x => x.Task)
+ .Where(x => x.AssignedId == accountId &&
+ !x.IsCancel && !x.IsCanceledRequest &&
+ !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true")
+ .GroupBy(x => x.TaskId).Select(x => x.First()).Count();
+ }
+
+
+ //overdueTasksCount = _accountContext.Tasks.Include(x =>
+ // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) &&
+ // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) &&
+ // !x.Assigns.Any(a => a.TimeRequest)
+ // && x.Assigns.Any(a => a.AssignedId == accountId) &&
+ // (x.Assigns.First(a => a.AssignedId == accountId).EndTaskDate.Date <= DateTime.Now.Date));
+
+
+ var overdueRequestsCount = _accountContext.Assigns.Include(x => x.Task)
+ .Where(x => (x.IsCanceledRequest
+ || x.IsDoneRequest || x.TimeRequest) && !x.IsCancel && !x.IsDone &&
+ x.Task.IsActiveString == "true" &&
+ x.Task.SenderId == accountId).GroupBy(x => x.TaskId).Select(x => x.First()).Count();
+
+ return overdueTasksCount + overdueRequestsCount;
+ }
+
+}
+public class AccountSmsTaskViewModel
+{
+ public int TaskCount { get; set; }
+ public long AccountId { get; set; }
+ public string Mobile { get; set; }
+ public string FullName { get; set; }
+}
\ No newline at end of file
diff --git a/BackgroundJobs/BackgroundJobs.Task/JobsBootstrapper.cs b/BackgroundJobs/BackgroundJobs.Task/JobsBootstrapper.cs
new file mode 100644
index 00000000..a89f8265
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/JobsBootstrapper.cs
@@ -0,0 +1,24 @@
+using BackgroundJobs.Task.Jobs;
+
+namespace BackgroundJobs.Task;
+
+public class JobsBootstrapper
+{
+ public static void Configure(IServiceCollection services)
+ {
+ var currentNamespace = typeof(JobSchedulerRegistrator).Namespace; // همون namespace کلاس
+
+ var assembly = typeof(JobSchedulerRegistrator).Assembly;
+
+ var jobTypes = assembly.GetTypes()
+ .Where(t =>
+ t is { IsClass: true, IsAbstract: false, Namespace: not null } &&
+ t.Namespace.StartsWith(currentNamespace, StringComparison.Ordinal))
+ .ToList();
+
+ foreach (var jobType in jobTypes)
+ {
+ services.AddTransient(jobType);
+ }
+ }
+}
\ No newline at end of file
diff --git a/BackgroundJobs/BackgroundJobs.Task/Program.cs b/BackgroundJobs/BackgroundJobs.Task/Program.cs
new file mode 100644
index 00000000..dac1199a
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/Program.cs
@@ -0,0 +1,59 @@
+using _0_Framework.Application;
+using _0_Framework.Application.Sms;
+using _0_Framework.Application.UID;
+using _0_Framework.InfraStructure.Mongo;
+using AccountManagement.Configuration;
+using BackgroundJobs.Task;
+using BackgroundJobs.Task.Jobs;
+using CompanyManagment.EFCore.Services;
+using Hangfire;
+using Microsoft.AspNetCore.Identity;
+using MongoDB.Driver;
+using PersonalContractingParty.Config;
+using Query.Bootstrapper;
+using WorkFlow.Infrastructure.Config;
+
+var builder = WebApplication.CreateBuilder(args);
+var hangfireConnectionString = builder.Configuration.GetConnectionString("HangfireDb");
+builder.Services.AddHangfire(x => x.UseSqlServerStorage(hangfireConnectionString));
+builder.Services.AddHangfireServer();
+var connectionString = builder.Configuration.GetConnectionString("MesbahDb");
+var connectionStringTestDb = builder.Configuration.GetConnectionString("TestDb");
+builder.Services.AddSingleton();
+builder.Services.AddTransient();
+builder.Services.AddTransient();
+builder.Services.AddTransient();
+builder.Services.AddTransient();
+builder.Services.Configure(builder.Configuration);
+
+#region MongoDb
+
+var mongoConnectionSection = builder.Configuration.GetSection("MongoDb");
+var mongoDbSettings = mongoConnectionSection.Get();
+var mongoClient = new MongoClient(mongoDbSettings.ConnectionString);
+var mongoDatabase = mongoClient.GetDatabase(mongoDbSettings.DatabaseName);
+
+builder.Services.AddSingleton(mongoDatabase);
+
+#endregion
+
+PersonalBootstrapper.Configure(builder.Services, connectionString);
+TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
+AccountManagementBootstrapper.Configure(builder.Services, connectionString);
+WorkFlowBootstrapper.Configure(builder.Services, connectionString);
+QueryBootstrapper.Configure(builder.Services);
+JobsBootstrapper.Configure(builder.Services);
+builder.Services.AddHttpClient();
+builder.Services.AddHttpContextAccessor();
+var app = builder.Build();
+
+app.MapHangfireDashboard();
+app.MapGet("/", () => "Hello World!");
+
+using (var scope = app.Services.CreateScope())
+{
+ var jobScheduler = scope.ServiceProvider.GetRequiredService();
+ jobScheduler.Register();
+}
+
+app.Run();
\ No newline at end of file
diff --git a/BackgroundJobs/BackgroundJobs.Task/Properties/launchSettings.json b/BackgroundJobs/BackgroundJobs.Task/Properties/launchSettings.json
new file mode 100644
index 00000000..197ad0e4
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/Properties/launchSettings.json
@@ -0,0 +1,38 @@
+{
+ "$schema": "http://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:56492",
+ "sslPort": 44378
+ }
+ },
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "http://localhost:5216",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:7222;http://localhost:5216",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/BackgroundJobs/BackgroundJobs.Task/appsettings.Development.json b/BackgroundJobs/BackgroundJobs.Task/appsettings.Development.json
new file mode 100644
index 00000000..2dc32b9b
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/appsettings.Development.json
@@ -0,0 +1,46 @@
+{
+ "DetailedErrors": true,
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "ConnectionStrings": {
+ //تست
+ //"MesbahDb": "Data Source=DESKTOP-NUE119G\\MSNEW;Initial Catalog=Mesbah_db;Integrated Security=True"
+
+ //server
+ //"MesbahDb": "Data Source=171.22.24.15;Initial Catalog=mesbah_db;Persist Security Info=False;User ID=ir_db;Password=R2rNp[170]18[3019]#@ATt;TrustServerCertificate=true;",
+
+
+ //local
+ "MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;",
+
+ //dad-mehr
+ //"MesbahDb": "Data Source=.;Initial Catalog=teamWork;Integrated Security=True;TrustServerCertificate=true;",
+
+ "TestDb": "Data Source=.;Initial Catalog=TestDb;Integrated Security=True;TrustServerCertificate=true;",
+
+ //mahan Docker
+ //"MesbahDb": "Data Source=localhost,5069;Initial Catalog=mesbah_db;User ID=sa;Password=YourPassword123;TrustServerCertificate=True;",
+ "HangfireDb": "Data Source=.;Initial Catalog=hangfire_db;Integrated Security=True;TrustServerCertificate=true;"
+ },
+
+ "GoogleRecaptchaV3": {
+ "SiteKey": "6Lfhp_AnAAAAAB79WkrMoHd1k8ir4m8VvfjE7FTH",
+ "SecretKey": "6Lfhp_AnAAAAANjDDY6DPrbbUQS7k6ZCRmrVP5Lb"
+ },
+ "SmsSecrets": {
+ "ApiKey": "Og5M562igmzJRhQPnq0GdtieYdLgtfikjzxOmeQBPxJjZtyge5Klc046Lfw1mxSa",
+ "SecretKey": "dadmehr"
+ },
+ "Domain": ".gozareshgir.ir",
+ "MongoDb": {
+ "ConnectionString": "mongodb://localhost:27017",
+ "DatabaseName": "Gozareshgir"
+ }
+
+
+}
\ No newline at end of file
diff --git a/BackgroundJobs/BackgroundJobs.Task/appsettings.json b/BackgroundJobs/BackgroundJobs.Task/appsettings.json
new file mode 100644
index 00000000..10f68b8c
--- /dev/null
+++ b/BackgroundJobs/BackgroundJobs.Task/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/Company.Domain/ContarctingPartyAgg/IPersonalContractingPartyRepository.cs b/Company.Domain/ContarctingPartyAgg/IPersonalContractingPartyRepository.cs
index 26e6e6df..068625ad 100644
--- a/Company.Domain/ContarctingPartyAgg/IPersonalContractingPartyRepository.cs
+++ b/Company.Domain/ContarctingPartyAgg/IPersonalContractingPartyRepository.cs
@@ -75,5 +75,5 @@ public interface IPersonalContractingPartyRepository :IRepository GetLegalDetails(long id);
Task GetByNationalCode(string nationalCode);
- Task GetByRegisterId(string registerId);
+ Task GetByNationalId(string registerId);
}
\ No newline at end of file
diff --git a/Company.Domain/FinancialInvoiceAgg/FinancialInvoice.cs b/Company.Domain/FinancialInvoiceAgg/FinancialInvoice.cs
new file mode 100644
index 00000000..33a33149
--- /dev/null
+++ b/Company.Domain/FinancialInvoiceAgg/FinancialInvoice.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using _0_Framework.Domain;
+using Company.Domain.PaymentTransactionAgg;
+using CompanyManagment.App.Contracts.FinancialInvoice;
+
+namespace Company.Domain.FinancialInvoiceAgg;
+
+public class FinancialInvoice : EntityBase
+{
+
+ public string InvoiceNumber { get; private set; }
+ public string Description { get; set; }
+ public FinancialInvoiceStatus Status { get; private set; }
+ public DateTime? PaidAt { get; private set; }
+ public double Amount { get; private set; }
+ public Guid PublicId { get; private set; }
+ public bool IsActive { get; set; }
+
+ public List PaymentTransactions { get; private set; }
+ public long ContractingPartyId { get; private set; }
+
+ public List Items { get; private set; }
+
+ public FinancialInvoice(double amount, long contractingPartyId, string description)
+ {
+ InvoiceNumber = GenerateInvoiceNumber();
+ Status = FinancialInvoiceStatus.Unpaid;
+ Amount = amount;
+ PublicId = Guid.NewGuid();
+ ContractingPartyId = contractingPartyId;
+ Description = description;
+ IsActive = true;
+ Items = [];
+ PaymentTransactions = [];
+ }
+
+ public void AddItem(FinancialInvoiceItem item)
+ {
+ Items ??= [];
+
+ Items.Add(item);
+ }
+
+ public void SetItems(List items)
+ {
+ Items = items;
+ }
+
+ public void SetPaid(DateTime paidAt)
+ {
+ Status = FinancialInvoiceStatus.Paid;
+ PaidAt = paidAt;
+ }
+ public void SetUnpaid()
+ {
+ Status = FinancialInvoiceStatus.Unpaid;
+ PaidAt = null;
+ }
+ public void SetCancelled()
+ {
+ Status = FinancialInvoiceStatus.Cancelled;
+ PaidAt = null;
+ }
+ public void SetRefunded()
+ {
+ Status = FinancialInvoiceStatus.Refunded;
+ PaidAt = null;
+ }
+
+ public void DeActivate()
+ {
+ IsActive = false;
+ }
+
+ public void SetInvoiceNumber(string invoiceNumber)
+ {
+ InvoiceNumber = invoiceNumber;
+ }
+
+ private string GenerateInvoiceNumber()
+ {
+ var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
+ var random = new Random().Next(1000, 9999);
+ return $"GZ_{timestamp}{random}";
+ }
+
+}
+
+public class FinancialInvoiceItem : EntityBase
+{
+ public string Description { get; private set; }
+ public double Amount { get; private set; }
+ public FinancialInvoiceItemType Type { get; set; }
+ public long EntityId { get; set; }
+ public FinancialInvoice FinancialInvoice { get; set; }
+ public long FinancialInvoiceId { get; set; }
+ public FinancialInvoiceItem(string description, double amount,
+ long financialInvoiceId, FinancialInvoiceItemType type, long entityId)
+ {
+ Description = description;
+ Amount = amount;
+ FinancialInvoiceId = financialInvoiceId;
+ Type = type;
+ EntityId = entityId;
+ }
+}
+
diff --git a/Company.Domain/FinancialInvoiceAgg/IFinancialInvoiceRepository.cs b/Company.Domain/FinancialInvoiceAgg/IFinancialInvoiceRepository.cs
new file mode 100644
index 00000000..96edcc14
--- /dev/null
+++ b/Company.Domain/FinancialInvoiceAgg/IFinancialInvoiceRepository.cs
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using _0_Framework.Domain;
+using CompanyManagment.App.Contracts.FinancialInvoice;
+
+namespace Company.Domain.FinancialInvoiceAgg;
+
+public interface IFinancialInvoiceRepository : IRepository
+{
+ EditFinancialInvoice GetDetails(long id);
+ List Search(FinancialInvoiceSearchModel searchModel);
+ Task GetUnPaidByEntityId(long entityId, FinancialInvoiceItemType financialInvoiceItemType);
+}
\ No newline at end of file
diff --git a/Company.Domain/FinancialStatmentAgg/FinancialStatment.cs b/Company.Domain/FinancialStatmentAgg/FinancialStatment.cs
index bae877fb..9f81b656 100644
--- a/Company.Domain/FinancialStatmentAgg/FinancialStatment.cs
+++ b/Company.Domain/FinancialStatmentAgg/FinancialStatment.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using _0_Framework.Domain;
+using Company.Domain.FinancialInvoiceAgg;
using Company.Domain.FinancialTransactionAgg;
namespace Company.Domain.FinancialStatmentAgg;
diff --git a/Company.Domain/FinancialStatmentAgg/IFinancialStatmentRepository.cs b/Company.Domain/FinancialStatmentAgg/IFinancialStatmentRepository.cs
index 60a1d8f6..32b10377 100644
--- a/Company.Domain/FinancialStatmentAgg/IFinancialStatmentRepository.cs
+++ b/Company.Domain/FinancialStatmentAgg/IFinancialStatmentRepository.cs
@@ -22,6 +22,8 @@ public interface IFinancialStatmentRepository : IRepository> GetDetailsByPublicId(string publicId);
Task GetBalanceAmount(long id);
Task GetClientDebtAmount(long accountId);
- Task GetDetailsByContractingParty(long contractingPartyId,FinancialStatementSearchModel searchModel);
+ Task GetClientDebtAmountByContractingPartyId(long contractingPartyId);
+
+ Task GetDetailsByContractingParty(long contractingPartyId,FinancialStatementSearchModel searchModel);
Task GetByContractingPartyId(long contractingPartyId);
}
\ No newline at end of file
diff --git a/Company.Domain/FinancialTransactionAgg/FinancialTransaction.cs b/Company.Domain/FinancialTransactionAgg/FinancialTransaction.cs
index 65c20a40..061836b3 100644
--- a/Company.Domain/FinancialTransactionAgg/FinancialTransaction.cs
+++ b/Company.Domain/FinancialTransactionAgg/FinancialTransaction.cs
@@ -26,6 +26,35 @@ public class FinancialTransaction : EntityBase
}
+ ///
+ /// ایجاد از طرف بک گراند سرویس
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public FinancialTransaction(long financialStatementId, DateTime tdateGr, string tdateFa, string description,
+ string typeOfTransaction, string descriptionOption, double deptor, double creditor, double balance,
+ bool sentSms)
+ {
+ FinancialStatementId = financialStatementId;
+ TdateGr = tdateGr;
+ TdateFa = tdateFa;
+ Description = description;
+ TypeOfTransaction = typeOfTransaction;
+ DescriptionOption = descriptionOption;
+ Deptor = deptor;
+ Creditor = creditor;
+ Balance = balance;
+ SentSms = sentSms;
+ }
+
public long FinancialStatementId { get; private set; }
public DateTime TdateGr { get; private set; }
public string TdateFa { get; private set; }
diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs
index 3443e520..70b7740e 100644
--- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs
+++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.Application;
+using _0_Framework.Application.Enums;
using _0_Framework.Domain;
using CompanyManagment.App.Contracts.InstitutionContract;
using CompanyManagment.App.Contracts.Workshop;
@@ -43,7 +44,7 @@ public interface IInstitutionContractRepository : IRepository
///
///
- void RollcallServiceCreateTransaction();
+ Task RollCallServiceCreateTransaction();
Task> GetList(InstitutionContractListSearchModel searchModel);
Task GetListStats(InstitutionContractListSearchModel searchModel);
@@ -79,4 +80,71 @@ public interface IInstitutionContractRepository : IRepository GetContractWorkshopsDetails(long id);
Task AmendmentComplete(InstitutionContractAmendmentCompleteRequest request);
Task GetAmendmentVerificationDetails(Guid id, long amendmentId);
+
+
+ #region ReminderSMS
+ ///
+ /// دریافت لیست - ارسال پیامک
+ /// فراخوانی از سمت بک گراند سرویس
+ ///
+ ///
+ Task SendReminderSmsForBackgroundTask();
+
+ ///
+ /// ارسال پیامک صورت حساب ماهانه
+ ///
+ ///
+ ///
+ Task SendMonthlySms(DateTime now);
+
+ ///
+ /// ارسال پیامک مسدودی از طرف بک گراند سرویس
+ ///
+ ///
+ Task SendBlockSmsForBackgroundTask();
+
+ ///
+ /// دریافت لیست واجد شرایط بلاک
+ /// جهت ارسال پیامک مسدودی
+ ///
+ ///
+ ///
+ Task> GetBlockListData(DateTime checkDate);
+
+ ///
+ /// ارسال پیامک مسدودی
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task SendBlockSmsToContractingParties(List smsListData, string typeOfSms,
+ string sendMessStart, string sendMessEnd);
+
+ ///
+ ///دریافت لیست بدهکارن
+ /// جهت ارسال پیامک
+ ///
+ ///
+ Task> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting);
+
+ ///
+ /// ارسال پیامک های یاد آور بدهی
+ ///
+ ///
+ Task SendReminderSmsToContractingParties(List smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
+
+ #endregion
+
+ #region CreateMontlyTransaction
+
+ ///
+ /// ایجاد سند مالی برای قرارداد ها
+ ///
+ ///
+ Task CreateTransactionForInstitutionContracts(DateTime endOfMonthGr, string endOfMonthFa, string description);
+
+
+ #endregion
}
\ No newline at end of file
diff --git a/Company.Domain/InstitutionContractAgg/InstitutionContract.cs b/Company.Domain/InstitutionContractAgg/InstitutionContract.cs
index 78caa1ce..ff2cfae7 100644
--- a/Company.Domain/InstitutionContractAgg/InstitutionContract.cs
+++ b/Company.Domain/InstitutionContractAgg/InstitutionContract.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Security.Cryptography;
+using _0_Framework.Application.Enums;
using _0_Framework.Domain;
using Company.Domain.InstitutionContractContactInfoAgg;
using CompanyManagment.App.Contracts.InstitutionContract;
@@ -462,20 +463,3 @@ public enum InstitutionContractAmendmentChangeType
WorkshopCreated
}
-public enum InstitutionContractVerificationStatus
-{
- ///
- /// در انتظار تایید
- ///
- PendingForVerify = 0,
-
- ///
- /// در انتظار کارپوشه
- ///
- PendingWorkflow = 1,
-
- ///
- /// تایید شده
- ///
- Verified = 2
-}
\ No newline at end of file
diff --git a/Company.Domain/PaymentTransactionAgg/PaymentTransaction.cs b/Company.Domain/PaymentTransactionAgg/PaymentTransaction.cs
index 7a2b1b24..46a1c8d9 100644
--- a/Company.Domain/PaymentTransactionAgg/PaymentTransaction.cs
+++ b/Company.Domain/PaymentTransactionAgg/PaymentTransaction.cs
@@ -1,5 +1,6 @@
using System;
using _0_Framework.Domain;
+using Company.Domain.FinancialInvoiceAgg;
using CompanyManagment.App.Contracts.PaymentTransaction;
namespace Company.Domain.PaymentTransactionAgg;
@@ -9,14 +10,15 @@ namespace Company.Domain.PaymentTransactionAgg;
///
public class PaymentTransaction:EntityBase
{
- ///
- /// سازنده کلاس PaymentTransaction با دریافت اطلاعات تراکنش.
- ///
- /// شناسه طرف قرارداد
- /// مبلغ تراکنش
- ///
- ///
- public PaymentTransaction(long contractingPartyId,
+ ///
+ /// سازنده کلاس PaymentTransaction با دریافت اطلاعات تراکنش.
+ ///
+ /// شناسه طرف قرارداد
+ /// مبلغ تراکنش
+ ///
+ ///
+ ///
+ public PaymentTransaction(long contractingPartyId,
double amount,
string contractingPartyName,string callBackUrl,
PaymentTransactionGateWay gateway)
@@ -74,6 +76,9 @@ public class PaymentTransaction:EntityBase
public string Rrn { get; private set; }
public string DigitalReceipt { get; private set; }
+ public FinancialInvoice FinancialInvoice { get; set; }
+ public long? FinancialInvoiceId { get; set; }
+
public void SetPaid(string cardNumber,string bankName,string rrn,string digitalReceipt)
{
diff --git a/Company.Domain/SmsResultAgg/ISmsSettingsRepository.cs b/Company.Domain/SmsResultAgg/ISmsSettingsRepository.cs
new file mode 100644
index 00000000..a2c864a5
--- /dev/null
+++ b/Company.Domain/SmsResultAgg/ISmsSettingsRepository.cs
@@ -0,0 +1,30 @@
+using _0_Framework.Application.Enums;
+using _0_Framework.Domain;
+using CompanyManagment.App.Contracts.SmsResult;
+using System.Threading.Tasks;
+
+namespace Company.Domain.SmsResultAgg;
+
+public interface ISmsSettingsRepository : IRepository
+{
+ ///
+ /// ویرایش پیامک خودکار
+ ///
+ ///
+ ///
+ Task GetSmsSettingToEdit(long id);
+
+ ///
+ /// دریافت لیست پیامک های خودکار بر اساس نوع آن
+ ///
+ ///
+ ///
+ Task GetSmsSettingsByType(TypeOfSmsSetting typeOfSmsSetting);
+
+ ///
+ /// حذف از دیتابیس
+ ///
+ ///
+ ///
+ Task RemoveItem(long id);
+}
\ No newline at end of file
diff --git a/Company.Domain/SmsResultAgg/SmsSetting.cs b/Company.Domain/SmsResultAgg/SmsSetting.cs
new file mode 100644
index 00000000..3ca835fa
--- /dev/null
+++ b/Company.Domain/SmsResultAgg/SmsSetting.cs
@@ -0,0 +1,72 @@
+using _0_Framework.Application.Enums;
+using _0_Framework.Domain;
+using System;
+
+namespace Company.Domain.SmsResultAgg;
+
+public class SmsSetting : EntityBaseWithoutCreationDate
+{
+ ///
+ /// ایجاد تنظیمات پیامک
+ ///
+ ///
+ ///
+ ///
+ public SmsSetting(TypeOfSmsSetting typeOfSmsSetting, int dayOfMonth, TimeSpan timeOfDay)
+ {
+ TypeOfSmsSetting = typeOfSmsSetting;
+ DayOfMonth = dayOfMonth;
+ TimeOfDay = timeOfDay;
+ IsActive = true;
+ }
+
+ ///
+ /// نوع پیامک
+ ///
+ public TypeOfSmsSetting TypeOfSmsSetting { get; set; }
+
+ ///
+ /// عدد روز از ماه
+ ///
+ public int DayOfMonth { get; set; }
+
+
+ ///
+ /// ساعت
+ ///
+ public TimeSpan TimeOfDay { get; set; }
+
+ ///
+ /// فعال/غیرفعال
+ ///
+ public bool IsActive { get; set; }
+
+ ///
+ /// ویرایش تنظیمات پیامک
+ ///
+ ///
+ ///
+ public void Edit(int dayOfMonth, TimeSpan timeOfDay)
+ {
+ DayOfMonth = dayOfMonth;
+ TimeOfDay = timeOfDay;
+ }
+
+ ///
+ /// فعال نمودن
+ ///
+ public void Active()
+ {
+ IsActive = true;
+ }
+
+ ///
+ /// غیر فعال نمودن
+ ///
+ public void DeActive()
+ {
+ IsActive = false;
+ }
+
+
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialInvoice/CreateFinancialInvoice.cs b/CompanyManagment.App.Contracts/FinancialInvoice/CreateFinancialInvoice.cs
new file mode 100644
index 00000000..0ce5a82b
--- /dev/null
+++ b/CompanyManagment.App.Contracts/FinancialInvoice/CreateFinancialInvoice.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+
+namespace CompanyManagment.App.Contracts.FinancialInvoice;
+
+public class CreateFinancialInvoice
+{
+ public double Amount { get; set; }
+ public long ContractingPartyId { get; set; }
+ public string Description { get; set; }
+ public List? Items { get; set; }
+}
+
+public class CreateFinancialInvoiceItem
+{
+ public string Description { get; set; }
+ public double Amount { get; set; }
+ public FinancialInvoiceItemType Type { get; set; }
+ public long EntityId { get; set; }
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialInvoice/EditFinancialInvoice.cs b/CompanyManagment.App.Contracts/FinancialInvoice/EditFinancialInvoice.cs
new file mode 100644
index 00000000..1975c32a
--- /dev/null
+++ b/CompanyManagment.App.Contracts/FinancialInvoice/EditFinancialInvoice.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+namespace CompanyManagment.App.Contracts.FinancialInvoice;
+
+public class EditFinancialInvoice
+{
+ public long Id { get; set; }
+ public string InvoiceNumber { get; set; }
+ public string Description { get; set; }
+ public double Amount { get; set; }
+ public FinancialInvoiceStatus Status { get; set; }
+
+ public List? Items { get; set; }
+}
+
+public class EditFinancialInvoiceItem
+{
+ public long Id { get; set; }
+ public string Description { get; set; }
+ public double Amount { get; set; }
+ public FinancialInvoiceItemType Type { get; set; }
+ public long EntityId { get; set; }
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceItemType.cs b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceItemType.cs
new file mode 100644
index 00000000..3d065748
--- /dev/null
+++ b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceItemType.cs
@@ -0,0 +1,25 @@
+namespace CompanyManagment.App.Contracts.FinancialInvoice;
+
+public enum FinancialInvoiceItemType
+{
+ ///
+ /// قسط قرارداد خرید از موسسه
+ ///
+ BuyInstitutionContractInstallment,
+ ///
+ /// خرید قرارداد از موسسه
+ ///
+ BuyInstitutionContract,
+ ///
+ ///قسط ارتقا قرارداد موسسه
+ ///
+ AmendmentInstitutionContractInstallment,
+ ///
+ /// ارتقا قرارداد موسسه
+ ///
+ AmendmentInstitutionContract,
+ ///
+ /// بدهی قبلی
+ ///
+ PreviousDebt,
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceSearchModel.cs b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceSearchModel.cs
new file mode 100644
index 00000000..3dfb4c0f
--- /dev/null
+++ b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceSearchModel.cs
@@ -0,0 +1,12 @@
+namespace CompanyManagment.App.Contracts.FinancialInvoice;
+
+public class FinancialInvoiceSearchModel
+{
+ public string? Description { get; set; }
+ public FinancialInvoiceStatus? Status { get; set; }
+ public long? ContractingPartyId { get; set; }
+ public string? FromDate { get; set; }
+ public string? ToDate { get; set; }
+ public double? MinAmount { get; set; }
+ public double? MaxAmount { get; set; }
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceStatus.cs b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceStatus.cs
new file mode 100644
index 00000000..efdf343b
--- /dev/null
+++ b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceStatus.cs
@@ -0,0 +1,21 @@
+namespace CompanyManagment.App.Contracts.FinancialInvoice;
+
+public enum FinancialInvoiceStatus
+{
+ ///
+ /// پرداخت نشده
+ ///
+ Unpaid = 0,
+ ///
+ /// پرداخت شده کامل
+ ///
+ Paid = 1,
+ ///
+ /// فاکتور لغو شده
+ ///
+ Cancelled = 4,
+ ///
+ /// // بازپرداخت شده (در صورت برگشت وجه)
+ ///
+ Refunded = 5,
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceViewModel.cs b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceViewModel.cs
new file mode 100644
index 00000000..8d2e3416
--- /dev/null
+++ b/CompanyManagment.App.Contracts/FinancialInvoice/FinancialInvoiceViewModel.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace CompanyManagment.App.Contracts.FinancialInvoice;
+
+public class FinancialInvoiceViewModel
+{
+ public long Id { get; set; }
+ public string InvoiceNumber { get; set; }
+ public string Description { get; set; }
+ public string Status { get; set; }
+ public string PaidAt { get; set; }
+ public double Amount { get; set; }
+ public Guid PublicId { get; set; }
+ public long ContractingPartyId { get; set; }
+ public string ContractingPartyName { get; set; }
+ public string CreationDate { get; set; }
+ public int ItemsCount { get; set; }
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialInvoice/IFinancialInvoiceApplication.cs b/CompanyManagment.App.Contracts/FinancialInvoice/IFinancialInvoiceApplication.cs
new file mode 100644
index 00000000..70ce9123
--- /dev/null
+++ b/CompanyManagment.App.Contracts/FinancialInvoice/IFinancialInvoiceApplication.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using _0_Framework.Application;
+
+namespace CompanyManagment.App.Contracts.FinancialInvoice;
+
+public interface IFinancialInvoiceApplication
+{
+ OperationResult Create(CreateFinancialInvoice command);
+ OperationResult Edit(EditFinancialInvoice command);
+ OperationResult SetPaid(long id, DateTime paidAt);
+ OperationResult SetUnpaid(long id);
+ OperationResult SetCancelled(long id);
+ OperationResult SetRefunded(long id);
+ EditFinancialInvoice GetDetails(long id);
+ List Search(FinancialInvoiceSearchModel searchModel);
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/FinancialStatment/FinancialStatmentViewModel.cs b/CompanyManagment.App.Contracts/FinancialStatment/FinancialStatmentViewModel.cs
index 4b63cb82..01976a5e 100644
--- a/CompanyManagment.App.Contracts/FinancialStatment/FinancialStatmentViewModel.cs
+++ b/CompanyManagment.App.Contracts/FinancialStatment/FinancialStatmentViewModel.cs
@@ -9,6 +9,7 @@ public class FinancialStatmentViewModel
public long Id { get; set; }
public long ContractingPartyId { get; set; }
public string ContractingPartyName { get; set; }
+ public string PublicId { get; set; }
public List FinancialTransactionViewModels { get; set; }
diff --git a/CompanyManagment.App.Contracts/FinancilTransaction/FinancialTransactionViewModel.cs b/CompanyManagment.App.Contracts/FinancilTransaction/FinancialTransactionViewModel.cs
index 42b0b017..9866db57 100644
--- a/CompanyManagment.App.Contracts/FinancilTransaction/FinancialTransactionViewModel.cs
+++ b/CompanyManagment.App.Contracts/FinancilTransaction/FinancialTransactionViewModel.cs
@@ -10,6 +10,7 @@ public class FinancialTransactionViewModel
public string TdateFa { get; set; }
public string Description { get; set; }
public string TypeOfTransaction { get; set; }
+ public string DescriptionOption { get; set; }
public double Deptor { get; set; }
public string DeptorString { get; set; }
public double Creditor { get; set; }
@@ -20,4 +21,7 @@ public class FinancialTransactionViewModel
public string MessageText { get; set; }
public string SentSmsDateFa { get; set; }
public int Counter { get; set; }
+
+
+
}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/Hubs/SendSmsHub.cs b/CompanyManagment.App.Contracts/Hubs/SendSmsHub.cs
new file mode 100644
index 00000000..0327bf2d
--- /dev/null
+++ b/CompanyManagment.App.Contracts/Hubs/SendSmsHub.cs
@@ -0,0 +1,20 @@
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.SignalR;
+
+namespace CompanyManagment.App.Contracts.Hubs;
+
+
+public class SendSmsHub : Hub
+{
+
+ public async Task send(long id)
+ {
+ await Groups.AddToGroupAsync(Context.ConnectionId, GetGroupName(id));
+ }
+
+ public static string GetGroupName(long id)
+ {
+ return $"group-sms-{id}";
+ }
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs
index 4bae5409..6c6adfa1 100644
--- a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs
+++ b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs
@@ -213,7 +213,7 @@ public interface IInstitutionContractApplication
Task GetVerificationDetails(Guid id);
Task> SendVerifyOtp(Guid id);
- Task VerifyOtp(Guid publicId, string code);
+ Task> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl);
Task GetWorkshopInitialDetails(long workshopDetailsId);
#region Extension
@@ -252,6 +252,8 @@ public interface IInstitutionContractApplication
///
Task PrintOneAsync(long id);
+ Task SetPendingWorkflow(long entityId);
+
Task GetContractWorkshopsDetails(long id);
Task GetAmendmentVerificationDetails(Guid id, long amendmentId);
diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractInstallmentViewModel.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractInstallmentViewModel.cs
index 86655873..77bee51d 100644
--- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractInstallmentViewModel.cs
+++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractInstallmentViewModel.cs
@@ -27,7 +27,13 @@ public class InstitutionContractInstallmentViewModel
/// مبلغ قسط
///
public string Amount { get; set; }
-
+
+ ///
+ /// مبلغ قسط
+ /// Double
+ ///
+ public double AmountDouble { get; set; }
+
///
/// عدد قسط فارسی
///
diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractViewModel.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractViewModel.cs
index 5a4478fe..2b3032cc 100644
--- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractViewModel.cs
+++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractViewModel.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using _0_Framework.Application.Enums;
using CompanyManagment.App.Contracts.Employer;
using CompanyManagment.App.Contracts.Workshop;
@@ -25,6 +26,7 @@ public class InstitutionContractViewModel
public DateTime ContractEndGr { get; set; }
public string ContractEndFa { get; set; }
public string ContractAmount { get; set; }
+ public double ContractAmountDouble { get; set; }
public string DailyCompenseation { get; set; }
public string Obligation { get; set; }
@@ -70,4 +72,9 @@ public class InstitutionContractViewModel
public int LeftWorkEmployeeCount { get; set; }
public int InsuranceLeftWorkEmployeeCount { get; set; }
public string IsExpier { get; set; }
+
+ public bool IsInstallment { get; set; }
+ public InstitutionContractVerificationStatus VerificationStatus { get; set; }
+
+ public List InstallmentList { get; set; }
}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/InstitutionContract/SmsListData.cs b/CompanyManagment.App.Contracts/InstitutionContract/SmsListData.cs
new file mode 100644
index 00000000..35a89e68
--- /dev/null
+++ b/CompanyManagment.App.Contracts/InstitutionContract/SmsListData.cs
@@ -0,0 +1,97 @@
+namespace CompanyManagment.App.Contracts.InstitutionContract;
+
+///
+/// لیست پیامکهای بدهکاران قرارداد ملی
+///
+public class SmsListData
+{
+ ///
+ /// شماره تماس طرف حساب
+ ///
+ public string PhoneNumber { get; set; }
+ ///
+ /// تمپلیت آی دی
+ ///
+ public int TemplateId { get; set; }
+
+ ///
+ /// نام طرف حساب
+ ///
+ public string PartyName { get; set; }
+
+ ///
+ /// مبلغ بدهی
+ ///
+ public string Amount { get; set; }
+ ///
+ /// آی دی طرف حساب
+ ///
+ public long ContractingPartyId { get; set; }
+
+ ///
+ /// آی دی صورت حساب مالی
+ ///
+ public string AproveId { get; set; }
+
+ ///
+ /// نوع متد ارسال پیامک
+ ///
+ public string TypeOfSmsMethod { get; set; }
+
+ ///
+ /// پابلیک آی دی بخش یک
+ ///
+ public string Code1 { get; set; }
+
+ ///
+ /// پابلیک آی دی بخش دو
+ ///
+ public string Code2 { get; set; }
+
+ ///
+ /// ای دی قراداد مالی
+ ///
+ public long InstitutionContractId { get; set; }
+}
+
+///
+/// لیست پیامک های بلاک
+///
+public class BlockSmsListData
+{
+ ///
+ /// شماره تماس طرف حساب
+ ///
+ public string PhoneNumber { get; set; }
+
+ ///
+ /// نام طرف حساب
+ ///
+ public string PartyName { get; set; }
+
+ ///
+ /// مبلغ بدهی
+ ///
+ public string Amount { get; set; }
+ ///
+ /// آی دی طرف حساب
+ ///
+ public long ContractingPartyId { get; set; }
+
+
+
+ ///
+ /// نوع حساب - رسمی یا غیر رسمی
+ ///
+ public string AccountType { get; set; }
+
+ ///
+ /// ای دی قراداد مالی
+ ///
+ public long InstitutionContractId { get; set; }
+
+ ///
+ /// آی دی صورت حساب مالی
+ ///
+ public string AproveId { get; set; }
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/SmsResult/CreateSmsSetting.cs b/CompanyManagment.App.Contracts/SmsResult/CreateSmsSetting.cs
new file mode 100644
index 00000000..f467ca34
--- /dev/null
+++ b/CompanyManagment.App.Contracts/SmsResult/CreateSmsSetting.cs
@@ -0,0 +1,62 @@
+using _0_Framework.Application.Enums;
+using System;
+using System.Collections.Generic;
+using _0_Framework.Domain;
+
+namespace CompanyManagment.App.Contracts.SmsResult;
+
+///
+/// مدل ایجاد تنظیمات پیامک
+///
+public class CreateSmsSetting
+{
+ ///
+ /// نوع پیامک
+ ///
+ public TypeOfSmsSetting TypeOfSmsSetting { get; set; }
+
+ ///
+ /// عدد روز از ماه
+ ///
+ public int DayOfMonth { get; set; }
+
+
+ ///
+ /// ساعت
+ ///
+ public TimeSpan TimeOfDay { get; set; }
+
+
+}
+
+///
+/// ویرایش تنظیمات پیامک
+///
+public class EditSmsSetting : CreateSmsSetting
+{
+ ///
+ /// آی دی
+ ///
+ public long Id { get; set; }
+
+ ///
+ /// فعال/غیرفعال
+ ///
+ public bool IsActive { get; set; }
+
+ ///
+ /// نمایش ساعت و دقیقه
+ ///
+ public string TimeOfDayDisplay { get; set; }
+}
+
+///
+/// ویو مدل تنظیمات پیامک
+///
+public class SmsSettingViewModel
+{
+ ///
+ /// لیست تنظیمات پیامک
+ ///
+ public List EditSmsSettings { get; set; }
+}
diff --git a/CompanyManagment.App.Contracts/SmsResult/ISmsSettingApplication.cs b/CompanyManagment.App.Contracts/SmsResult/ISmsSettingApplication.cs
new file mode 100644
index 00000000..49fdc4e8
--- /dev/null
+++ b/CompanyManagment.App.Contracts/SmsResult/ISmsSettingApplication.cs
@@ -0,0 +1,78 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using _0_Framework.Application;
+using _0_Framework.Application.Enums;
+using CompanyManagment.App.Contracts.InstitutionContract;
+
+namespace CompanyManagment.App.Contracts.SmsResult;
+
+public interface ISmsSettingApplication
+{
+
+ ///
+ /// دریافت لیست پیامک های خودکار بر اساس نوع آن
+ ///
+ ///
+ ///
+ public Task GetSmsSettingsByType(TypeOfSmsSetting typeOfSmsSetting);
+
+ ///
+ /// ایجاد تنظیمات پیامک یادآور
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task CreateSmsSetting(int dayOfMonth, string timeOfDay, TypeOfSmsSetting typeOfSmsSetting);
+
+ ///
+ /// ویرایش پیامک خودکار
+ ///
+ ///
+ ///
+ Task GetSmsSettingToEdit(long id);
+
+ ///
+ /// ایجاد تنظیمات پیامک یادآور
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task EditeSmsSetting(EditSmsSetting command);
+
+ ///
+ /// حذف از دیتابیس
+ ///
+ ///
+ ///
+ Task RemoveSetting(long id);
+
+ ///
+ /// دریافت لیست بدهکاران
+ ///
+ ///
+ ///
+ Task> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting);
+
+ ///
+ /// دریافت لیست کسانی که باید بلاک شوند
+ ///
+ ///
+ ///
+ Task> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting);
+
+ ///
+ /// ارسال پیامک یاد آور آنی
+ ///
+ ///
+ ///
+ Task InstantSendReminderSms(List command);
+
+ ///
+ /// ارسال پیامک مسدودس
+ ///
+ ///
+ ///
+ Task InstantSendBlockSms(List command);
+}
\ No newline at end of file
diff --git a/CompanyManagment.Application/FinancialInvoiceApplication.cs b/CompanyManagment.Application/FinancialInvoiceApplication.cs
new file mode 100644
index 00000000..59a7fdd9
--- /dev/null
+++ b/CompanyManagment.Application/FinancialInvoiceApplication.cs
@@ -0,0 +1,214 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using _0_Framework.Application;
+using _0_Framework.InfraStructure;
+using Company.Domain.FinancialInvoiceAgg;
+using CompanyManagment.App.Contracts.FinancialInvoice;
+using CompanyManagment.EFCore;
+
+namespace CompanyManagment.Application;
+
+public class FinancialInvoiceApplication : RepositoryBase, IFinancialInvoiceApplication
+{
+ private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
+ private readonly CompanyContext _context;
+
+ public FinancialInvoiceApplication(IFinancialInvoiceRepository financialInvoiceRepository, CompanyContext context) : base(context)
+ {
+ _financialInvoiceRepository = financialInvoiceRepository;
+ _context = context;
+ }
+
+ public OperationResult Create(CreateFinancialInvoice command)
+ {
+ var operation = new OperationResult();
+
+ if (command.Amount <= 0)
+ return operation.Failed("مبلغ فاکتور باید بزرگتر از صفر باشد");
+
+ if (command.ContractingPartyId <= 0)
+ return operation.Failed("طرف قرارداد نامعتبر است");
+
+ if (string.IsNullOrWhiteSpace(command.Description))
+ return operation.Failed("توضیحات فاکتور الزامی است");
+
+ var financialInvoice = new FinancialInvoice(command.Amount, command.ContractingPartyId, command.Description);
+
+ if (command.Items != null && command.Items.Any())
+ {
+ foreach (var item in command.Items)
+ {
+ if (string.IsNullOrWhiteSpace(item.Description))
+ return operation.Failed("توضیحات آیتم الزامی است");
+
+ if (item.Amount <= 0)
+ return operation.Failed("مبلغ آیتم باید بزرگتر از صفر باشد");
+
+ var invoiceItem = new FinancialInvoiceItem(item.Description, item.Amount,
+ financialInvoice.id, item.Type, item.EntityId);
+
+ financialInvoice.AddItem(invoiceItem);
+ }
+ }
+
+ _financialInvoiceRepository.Create(financialInvoice);
+ _financialInvoiceRepository.SaveChanges();
+
+ return operation.Succcedded();
+ }
+
+ public OperationResult Edit(EditFinancialInvoice command)
+ {
+ var operation = new OperationResult();
+ var financialInvoice = _financialInvoiceRepository.Get(command.Id);
+
+ if (financialInvoice == null)
+ return operation.Failed("فاکتور مورد نظر یافت نشد");
+
+ if (financialInvoice.Status == FinancialInvoiceStatus.Paid)
+ return operation.Failed("امکان ویرایش فاکتور پرداخت شده وجود ندارد");
+
+ if (string.IsNullOrWhiteSpace(command.Description))
+ return operation.Failed("توضیحات فاکتور الزامی است");
+
+ // Update description
+ financialInvoice.Description = command.Description;
+
+ // Update items if provided
+ if (command.Items != null)
+ {
+ // Clear existing items
+ if (financialInvoice.Items != null)
+ {
+ financialInvoice.Items.Clear();
+ }
+ else
+ {
+ financialInvoice.SetItems([]);
+ }
+
+ // Add updated items
+ foreach (var item in command.Items)
+ {
+ if (string.IsNullOrWhiteSpace(item.Description))
+ return operation.Failed("توضیحات آیتم الزامی است");
+
+ if (item.Amount <= 0)
+ return operation.Failed("مبلغ آیتم باید بزرگتر از صفر باشد");
+
+ var invoiceItem = new FinancialInvoiceItem(item.Description, item.Amount,
+ financialInvoice.id, item.Type, item.EntityId);
+
+ financialInvoice.AddItem(invoiceItem);
+ }
+ }
+
+ _financialInvoiceRepository.SaveChanges();
+ return operation.Succcedded();
+ }
+
+ public OperationResult SetPaid(long id, DateTime paidAt)
+ {
+ var operation = new OperationResult();
+ var financialInvoice = _financialInvoiceRepository.Get(id);
+
+ if (financialInvoice == null)
+ return operation.Failed("فاکتور مورد نظر یافت نشد");
+
+ if (financialInvoice.Status == FinancialInvoiceStatus.Paid)
+ return operation.Failed("فاکتور قبلاً پرداخت شده است");
+
+ if (financialInvoice.Status == FinancialInvoiceStatus.Cancelled)
+ return operation.Failed("امکان پرداخت فاکتور لغو شده وجود ندارد");
+
+ financialInvoice.SetPaid(paidAt);
+ _financialInvoiceRepository.SaveChanges();
+
+ return operation.Succcedded();
+ }
+
+ public OperationResult SetUnpaid(long id)
+ {
+ var operation = new OperationResult();
+ var financialInvoice = _financialInvoiceRepository.Get(id);
+
+ if (financialInvoice == null)
+ return operation.Failed("فاکتور مورد نظر یافت نشد");
+
+ financialInvoice.SetUnpaid();
+ _financialInvoiceRepository.SaveChanges();
+
+ return operation.Succcedded();
+ }
+
+ public OperationResult SetCancelled(long id)
+ {
+ var operation = new OperationResult();
+ var financialInvoice = _financialInvoiceRepository.Get(id);
+
+ if (financialInvoice == null)
+ return operation.Failed("فاکتور مورد نظر یافت نشد");
+
+ if (financialInvoice.Status == FinancialInvoiceStatus.Paid)
+ return operation.Failed("امکان لغو فاکتور پرداخت شده وجود ندارد");
+
+ financialInvoice.SetCancelled();
+ _financialInvoiceRepository.SaveChanges();
+
+ return operation.Succcedded();
+ }
+
+ public OperationResult SetRefunded(long id)
+ {
+ var operation = new OperationResult();
+ var financialInvoice = _financialInvoiceRepository.Get(id);
+
+ if (financialInvoice == null)
+ return operation.Failed("فاکتور مورد نظر یافت نشد");
+
+ if (financialInvoice.Status != FinancialInvoiceStatus.Paid)
+ return operation.Failed("فقط فاکتورهای پرداخت شده قابل بازپرداخت هستند");
+
+ financialInvoice.SetRefunded();
+ _financialInvoiceRepository.SaveChanges();
+
+ return operation.Succcedded();
+ }
+
+ public EditFinancialInvoice GetDetails(long id)
+ {
+ return _financialInvoiceRepository.GetDetails(id);
+ }
+
+ public List Search(FinancialInvoiceSearchModel searchModel)
+ {
+ return _financialInvoiceRepository.Search(searchModel);
+ }
+
+ //public OperationResult Remove(long id)
+ //{
+ // var operation = new OperationResult();
+
+ // try
+ // {
+ // var financialInvoice = _financialInvoiceRepository.Get(id);
+
+ // if (financialInvoice == null)
+ // return operation.Failed("فاکتور مورد نظر یافت نشد");
+
+ // if (financialInvoice.Status == FinancialInvoiceStatus.Paid)
+ // return operation.Failed("امکان حذف فاکتور پرداخت شده وجود ندارد");
+
+ // // Remove the entity using the context directly since Remove method might not be available
+ // _context.FinancialInvoiceSet.Remove(financialInvoice);
+ // _financialInvoiceRepository.SaveChanges();
+
+ // return operation.Succcedded();
+ // }
+ // catch (Exception ex)
+ // {
+ // return operation.Failed("خطا در حذف فاکتور");
+ // }
+ //}
+}
\ No newline at end of file
diff --git a/CompanyManagment.Application/InstitutionContractApplication.cs b/CompanyManagment.Application/InstitutionContractApplication.cs
index 72261f9c..567a2691 100644
--- a/CompanyManagment.Application/InstitutionContractApplication.cs
+++ b/CompanyManagment.Application/InstitutionContractApplication.cs
@@ -2,10 +2,12 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
+using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using _0_Framework.Application;
using _0_Framework.Application.Enums;
+using _0_Framework.Application.PaymentGateway;
using _0_Framework.Application.Sms;
using _0_Framework.Application.UID;
using _0_Framework.Exceptions;
@@ -13,16 +15,20 @@ using AccountManagement.Application.Contracts.Account;
using Company.Domain.ContarctingPartyAgg;
using Company.Domain.EmployeeAgg;
using Company.Domain.empolyerAgg;
+using Company.Domain.FinancialInvoiceAgg;
using Company.Domain.FinancialStatmentAgg;
using Company.Domain.FinancialTransactionAgg;
using Company.Domain.InstitutionContractAgg;
using Company.Domain.LeftWorkAgg;
+using Company.Domain.PaymentTransactionAgg;
using Company.Domain.RepresentativeAgg;
using Company.Domain.TemporaryClientRegistrationAgg;
using Company.Domain.WorkshopAgg;
+using CompanyManagment.App.Contracts.FinancialInvoice;
using CompanyManagment.App.Contracts.FinancialStatment;
using CompanyManagment.App.Contracts.InstitutionContract;
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
+using CompanyManagment.App.Contracts.PaymentTransaction;
using CompanyManagment.App.Contracts.PersonalContractingParty;
using CompanyManagment.App.Contracts.Workshop;
using CompanyManagment.EFCore.Migrations;
@@ -36,1356 +42,1449 @@ namespace CompanyManagment.Application;
public class InstitutionContractApplication : IInstitutionContractApplication
{
- private readonly IInstitutionContractRepository _institutionContractRepository;
- private readonly IPersonalContractingPartyRepository _contractingPartyRepository;
- private readonly IRepresentativeRepository _representativeRepository;
- private readonly IFinancialStatmentApplication _financialStatmentApplication;
- private readonly IEmployerRepository _employerRepository;
- private readonly IWorkshopRepository _workshopRepository;
- private readonly ILeftWorkRepository _leftWorkRepository;
- private readonly IWorkshopApplication _workshopApplication;
- private readonly IContractingPartyTempRepository _contractingPartyTempRepository;
- private readonly IFinancialStatmentRepository _financialStatmentRepository;
- private readonly IContactInfoApplication _contactInfoApplication;
- private readonly IAccountApplication _accountApplication;
- private readonly ISmsService _smsService;
- private readonly IUidService _uidService;
-
-
- public InstitutionContractApplication(IInstitutionContractRepository institutionContractRepository,
- IPersonalContractingPartyRepository contractingPartyRepository,
- IRepresentativeRepository representativeRepository, IEmployerRepository employerRepository,
- IWorkshopRepository workshopRepository, ILeftWorkRepository leftWorkRepository,
- IFinancialStatmentApplication financialStatmentApplication, IWorkshopApplication workshopApplication,
- IContractingPartyTempRepository contractingPartyTempRepository,
- IFinancialStatmentRepository financialStatmentRepository, IContactInfoApplication contactInfoApplication,
- IAccountApplication accountApplication, ISmsService smsService, IUidService uidService)
- {
- _institutionContractRepository = institutionContractRepository;
- _contractingPartyRepository = contractingPartyRepository;
- _representativeRepository = representativeRepository;
- _employerRepository = employerRepository;
- _workshopRepository = workshopRepository;
- _leftWorkRepository = leftWorkRepository;
- _financialStatmentApplication = financialStatmentApplication;
- _workshopApplication = workshopApplication;
- _contractingPartyTempRepository = contractingPartyTempRepository;
- _financialStatmentRepository = financialStatmentRepository;
- _contactInfoApplication = contactInfoApplication;
- _accountApplication = accountApplication;
- _smsService = smsService;
- _uidService = uidService;
- }
-
- public OperationResult Create(CreateInstitutionContract command)
- {
- string contractingPartyName = String.Empty;
- bool dateMessages = false;
- string dateMaessageResult = String.Empty;
- var opration = new OperationResult();
- if (_institutionContractRepository.Exists(x =>
- x.ContractingPartyId == command.ContractingPartyId && x.RepresentativeId == command.RepresentativeId &&
- x.TypeOfContract == command.TypeOfContract))
- return opration.Failed(
- "برای این معرف و طرف حساب قبلا قرارداد ایجاد شده است، شما میتوانید از تمدید استفاده کنید");
-
- if (string.IsNullOrWhiteSpace(command.ContractDateFa))
- {
- dateMaessageResult = "تاریخ قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (string.IsNullOrWhiteSpace(command.ContractStartFa))
- {
- dateMaessageResult += "تاریخ شروع قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (string.IsNullOrWhiteSpace(command.ContractEndFa))
- {
- dateMaessageResult += "تاریخ پایان قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (dateMessages)
- return opration.Failed(dateMaessageResult);
-
- if (command.RepresentativeId < 1 && command.ContractingPartyId > 1)
- {
- return opration.Failed("معرف را انتخاب کنید");
- }
- else if (command.ContractingPartyId < 1 && command.RepresentativeId > 1)
- {
- return opration.Failed("طرف حساب را انتخاب کنید");
- }
- else if (command.ContractingPartyId < 1 && command.RepresentativeId < 1)
- {
- return opration.Failed("معرف و طرف حساب را انتخاب کنید");
- }
-
- var syear = command.ContractStartFa.Substring(0, 4);
- var smonth = command.ContractStartFa.Substring(5, 2);
- var sday = command.ContractStartFa.Substring(8, 2);
- var contractingParty = _contractingPartyRepository.GetDetails(command.ContractingPartyId);
- //شماره قرارداد
- var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/0";
-
- ///////////////////////
- if (command.ContactInformationList.Count == 0)
- return opration.Failed("ورود شماره تماس برای ارسال پیامک الزامیست");
- var accountContact = command.ContactInformationList.Where(x =>
- x.SendSmsString == "true" && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه" &&
- !string.IsNullOrWhiteSpace(x.PhoneNumber)).ToList();
- if (accountContact.Count == 0)
- return opration.Failed("ورود شماره همراه با سمت طرف قرارداد برای ساخت حساب کاربری الزامیست");
- var accountContactCount = command.ContactInformationList
- .Where(x => x.PhoneType == "شماره همراه" && x.Position == "طرف قرارداد").ToList();
- if (accountContactCount.Count > 1)
- return opration.Failed("فقط یکی از شماره تلفن ها میتواند سمت طرف قرارداد داشته باشد");
-
- contractingPartyName = contractingParty.LName;
- //نام معرف
- var representative = _representativeRepository.GetDetails(command.RepresentativeId).FullName;
-
- var contractStartGr = command.ContractStartFa.ToGeorgianDateTime();
- var contractEndGr = command.ContractEndFa.ToGeorgianDateTime();
-
- var contractDateGr = command.ContractDateFa.ToGeorgianDateTime();
-
- if (command.Address != null && command.State == null)
- {
- return opration.Failed("لطفا استان و شهر را انتخاب کنید");
- }
-
- if ((command.Address != null && command.State != null) && command.City == "شهرستان")
- {
- return opration.Failed("لطفا شهر را انتخاب کنید");
- }
-
- if (command.Address == null && command.State != null)
- {
- return opration.Failed("لطفا آدرس را وارد کنید");
- }
-
- if (string.IsNullOrWhiteSpace(command.OfficialCompany))
- return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید");
- if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax))
- return opration.Failed("وضعیت ارزش افزوده را مشخص کنید");
- if (string.IsNullOrWhiteSpace(command.TypeOfContract))
- return opration.Failed("عنوان قرارداد را انتخاب کنید");
-
- if (string.IsNullOrWhiteSpace(command.ContractAmountString))
- command.ContractAmountString = "0";
- if (string.IsNullOrWhiteSpace(command.DailyCompenseationString))
- command.DailyCompenseationString = "0";
- if (string.IsNullOrWhiteSpace(command.ObligationString))
- command.ObligationString = "0";
- if (string.IsNullOrWhiteSpace(command.TotalAmountString))
- command.TotalAmountString = "0";
- command.ValueAddedTax = string.IsNullOrWhiteSpace(command.ValueAddedTaxStr)
- ? 0
- : command.ValueAddedTaxStr.MoneyToDouble();
- var contractAmount = command.ContractAmountString.ToDoubleMoney();
- command.ContractAmount = Convert.ToDouble(contractAmount);
- var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney();
- command.DailyCompenseation = Convert.ToDouble(DailyCompenseation);
- var Obligation = command.ObligationString.ToDoubleMoney();
- command.Obligation = Convert.ToDouble(Obligation);
- var TotalAmount = command.TotalAmountString.ToDoubleMoney();
- command.TotalAmount = Convert.ToDouble(TotalAmount);
- //var hasValueAddedTax = "false";
- //double valueAddedTax = 0;
- //if (command.HasValueAddedTax == "true")
- //{
- // hasValueAddedTax = "true";
- // valueAddedTax = command.ContractAmount * 0.1;
- // command.ContractAmount += valueAddedTax;
- //}
-
- var createContract = new InstitutionContract(contractNo, command.RepresentativeId, representative,
- command.ContractingPartyId,
- contractingPartyName, contractDateGr, command.ContractDateFa, command.State, command.City,
- command.Address, contractStartGr,
- command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount,
- command.DailyCompenseation, command.Obligation,
- command.TotalAmount, 0, command.WorkshopManualCount, command.EmployeeManualCount, command.Description,
- command.OfficialCompany, command.TypeOfContract, command.HasValueAddedTax, command.ValueAddedTax, [],command.LawId);
-
- _institutionContractRepository.Create(createContract);
- _institutionContractRepository.SaveChanges();
- return opration.Succcedded(createContract.id);
- }
-
- public OperationResult Extension(CreateInstitutionContract command)
- {
- bool dateMessages = false;
- string dateMaessageResult = String.Empty;
- var opration = new OperationResult();
-
- command.ExtensionNo += 1;
- if (_institutionContractRepository.Exists(x =>
- x.ExtensionNo == command.ExtensionNo && x.ContractingPartyId == command.ContractingPartyId &&
- x.TypeOfContract == command.TypeOfContract))
- return opration.Failed("برای این قرارداد قبلا تمدید ایجاد شده است");
-
-
- if (string.IsNullOrWhiteSpace(command.ContractDateFa))
- {
- dateMaessageResult = "تاریخ قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (string.IsNullOrWhiteSpace(command.ContractStartFa))
- {
- dateMaessageResult += "تاریخ شروع قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (string.IsNullOrWhiteSpace(command.ContractEndFa))
- {
- dateMaessageResult += "تاریخ پایان قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (dateMessages)
- return opration.Failed(dateMaessageResult);
-
- var firstContract =
- _institutionContractRepository.GetFirstContract(command.ContractingPartyId, command.TypeOfContract);
-
- var syear = firstContract.ContractStartFa.Substring(0, 4);
- var smonth = firstContract.ContractStartFa.Substring(5, 2);
- var sday = firstContract.ContractStartFa.Substring(8, 2);
- var contractingParty = _contractingPartyRepository.GetDetails(command.ContractingPartyId);
- //شماره قرارداد
- var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/{command.ExtensionNo}";
-
-
- var contractStartGr = command.ContractStartFa.ToGeorgianDateTime();
- var contractEndGr = command.ContractEndFa.ToGeorgianDateTime();
-
- var contractDateGr = command.ContractDateFa.ToGeorgianDateTime();
- if (_institutionContractRepository.Exists(x =>
- ((contractStartGr >= x.ContractStartGr && contractStartGr <= x.ContractEndGr) ||
- (contractEndGr >= x.ContractStartGr && contractEndGr <= x.ContractEndGr)) &&
- x.TypeOfContract == command.TypeOfContract && x.ContractingPartyId == command.ContractingPartyId))
- return opration.Failed("تاریخ شروع و پایان وارد شده با قرارداد دیگری تداخل دارد");
- if (command.Address != null && command.State == null)
- {
- return opration.Failed("لطفا استان و شهر را انتخاب کنید");
- }
-
- if ((command.Address != null && command.State != null) && command.City == "شهرستان")
- {
- return opration.Failed("لطفا شهر را انتخاب کنید");
- }
-
- if (command.Address == null && command.State != null)
- {
- return opration.Failed("لطفا آدرس را وارد کنید");
- }
-
- if (string.IsNullOrWhiteSpace(command.OfficialCompany))
- return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید");
- if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax))
- return opration.Failed("وضعیت ارزش افزوده را مشخص کنید");
- if (string.IsNullOrWhiteSpace(command.TypeOfContract))
- return opration.Failed("عنوان قرارداد را انتخاب کنید");
- if (string.IsNullOrWhiteSpace(command.ContractAmountString))
- command.ContractAmountString = "0";
- if (string.IsNullOrWhiteSpace(command.DailyCompenseationString))
- command.DailyCompenseationString = "0";
- if (string.IsNullOrWhiteSpace(command.ObligationString))
- command.ObligationString = "0";
- if (string.IsNullOrWhiteSpace(command.TotalAmountString))
- command.TotalAmountString = "0";
- command.ValueAddedTax = string.IsNullOrWhiteSpace(command.ValueAddedTaxStr)
- ? 0
- : command.ValueAddedTaxStr.MoneyToDouble();
- var contractAmount = command.ContractAmountString.ToDoubleMoney();
- command.ContractAmount = Convert.ToDouble(contractAmount);
- var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney();
- command.DailyCompenseation = Convert.ToDouble(DailyCompenseation);
- var Obligation = command.ObligationString.ToDoubleMoney();
- command.Obligation = Convert.ToDouble(Obligation);
- var TotalAmount = command.TotalAmountString.ToDoubleMoney();
- command.TotalAmount = Convert.ToDouble(TotalAmount);
- var createContract = new InstitutionContract(contractNo, command.RepresentativeId, command.RepresentativeName,
- command.ContractingPartyId,
- command.ContractingPartyName, contractDateGr, command.ContractDateFa, command.State, command.City,
- command.Address, contractStartGr,
- command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount,
- command.DailyCompenseation, command.Obligation,
- command.TotalAmount, command.ExtensionNo, command.WorkshopManualCount, command.EmployeeManualCount,
- command.Description, command.OfficialCompany, command.TypeOfContract, command.HasValueAddedTax,
- command.ValueAddedTax, [], command.LawId);
-
- _institutionContractRepository.Create(createContract);
- _institutionContractRepository.SaveChanges();
-
-
- return opration.Succcedded(createContract.id);
- }
-
- public OperationResult Edit(EditInstitutionContract command)
- {
- bool dateMessages = false;
- string dateMaessageResult = String.Empty;
- var opration = new OperationResult();
- var ContractEdit = _institutionContractRepository.Get(command.Id);
- if (ContractEdit == null)
- opration.Failed("رکورد مورد نظر وجود ندارد");
-
- var contractStartGr = command.ContractStartFa.ToGeorgianDateTime();
- var contractEndGr = command.ContractEndFa.ToGeorgianDateTime();
-
- var contractDateGr = command.ContractDateFa.ToGeorgianDateTime();
-
- if (_institutionContractRepository.Exists(x =>
- x.ContractingPartyId == ContractEdit.ContractingPartyId &&
- ((contractStartGr >= x.ContractStartGr && contractStartGr <= x.ContractEndGr) ||
- (contractEndGr >= x.ContractStartGr && contractEndGr <= x.ContractEndGr)) && x.id != command.Id &&
- x.TypeOfContract == command.TypeOfContract))
- return opration.Failed("در بازه تاریخ وارد شده قرارداد دیگری وجود دارد");
- //if (_institutionContractRepository.Exists(x =>
- // x.ContractingPartyId == ContractEdit.ContractingPartyId && (x.ContractStartGr <= contractDateGr || x.ContractDateGr <= contractDateGr) && x.id != command.Id))
- // return opration.Failed("تاریخ عقد قرارداد با قرارداد دیگری تداخل دارد");
- if (string.IsNullOrWhiteSpace(command.ContractDateFa))
- {
- dateMaessageResult = "تاریخ قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (string.IsNullOrWhiteSpace(command.ContractStartFa))
- {
- dateMaessageResult += "تاریخ شروع قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (string.IsNullOrWhiteSpace(command.ContractEndFa))
- {
- dateMaessageResult += "تاریخ پایان قراراداد اجباری است. ";
- dateMessages = true;
- }
-
- if (dateMessages)
- return opration.Failed(dateMaessageResult);
- if (command.Address != null && command.State == null)
- {
- return opration.Failed("لطفا استان و شهر را انتخاب کنید");
- }
-
- if ((command.Address != null && command.State != null) && command.City == "شهرستان")
- {
- return opration.Failed("لطفا شهر را انتخاب کنید");
- }
-
- if (command.Address == null && command.State != null)
- {
- return opration.Failed("لطفا آدرس را وارد کنید");
- }
-
- if (string.IsNullOrWhiteSpace(command.OfficialCompany))
- return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید");
- if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax))
- return opration.Failed("وضعیت ارزش افزوده را مشخص کنید");
- if (string.IsNullOrWhiteSpace(command.TypeOfContract))
- return opration.Failed("عنوان قرارداد را انتخاب کنید");
-
- if (string.IsNullOrWhiteSpace(command.ContractAmountString))
- command.ContractAmountString = "0";
- if (string.IsNullOrWhiteSpace(command.DailyCompenseationString))
- command.DailyCompenseationString = "0";
- if (string.IsNullOrWhiteSpace(command.ObligationString))
- command.ObligationString = "0";
- if (string.IsNullOrWhiteSpace(command.TotalAmountString))
- command.TotalAmountString = "0";
-
- command.ValueAddedTax = command.ValueAddedTaxStr.MoneyToDouble();
- var contractAmount = command.ContractAmountString.ToDoubleMoney();
- command.ContractAmount = Convert.ToDouble(contractAmount);
- var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney();
- command.DailyCompenseation = Convert.ToDouble(DailyCompenseation);
- var Obligation = command.ObligationString.ToDoubleMoney();
- command.Obligation = Convert.ToDouble(Obligation);
- var TotalAmount = command.TotalAmountString.ToDoubleMoney();
- command.TotalAmount = Convert.ToDouble(TotalAmount);
-
- ContractEdit.Edit(contractDateGr, command.ContractDateFa, command.State, command.City, command.Address,
- contractStartGr,
- command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount,
- command.DailyCompenseation,
- command.Obligation, command.TotalAmount, command.WorkshopManualCount, command.EmployeeManualCount,
- command.Description, command.OfficialCompany, command.TypeOfContract, command.ValueAddedTax,
- command.HasValueAddedTax);
- _institutionContractRepository.SaveChanges();
- return opration.Succcedded(command.Id);
- }
-
- public EditInstitutionContract GetDetails(long id)
- {
- return _institutionContractRepository.GetDetails(id);
- }
-
- public List Search(InstitutionContractSearchModel searchModel)
- {
- var query = _institutionContractRepository.Search(searchModel);
- var join = new List();
-
- var now = DateTime.Now;
- var nowFa = now.ToFarsi();
-
- var endFa = nowFa.FindeEndOfMonth();
- var endThisMontGr = endFa.ToGeorgianDateTime();
- //var watch = System.Diagnostics.Stopwatch.StartNew();
-
-
- var newResult = query.Select(x => new InstitutionContractViewModel
- {
- Id = x.Id,
- ContractNo = x.ContractNo,
- ContractStartGr = x.ContractStartGr,
- ContractStartFa = x.ContractStartFa,
- ContractEndGr = x.ContractEndGr,
- ContractEndFa = x.ContractEndFa,
- //RepresentativeId = x.RepresentativeId,
- RepresentativeName = x.RepresentativeName,
- //ContractingPartyName = _contractingPartyRepository.GetDetails(x.ContractingPartyId).LName,
- //IsContractingPartyBlock = _contractingPartyRepository.GetDetails(x.ContractingPartyId).IsBlock,
- //BlockTimes = _contractingPartyRepository.GetDetails(x.ContractingPartyId).BlockTimes,
- ContractingPartyId = x.ContractingPartyId,
- EmployerViewModels = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId),
- EmployerNo = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId)
- .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.EmployerNo,
- EmployerName = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId)
- .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.FullName,
- //EmployerId = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.Id == null ? 0 :
- // _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)!.Id,
- ContractAmount = x.ContractAmount,
- TotalAmount = x.TotalAmount,
- SearchAmount = x.SearchAmount,
- IsActiveString = x.IsActiveString,
- OfficialCompany = x.OfficialCompany,
- Signature = x.Signature,
- ExpireColor = ExpCheckColor(now, x.ContractEndGr, endThisMontGr, x.ContractAmount, x.IsActiveString),
- BalanceDouble = TotalBalance(x.ContractingPartyId).TotalBalanceDbl,
- BalanceStr = TotalBalance(x.ContractingPartyId).TotalBalanceStr,
- //WorkshopViewModels = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopViewModels,
- //WorkshopCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopCount,
- //EmployeeCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).EmployeeCount,
- //ArchiveCode = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).ArchiveCode,
- TypeOfContract = x.TypeOfContract
- }).ToList();
- //Console.WriteLine("efTime : " + watch.Elapsed);
-
- //var watchw = System.Diagnostics.Stopwatch.StartNew();
- foreach (var item in newResult)
- {
- //string totalBalanceStr = "0";
- //double totalBalance = 0;
- //var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(item.ContractingPartyId);
- //var allTransactions = firstGetStatement.FinancialTransactionViewModels;
- //if (allTransactions != null)
- //{
- // allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList();
- // var debt = allTransactions.Sum(x => x.Deptor);
- // var credit = allTransactions.Sum(x => x.Creditor);
- // totalBalance = debt - credit;
- // totalBalanceStr = totalBalance.ToMoney();
- //}
- var contractingParty = _contractingPartyRepository.GetDetails(item.ContractingPartyId);
- if (contractingParty != null)
- {
- item.ContractingPartyName = contractingParty.LName;
- item.IsContractingPartyBlock = contractingParty.IsBlock;
- item.BlockTimes = contractingParty.BlockTimes;
- }
-
-
- var employer = _employerRepository.GetEmployerByContracrtingPartyID(item.ContractingPartyId);
- item.EmployerViewModels = employer;
- item.EmployerName = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.FullName;
- var id = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.Id;
- item.EmployerNo = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.EmployerNo;
- if (id != null) item.EmployerId = (long)id;
-
- var emplId = item.EmployerViewModels.Select(x => x.Id).ToList();
-
- item.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId);
- var workshopIds = item.WorkshopViewModels.Select(x => x.Id).ToList();
- var left = 0;
- item.WorkshopCount = Convert.ToString(item.WorkshopViewModels.Count);
- //var joinPersonelList = new List();
- int pCount = 0;
- foreach (var workshopId in workshopIds)
- {
- //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId);
- //var noBlock = reslt.Where(x => x.Black == false).ToList();
- //joinPersonelList.AddRange(noBlock);
- var p = _workshopApplication.PersonnelCount(workshopId);
- pCount += p;
- }
- //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList();
- //left = joinlistWithoutDuplicat.Count();
- // var left= _leftWorkRepository.GetLeftPersonelByWorkshopId(workshopIds).Count();
-
- item.EmployeeCount = Convert.ToString(pCount);
- //if (item.ContractEndGr < now)
- // item.ExpireColor = "black";
- //if (item.ContractEndGr >= now && item.ContractEndGr <= endThisMontGr)
- // item.ExpireColor = "red";
- //if (item.ContractAmount == "0")
- // item.ExpireColor = "purple";
- int archiveCode = 0;
- if (item.WorkshopViewModels.Count > 0)
- {
- var workshop = item.WorkshopViewModels.OrderBy(x => x.Id)?.ToList();
-
- var arc = workshop.Select(x => new ArchiveCodConvertoint
- {
- ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(),
- }).OrderBy(x => x.ArchiveCodeInt).ToList();
- var minArchiveCode = arc.Min(x => x.ArchiveCodeInt);
- archiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode;
- }
-
- var result = new InstitutionContractViewModel()
- {
- Id = item.Id,
- ContractNo = item.ContractNo,
- ContractStartGr = item.ContractStartGr,
- ContractStartFa = item.ContractStartFa,
- ContractEndGr = item.ContractEndGr,
- ContractEndFa = item.ContractEndFa,
- RepresentativeName = item.RepresentativeName,
- ContractingPartyName = item.ContractingPartyName,
- ContractingPartyId = item.ContractingPartyId,
- EmployerNo = item.EmployerNo,
- ContractAmount = item.ContractAmount,
- EmployerName = item.EmployerName,
- EmployerViewModels = item.EmployerViewModels,
- IsActiveString = item.IsActiveString,
- WorkshopCount = item.WorkshopCount,
- WorkshopViewModels = item.WorkshopViewModels,
- EmployeeCount = item.EmployeeCount,
- ExpireColor = item.ExpireColor,
- SearchAmount = item.SearchAmount,
- BalanceDouble = item.BalanceDouble,
- BalanceStr = item.BalanceStr,
- Signature = item.Signature,
- ArchiveCode = archiveCode,
- TypeOfContract = item.TypeOfContract,
- IsContractingPartyBlock = item.IsContractingPartyBlock,
- BlockTimes = item.BlockTimes,
- };
- join.Add(result);
- }
-
- //Console.WriteLine("forEchTime : " + watchw.Elapsed);
- var findeByFilter = new List();
- if (searchModel.WorkshopId != 0)
- {
- foreach (var item in join)
- {
- var check = item.WorkshopViewModels.Where(x => x.Id == searchModel.WorkshopId).ToList();
- if (check.Count > 0)
- findeByFilter.Add(item);
- }
-
- join = findeByFilter;
- }
-
- var findeByFilter2 = new List();
- if (searchModel.EmployerId != 0)
- {
- foreach (var item in join)
- {
- var check = item.EmployerViewModels.Where(x => x.Id == searchModel.EmployerId).ToList();
- if (check.Count > 0)
- findeByFilter2.Add(item);
- }
-
- join = findeByFilter2;
- }
-
-
- join = join.OrderBy(x => x.WorkshopCount != "0" && string.IsNullOrWhiteSpace(x.ExpireColor))
- .ThenBy(x => x.WorkshopCount == "0" && string.IsNullOrWhiteSpace(x.ExpireColor))
- .ThenBy(x => x.ExpireColor == "red")
- .ThenBy(x => x.ExpireColor == "purple")
- .ThenBy(x => x.ExpireColor == "black").ToList();
-
- return join;
- }
-
- public List NewSearch(InstitutionContractSearchModel searchModel)
- {
- return _institutionContractRepository.NewSearch(searchModel);
- }
-
-
- public List GetInstitutionContractToSetServicesExcelImport()
- {
- var result = _institutionContractRepository.NewSearch(new InstitutionContractSearchModel());
-
- return result.Where(x =>
- x.IsActiveString == "true" && x.IsContractingPartyBlock != "true" && x.WorkshopCount != "0" &&
- x.ContractStartGr <= DateTime.Now && x.ContractEndGr >= DateTime.Now).ToList();
- }
-
- public string ExpCheckColor(DateTime now, DateTime ContractEndGr, DateTime endThisMontGr, string ContractAmount,
- string isActiveString)
- {
- string result = "";
-
- if (ContractEndGr < now)
- result = "black";
- if (ContractEndGr >= now && ContractEndGr <= endThisMontGr)
- result = "red";
- if (ContractAmount == "0")
- result = "purple";
- if (isActiveString == "blue")
- result = "blue";
- return result;
- }
-
- public TotalbalancViewModel TotalBalance(long contractingPartyId)
- {
- var result = new TotalbalancViewModel();
-
- var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(contractingPartyId);
- var allTransactions = firstGetStatement.FinancialTransactionViewModels;
- if (allTransactions != null)
- {
- allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList();
- var debt = allTransactions.Sum(x => x.Deptor);
- var credit = allTransactions.Sum(x => x.Creditor);
- result.TotalBalanceDbl = debt - credit;
- result.TotalBalanceStr = result.TotalBalanceDbl.ToMoney();
- }
-
- return result;
- }
-
- public WorkshopsAndEmployeeViewModel WorkShopDetailsAndEmployeeCount(long contractingPartyId)
- {
- var result = new WorkshopsAndEmployeeViewModel();
-
- var emplId = _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId).Select(x => x.Id)
- .ToList();
- ;
- result.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId);
- var workshopIds = result.WorkshopViewModels.Select(x => x.Id).ToList();
- var left = 0;
- result.WorkshopCount = Convert.ToString(workshopIds.Count);
- var joinPersonelList = new List();
- foreach (var workshopId in workshopIds)
- {
- //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId);
- //var noBlock = reslt.Where(x => x.Black == false).ToList();
- //joinPersonelList.AddRange(noBlock);
- var pCount = _workshopApplication.PersonnelCount(workshopId);
- result.EmployeeCount = Convert.ToString(pCount);
- }
- //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList();
- //left = joinlistWithoutDuplicat.Count();
- //result.EmployeeCount = Convert.ToString(left);
-
-
- result.ArchiveCode = 0;
- if (workshopIds.Count > 0)
- {
- var workshop = result.WorkshopViewModels.OrderBy(x => x.Id)?.ToList();
-
- var arc = workshop.Select(x => new ArchiveCodConvertoint
- {
- ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(),
- }).OrderBy(x => x.ArchiveCodeInt).ToList();
- var minArchiveCode = arc.Min(x => x.ArchiveCodeInt);
- result.ArchiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode;
- }
-
- return result;
- }
-
- public List PrintAll(List id)
- {
- throw new NotImplementedException();
- }
-
- public InstitutionContractViewModel PrintOne(long id)
- {
- var get = _institutionContractRepository.GetDetails(id);
- var employer = _employerRepository.GetEmployerByContracrtingPartyID(get.ContractingPartyId);
- var employerViewModels = employer;
- var emplId = employerViewModels.Select(x => x.Id).ToList();
- var workshops = _workshopRepository.GetWorkshopsByEmployerId(emplId);
- var res = new InstitutionContractViewModel()
- {
- Id = get.Id,
- ContractNo = get.ContractNo,
-
- ContractStartFa = get.ContractStartFa,
-
- ContractEndFa = get.ContractEndFa,
-
- ContractingPartyName = get.ContractingPartyName,
-
- ContractingPartyId = get.ContractingPartyId,
- ContractDateFa = get.ContractDateFa,
- State = get.State,
- City = get.City,
- Address = get.Address,
- Description = get.Description,
- HasValueAddedTax = get.HasValueAddedTax,
- ValueAddedTax = get.ValueAddedTax,
- ContractAmount = get.ContractAmountString,
- DailyCompenseation = get.DailyCompenseationString,
- Obligation = get.ObligationString,
- TotalAmount = get.TotalAmountString,
- WorkshopViewModels = workshops
- };
- return res;
- }
-
-
- public OperationResult Active(long id)
- {
- var opration = new OperationResult();
- var contract = _institutionContractRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.Active();
-
- _institutionContractRepository.SaveChanges();
- return opration.Succcedded();
- }
-
- public OperationResult DeActive(long id)
- {
- var opration = new OperationResult();
- var contract = _institutionContractRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.DeActive();
-
-
- _institutionContractRepository.SaveChanges();
- return opration.Succcedded();
- }
-
- public OperationResult DeActiveBlue(long id)
- {
- var opration = new OperationResult();
- var institutionContract = _institutionContractRepository.Get(id);
- if (institutionContract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- institutionContract.DeActiveBlue();
- _institutionContractRepository.SaveChanges();
-
- return opration.Succcedded();
- }
-
- public OperationResult DeActiveAllConnections(long id)
- {
- var opration = new OperationResult();
- var institutionContract = _institutionContractRepository.Get(id);
- if (institutionContract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
-
- var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
- if (contractingParty != null)
- {
- contractingParty.DeActive();
- _contractingPartyRepository.SaveChanges();
- var employers =
- _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId);
- //var employersIdList = employers.Select(x => x.Id).ToList();
- //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList);
- //foreach (var workshop in workshops)
- //{
- // var res = _workshopApplication.DeActive(workshop.Id);
- //}
- foreach (var employer in employers)
- {
- var res = _employerRepository.DeActiveAll(employer.Id);
- }
- }
-
- return opration.Succcedded();
- }
-
- public OperationResult ReActiveAllConnections(long id)
- {
- var opration = new OperationResult();
- var institutionContract = _institutionContractRepository.Get(id);
- if (institutionContract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
-
- var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
- if (contractingParty != null)
- {
- contractingParty.Active();
- _contractingPartyRepository.SaveChanges();
- var employers =
- _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId);
- //var employersIdList = employers.Select(x => x.Id).ToList();
- //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList);
- //foreach (var workshop in workshops)
- //{
- // var res = _workshopApplication.DeActive(workshop.Id);
- //}
- foreach (var employer in employers)
- {
- var res = _employerRepository.ActiveAll(employer.Id);
- }
- }
-
- return opration.Succcedded();
- }
-
- public void ReActiveAllAfterCreateNew(long contractingPartyId)
- {
- var contractingParty = _contractingPartyRepository.Get(contractingPartyId);
- if (contractingParty != null)
- {
- if (contractingParty.IsActiveString == "false")
- {
- contractingParty.Active();
- _contractingPartyRepository.SaveChanges();
- }
-
- var employers =
- _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId);
-
- foreach (var employer in employers)
- {
- var res = _employerRepository.ActiveAll(employer.Id);
- }
- }
- }
-
-
- public void RemoveContract(long id)
- {
- _institutionContractRepository.RemoveContract(id);
- }
-
-
- public OperationResult Sign(long id)
- {
- var opration = new OperationResult();
- var contract = _institutionContractRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.Sign();
-
-
- _institutionContractRepository.SaveChanges();
- opration.IsSuccedded = true;
- return opration.Succcedded();
- }
-
- public OperationResult UnSign(long id)
- {
- var opration = new OperationResult();
- var contract = _institutionContractRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.UnSign();
-
-
- _institutionContractRepository.SaveChanges();
- opration.IsSuccedded = true;
- return opration.Succcedded();
- }
-
- public void CreateContractingPartyAccount(long contractingPartyid, long accountId)
- {
- _institutionContractRepository.CreateContractingPartyAccount(contractingPartyid, accountId);
- }
-
- public double GetcontractAmount(int countPerson)
- {
- return _institutionContractRepository.GetcontractAmount(countPerson);
- }
-
- public async Task> GetList(
- InstitutionContractListSearchModel searchModel)
- {
- return await _institutionContractRepository.GetList(searchModel);
- }
-
- public Task GetListStats(InstitutionContractListSearchModel searchModel)
- {
- return _institutionContractRepository.GetListStats(searchModel);
- }
-
- public async Task CreateAsync(CreateInstitutionContractRequest command)
- {
- var opration = new OperationResult();
- var syear = command.ContractStartFa.Substring(0, 4);
- var smonth = command.ContractStartFa.Substring(5, 2);
- var sday = command.ContractStartFa.Substring(8, 2);
-
- var transaction = await _contractingPartyRepository.BeginTransactionAsync();
-
- if (command.ContractStartFa.TryToGeorgianDateTime(out var contractStartGr) == false)
- return opration.Failed("تاریخ شروع قرارداد معتبر نیست");
-
- contractStartGr.AddMonthsFa((int)command.Duration, out var contractEndGr);
- contractEndGr = contractEndGr.ToFarsi().FindeEndOfMonth().ToGeorgianDateTime();
-
- PersonalContractingParty existingContractingParty = null;
- if (command.ContractingPartyLegalType == LegalType.Legal)
- {
- existingContractingParty =
- await _contractingPartyRepository.GetByRegisterId(command.LegalParty.RegisterId);
- if (_contractingPartyRepository.Exists(x =>
- x.LName == command.LegalParty.CompanyName && x.RegisterId == command.LegalParty.RegisterId))
- {
- if (_institutionContractRepository.Exists(x => x.ContractStartGr < contractEndGr
- && contractStartGr < x.ContractEndGr
- && x.ContractingPartyId == existingContractingParty.id
- && x.IsActiveString == "true"))
- {
- throw new BadRequestException("امکان ایجاد قرارداد تکراری وجود ندارد");
- }
- }
- }
- else if (command.ContractingPartyLegalType == LegalType.Real)
- {
- existingContractingParty =
- await _contractingPartyRepository.GetByNationalCode(command.RealParty.NationalCode);
- if (_contractingPartyRepository.Exists(x =>
- x.LName == command.RealParty.LName && x.Nationalcode == command.RealParty.NationalCode))
- {
- if (_institutionContractRepository.Exists(x => x.ContractStartGr < contractEndGr
- && contractStartGr < x.ContractEndGr
- && x.ContractingPartyId == existingContractingParty.id
- && x.IsActiveString == "true"))
- {
- throw new BadRequestException("امکان ایجاد قرارداد تکراری وجود ندارد");
- }
- }
- }
-
- PersonalContractingParty contractingParty;
- if (existingContractingParty != null)
- {
- contractingParty = existingContractingParty;
- }
- else
- {
- OperationResult contractingPartyResult = command.ContractingPartyLegalType switch
- {
- LegalType.Legal => await CreateLegalContractingPartyEntity(command.LegalParty, command.RepresentativeId,
- command.Address,
- command.City, command.Province),
- LegalType.Real => await CreateRealContractingPartyEntity(command.RealParty, command.RepresentativeId,
- command.Address,
- command.City, command.Province),
- _ => throw new BadRequestException("نوع طرف قرارداد مشخص نشده است")
- };
-
- if (!contractingPartyResult.IsSuccedded)
- return opration.Failed(contractingPartyResult.Message);
-
- contractingParty = contractingPartyResult.Data;
- }
-
- if (_institutionContractRepository.Exists(x =>
- x.ContractingPartyId == contractingParty.id && x.RepresentativeId == command.RepresentativeId &&
- x.TypeOfContract == "JobRelation"))
- return opration.Failed(
- "برای این معرف و طرف حساب قبلا قرارداد ایجاد شده است، شما میتوانید از تمدید استفاده کنید");
-
- var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/0";
-
- var representative = _representativeRepository.Get(command.RepresentativeId);
- if (representative == null)
- return opration.Failed("معرف مورد نظر یافت نشد");
-
- if (command.IsInstallment &&
- !command.Workshops.Any(x => x.HasContractPlanInPerson || x.HasInsurancePlanInPerson))
- {
- return opration.Failed("برای قراردادهای اقساطی حداقل یک کارگاه باید دارای طرح حضوری باشد");
- }
-
-
- var today = DateTime.Today;
-
- var contractDateGr = today;
- var contractDateFa = contractDateGr.ToFarsi();
-
-
- var hasValueAddedTax = command.TaxAmount > 0 ? "true" : "false";
-
- var contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName;
-
- var workshopDetails = command.Workshops.Select(x =>
- new InstitutionContractWorkshopInitial(x.WorkshopName, x.HasRollCallPlan, false, x.HasCustomizeCheckoutPlan,
- x.HasContractPlan, x.HasContractPlanInPerson, x.HasInsurancePlan, x.HasInsurancePlanInPerson,
- x.PersonnelCount, x.Price)).ToList();
-
-
- var entity = new InstitutionContract(contractNo, command.RepresentativeId, representative.FullName,
- contractingParty.id,
- contractingPartyFullName, contractDateGr, contractDateFa, command.Province, command.City, command.Address,
- contractStartGr,
- contractStartGr.ToFarsi(), contractEndGr, contractEndGr.ToFarsi(), command.OneMonthAmount,
- command.DailyCompensation,
- command.Obligation, command.TotalAmount, 0,
- command.Workshops.Count.ToString(),
- command.Workshops.Sum(x => x.PersonnelCount).ToString(), command.Description,
- "NotOfficial", "JobRelation", hasValueAddedTax,
- command.TaxAmount, workshopDetails, command.LawId);
-
-
- FinancialStatment financialStatement;
- if (_financialStatmentRepository.Exists(x => x.ContractingPartyId == contractingParty.id))
- {
- financialStatement = await _financialStatmentRepository.GetByContractingPartyId(contractingParty.id);
- }
- else
- {
- financialStatement = new FinancialStatment(contractingParty.id, contractingPartyFullName);
- await _financialStatmentRepository.CreateAsync(financialStatement);
- }
-
- if (command.IsInstallment)
- {
- var installments =
- CalculateInstallment(command.TotalAmount, (int)command.Duration, command.ContractStartFa, true);
-
- // دریافت مبلغ اولین قسط
- //این کار برای این هست که اولین قسط باید با تاریخ امروز باشد و باید به وضعیت مالی بدهی ایجاد شود که یوزر اولین بدهی را وارد کند
- var firstInstallmentAmount = installments.First().Amount;
-
- // حذف اولین قسط
- installments.RemoveAt(0);
-
- // ایجاد قسط جدید با تاریخ امروز
- var todayInstallment = new InstitutionContractInstallment(DateTime.Today, firstInstallmentAmount, "");
-
- var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
- "قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0);
-
- financialStatement.AddFinancialTransaction(financialTransaction);
-
- // اضافه کردن قسط جدید به ابتدای لیست
- installments.Insert(0, todayInstallment);
-
- entity.SetInstallments(installments);
- }
- else
- {
- var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
- "پرداخت کل سرویس", "debt", "بابت خدمات", command.TotalAmount, 0, 0);
- financialStatement.AddFinancialTransaction(financialTransaction);
- }
-
-
- await _institutionContractRepository.CreateAsync(entity);
- await _institutionContractRepository.SaveChangesAsync();
-
- var mainContactInfo = new CreateContactInfo
- {
- InstitutionContractId = entity.id,
- PhoneType = "شماره همراه",
- Position = "طرف قرارداد",
- PhoneNumber = contractingParty.Phone,
- FnameLname = contractingPartyFullName,
- SendSms = true
- };
- _contactInfoApplication.Create(mainContactInfo);
-
- foreach (var contactInfo in command.ContactInfos)
- {
- if (contactInfo.PhoneNumber != null)
- {
- var contactinfo = new CreateContactInfo
- {
- InstitutionContractId = entity.id,
- PhoneType = contactInfo.PhoneType,
- Position = contactInfo.Position,
- PhoneNumber = contactInfo.PhoneNumber,
- FnameLname = contactInfo.FnameLname,
- SendSms = contactInfo.SendSmsString == "true" ? true : false
- };
- _contactInfoApplication.Create(contactinfo);
- }
- }
-
- var userPass = contractingParty.IsLegal == "حقیقی"
- ? contractingParty.Nationalcode
- : contractingParty.NationalId;
- var createAcc = new RegisterAccount
- {
- Fullname = contractingParty.LName,
- Username = userPass,
- Password = userPass,
- Mobile = contractingParty.Phone,
- NationalCode = userPass
- };
- var res = _accountApplication.RegisterClient(createAcc);
- if (res.IsSuccedded)
- CreateContractingPartyAccount(contractingParty.id, res.SendId);
-
-
- await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
- entity.PublicId, contractingParty.id,entity.id );
-
- await _institutionContractRepository.SaveChangesAsync();
-
- await transaction.CommitAsync();
- return opration.Succcedded();
- }
-
- public async Task EditAsync(EditInstitutionContractRequest command)
- {
- throw new NotImplementedException();
- }
-
-
- public Task> RegistrationWorkflowMainList()
- {
- return _institutionContractRepository.RegistrationWorkflowMainList();
- }
-
- public Task> RegistrationWorkflowItems(long institutionContractId)
- {
- return _institutionContractRepository.RegistrationWorkflowItems(institutionContractId);
- }
-
- public async Task GetVerificationDetails(Guid id)
- {
- return await _institutionContractRepository.GetVerificationDetails(id);
- }
-
-
- public async Task> SendVerifyOtp(Guid id)
- {
- var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(id);
- if (institutionContract == null)
- {
- throw new NotFoundException("رکورد مورد نظر یافت نشد");
- }
-
- if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified)
- throw new BadRequestException("این قرارداد مالی قبلا تایید شده است");
-
- if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify &&
- institutionContract.VerifyCodeCreation != DateTime.MinValue)
- {
- if (!institutionContract.CanResendVerifyCode)
- {
- throw new BadRequestException("کد تایید قبلی هنوز منقضی نشده است",
- new Dictionary
- {
- {
- "expireTime", (int)institutionContract.ReSendTime.TotalSeconds -
- (int)(DateTime.Now - institutionContract.VerifyCodeCreation).TotalSeconds
- }
- });
- }
- }
-
- var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
- if (contractingParty == null)
- throw new NotFoundException("طرف قرارداد یافت نشد");
-
- var code = new Random().Next(1000, 9999).ToString();
-
- var contractingPartyFullName = contractingParty.IsLegal == "حقیقی"
- ? contractingParty.FName + " " + contractingParty.LName
- : contractingParty.CeoFName + " " + contractingParty.CeoLName;
-
- institutionContract.SetVerifyCode(code,contractingPartyFullName ,contractingParty.Phone);
-
- var transaction = await _institutionContractRepository.BeginTransactionAsync();
- try
- {
- await _institutionContractRepository.SaveChangesAsync();
- _smsService.VerifySend(contractingParty.Phone, code);
- }
- catch (Exception e)
- {
- transaction.Rollback();
- Console.WriteLine(e);
- throw;
- }
-
- await transaction.CommitAsync();
- var result = new OtpResultViewModel
- {
- ExpireTimeSec = (int)institutionContract.ExpireTime.TotalSeconds,
- ReSendTimeSec = (int)institutionContract.ReSendTime.TotalSeconds
- };
- return new OperationResult().Succcedded(result);
- }
-
- public async Task VerifyOtp(Guid publicId, string code)
- {
- var op = new OperationResult();
- var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(publicId);
- if (institutionContract == null)
- {
- throw new NotFoundException("رکورد مورد نظر یافت نشد");
- }
-
- if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified)
- throw new BadRequestException("این قرارداد مالی قبلا تایید شده است");
-
- if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify &&
- institutionContract.VerifyCodeExpired)
- throw new BadRequestException("کد تایید منقضی شده است");
-
- var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
- if (contractingParty == null)
- throw new NotFoundException("طرف قرارداد یافت نشد");
-
- if (institutionContract.VerifyCode != code)
- return op.Failed("کد وارد شده صحیح نمی باشد");
-
- var transaction = await _institutionContractRepository.BeginTransactionAsync();
- institutionContract.SetPendingWorkflow();
-
- var phone = institutionContract.ContactInfoList.FirstOrDefault(x =>
- x.SendSms && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه");
- if (phone !=null)
- {
- var userPass = contractingParty.IsLegal == "حقیقی"
- ? contractingParty.Nationalcode
- : contractingParty.NationalId;
- var createAcc = new RegisterAccount
- {
- Fullname = contractingParty.LName,
- Username = userPass,
- Password = userPass,
- Mobile = phone.PhoneNumber,
- NationalCode = userPass
- };
- var res = _accountApplication.RegisterClient(createAcc);
- if (res.IsSuccedded)
- CreateContractingPartyAccount(contractingParty.id, res.SendId);
- }
-
- await transaction.CommitAsync();
- await _institutionContractRepository.SaveChangesAsync();
- return op.Succcedded();
- }
-
- public async Task GetWorkshopInitialDetails(long workshopDetailsId)
- {
- var details = await _institutionContractRepository.GetInstitutionWorkshopInitialDetails(workshopDetailsId);
- var services = details.Services;
- var newArchiveCode = _workshopRepository.GetLastArchiveCode() + 1;
-
- var res = new InstitutionContractWorkshopDetailViewModel()
- {
- ServicesViewModel = new WorkshopServicesViewModel()
- {
- Contract = services.Contract,
- ContractInPerson = services.ContractInPerson,
- CustomizeCheckout = services.CustomizeCheckout,
- Insurance = services.Insurance,
- InsuranceInPerson = services.InsuranceInPerson,
- RollCall = services.RollCall,
- RollCallInPerson = services.RollCallInPerson
- },
- WorkshopName = details.WorkshopName,
- ArchiveCode = newArchiveCode
- };
- return res;
- }
-
- public async Task GetExtensionInquiry(long previousContractId)
- {
- return await _institutionContractRepository.GetExtensionInquiry(previousContractId);
- }
-
- public async Task GetExtensionWorkshops(
- InstitutionContractExtensionWorkshopsRequest request)
- {
- return await _institutionContractRepository.GetExtensionWorkshops(request);
- }
-
- public async Task GetExtensionInstitutionPlan(
- InstitutionContractExtensionPlanRequest request)
- {
- return await _institutionContractRepository.GetExtensionInstitutionPlan(request);
- }
-
- public async Task GetExtensionPaymentMethod(
- InstitutionContractExtensionPaymentRequest request)
- {
- return await _institutionContractRepository.GetExtensionPaymentMethod(request);
- }
-
- public async Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request)
- {
- return await _institutionContractRepository.ExtensionComplete(request);
- }
-
- public async Task> GetInstitutionContractSelectList(string search, string selected)
- {
- return await _institutionContractRepository.GetInstitutionContractSelectList(search,selected);
- }
-
- public async Task GetAmendmentWorkshops(long institutionContractId)
- {
- return await _institutionContractRepository.GetAmendmentWorkshops(institutionContractId);
- }
-
- public async Task InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request)
- {
- return await _institutionContractRepository.InsertAmendmentTempWorkshops(request);
- }
-
- public Task RemoveAmendmentWorkshops(Guid workshopTempId)
- {
- return _institutionContractRepository.RemoveAmendmentWorkshops(workshopTempId);
- }
-
- public Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request)
- {
- return _institutionContractRepository.GetAmendmentPaymentDetails(request);
- }
-
- public async Task ResendVerifyLink(long institutionContractId)
- {
- var institutionContract = _institutionContractRepository.Get(institutionContractId);
-
- if (institutionContract == null)
- {
- throw new NotFoundException("رکورد مورد نظر یافت نشد");
- }
-
- if (institutionContract.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify)
- {
- throw new BadRequestException("این قرارداد مالی در وضعیت مناسبی برای ارسال مجدد لینک تایید نمی باشد");
- }
- var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
- if (contractingParty == null)
- throw new NotFoundException("طرف قرارداد یافت نشد");
- var contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName;
- await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
- institutionContract.PublicId, contractingParty.id, institutionContract.id);
- return new OperationResult().Succcedded();
- }
-
- public async Task PrintOneAsync(long id)
- {
- return (await _institutionContractRepository.PrintAllAsync([id])).FirstOrDefault();
- }
+ private readonly IInstitutionContractRepository _institutionContractRepository;
+ private readonly IPersonalContractingPartyRepository _contractingPartyRepository;
+ private readonly IRepresentativeRepository _representativeRepository;
+ private readonly IFinancialStatmentApplication _financialStatmentApplication;
+ private readonly IEmployerRepository _employerRepository;
+ private readonly IWorkshopRepository _workshopRepository;
+ private readonly ILeftWorkRepository _leftWorkRepository;
+ private readonly IWorkshopApplication _workshopApplication;
+ private readonly IContractingPartyTempRepository _contractingPartyTempRepository;
+ private readonly IFinancialStatmentRepository _financialStatmentRepository;
+ private readonly IContactInfoApplication _contactInfoApplication;
+ private readonly IAccountApplication _accountApplication;
+ private readonly ISmsService _smsService;
+ private readonly IUidService _uidService;
+ private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
+ private readonly IPaymentGateway _paymentGateway;
+ private readonly IPaymentTransactionRepository _paymentTransactionRepository;
+
+
+ public InstitutionContractApplication(IInstitutionContractRepository institutionContractRepository,
+ IPersonalContractingPartyRepository contractingPartyRepository,
+ IRepresentativeRepository representativeRepository, IEmployerRepository employerRepository,
+ IWorkshopRepository workshopRepository, ILeftWorkRepository leftWorkRepository,
+ IFinancialStatmentApplication financialStatmentApplication, IWorkshopApplication workshopApplication,
+ IContractingPartyTempRepository contractingPartyTempRepository,
+ IFinancialStatmentRepository financialStatmentRepository, IContactInfoApplication contactInfoApplication,
+ IAccountApplication accountApplication, ISmsService smsService, IUidService uidService,
+ IFinancialInvoiceRepository financialInvoiceRepository, IHttpClientFactory httpClientFactory, IPaymentTransactionRepository paymentTransactionRepository)
+ {
+ _institutionContractRepository = institutionContractRepository;
+ _contractingPartyRepository = contractingPartyRepository;
+ _representativeRepository = representativeRepository;
+ _employerRepository = employerRepository;
+ _workshopRepository = workshopRepository;
+ _leftWorkRepository = leftWorkRepository;
+ _financialStatmentApplication = financialStatmentApplication;
+ _workshopApplication = workshopApplication;
+ _contractingPartyTempRepository = contractingPartyTempRepository;
+ _financialStatmentRepository = financialStatmentRepository;
+ _contactInfoApplication = contactInfoApplication;
+ _accountApplication = accountApplication;
+ _smsService = smsService;
+ _uidService = uidService;
+ _financialInvoiceRepository = financialInvoiceRepository;
+ _paymentTransactionRepository = paymentTransactionRepository;
+ _paymentGateway = new SepehrPaymentGateway(httpClientFactory);
+ }
+
+ public OperationResult Create(CreateInstitutionContract command)
+ {
+ string contractingPartyName = String.Empty;
+ bool dateMessages = false;
+ string dateMaessageResult = String.Empty;
+ var opration = new OperationResult();
+ if (_institutionContractRepository.Exists(x =>
+ x.ContractingPartyId == command.ContractingPartyId && x.RepresentativeId == command.RepresentativeId &&
+ x.TypeOfContract == command.TypeOfContract))
+ return opration.Failed(
+ "برای این معرف و طرف حساب قبلا قرارداد ایجاد شده است، شما میتوانید از تمدید استفاده کنید");
+
+ if (string.IsNullOrWhiteSpace(command.ContractDateFa))
+ {
+ dateMaessageResult = "تاریخ قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (string.IsNullOrWhiteSpace(command.ContractStartFa))
+ {
+ dateMaessageResult += "تاریخ شروع قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (string.IsNullOrWhiteSpace(command.ContractEndFa))
+ {
+ dateMaessageResult += "تاریخ پایان قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (dateMessages)
+ return opration.Failed(dateMaessageResult);
+
+ if (command.RepresentativeId < 1 && command.ContractingPartyId > 1)
+ {
+ return opration.Failed("معرف را انتخاب کنید");
+ }
+ else if (command.ContractingPartyId < 1 && command.RepresentativeId > 1)
+ {
+ return opration.Failed("طرف حساب را انتخاب کنید");
+ }
+ else if (command.ContractingPartyId < 1 && command.RepresentativeId < 1)
+ {
+ return opration.Failed("معرف و طرف حساب را انتخاب کنید");
+ }
+
+ var syear = command.ContractStartFa.Substring(0, 4);
+ var smonth = command.ContractStartFa.Substring(5, 2);
+ var sday = command.ContractStartFa.Substring(8, 2);
+ var contractingParty = _contractingPartyRepository.GetDetails(command.ContractingPartyId);
+ //شماره قرارداد
+ var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/0";
+
+ ///////////////////////
+ if (command.ContactInformationList.Count == 0)
+ return opration.Failed("ورود شماره تماس برای ارسال پیامک الزامیست");
+ var accountContact = command.ContactInformationList.Where(x =>
+ x.SendSmsString == "true" && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه" &&
+ !string.IsNullOrWhiteSpace(x.PhoneNumber)).ToList();
+ if (accountContact.Count == 0)
+ return opration.Failed("ورود شماره همراه با سمت طرف قرارداد برای ساخت حساب کاربری الزامیست");
+ var accountContactCount = command.ContactInformationList
+ .Where(x => x.PhoneType == "شماره همراه" && x.Position == "طرف قرارداد").ToList();
+ if (accountContactCount.Count > 1)
+ return opration.Failed("فقط یکی از شماره تلفن ها میتواند سمت طرف قرارداد داشته باشد");
+
+ contractingPartyName = contractingParty.LName;
+ //نام معرف
+ var representative = _representativeRepository.GetDetails(command.RepresentativeId).FullName;
+
+ var contractStartGr = command.ContractStartFa.ToGeorgianDateTime();
+ var contractEndGr = command.ContractEndFa.ToGeorgianDateTime();
+
+ var contractDateGr = command.ContractDateFa.ToGeorgianDateTime();
+
+ if (command.Address != null && command.State == null)
+ {
+ return opration.Failed("لطفا استان و شهر را انتخاب کنید");
+ }
+
+ if ((command.Address != null && command.State != null) && command.City == "شهرستان")
+ {
+ return opration.Failed("لطفا شهر را انتخاب کنید");
+ }
+
+ if (command.Address == null && command.State != null)
+ {
+ return opration.Failed("لطفا آدرس را وارد کنید");
+ }
+
+ if (string.IsNullOrWhiteSpace(command.OfficialCompany))
+ return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید");
+ if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax))
+ return opration.Failed("وضعیت ارزش افزوده را مشخص کنید");
+ if (string.IsNullOrWhiteSpace(command.TypeOfContract))
+ return opration.Failed("عنوان قرارداد را انتخاب کنید");
+
+ if (string.IsNullOrWhiteSpace(command.ContractAmountString))
+ command.ContractAmountString = "0";
+ if (string.IsNullOrWhiteSpace(command.DailyCompenseationString))
+ command.DailyCompenseationString = "0";
+ if (string.IsNullOrWhiteSpace(command.ObligationString))
+ command.ObligationString = "0";
+ if (string.IsNullOrWhiteSpace(command.TotalAmountString))
+ command.TotalAmountString = "0";
+ command.ValueAddedTax = string.IsNullOrWhiteSpace(command.ValueAddedTaxStr)
+ ? 0
+ : command.ValueAddedTaxStr.MoneyToDouble();
+ var contractAmount = command.ContractAmountString.ToDoubleMoney();
+ command.ContractAmount = Convert.ToDouble(contractAmount);
+ var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney();
+ command.DailyCompenseation = Convert.ToDouble(DailyCompenseation);
+ var Obligation = command.ObligationString.ToDoubleMoney();
+ command.Obligation = Convert.ToDouble(Obligation);
+ var TotalAmount = command.TotalAmountString.ToDoubleMoney();
+ command.TotalAmount = Convert.ToDouble(TotalAmount);
+ //var hasValueAddedTax = "false";
+ //double valueAddedTax = 0;
+ //if (command.HasValueAddedTax == "true")
+ //{
+ // hasValueAddedTax = "true";
+ // valueAddedTax = command.ContractAmount * 0.1;
+ // command.ContractAmount += valueAddedTax;
+ //}
+
+ var createContract = new InstitutionContract(contractNo, command.RepresentativeId, representative,
+ command.ContractingPartyId,
+ contractingPartyName, contractDateGr, command.ContractDateFa, command.State, command.City,
+ command.Address, contractStartGr,
+ command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount,
+ command.DailyCompenseation, command.Obligation,
+ command.TotalAmount, 0, command.WorkshopManualCount, command.EmployeeManualCount, command.Description,
+ command.OfficialCompany, command.TypeOfContract, command.HasValueAddedTax, command.ValueAddedTax, [], command.LawId);
+
+ _institutionContractRepository.Create(createContract);
+ _institutionContractRepository.SaveChanges();
+ return opration.Succcedded(createContract.id);
+ }
+
+ public OperationResult Extension(CreateInstitutionContract command)
+ {
+ bool dateMessages = false;
+ string dateMaessageResult = String.Empty;
+ var opration = new OperationResult();
+
+ command.ExtensionNo += 1;
+ if (_institutionContractRepository.Exists(x =>
+ x.ExtensionNo == command.ExtensionNo && x.ContractingPartyId == command.ContractingPartyId &&
+ x.TypeOfContract == command.TypeOfContract))
+ return opration.Failed("برای این قرارداد قبلا تمدید ایجاد شده است");
+
+
+ if (string.IsNullOrWhiteSpace(command.ContractDateFa))
+ {
+ dateMaessageResult = "تاریخ قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (string.IsNullOrWhiteSpace(command.ContractStartFa))
+ {
+ dateMaessageResult += "تاریخ شروع قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (string.IsNullOrWhiteSpace(command.ContractEndFa))
+ {
+ dateMaessageResult += "تاریخ پایان قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (dateMessages)
+ return opration.Failed(dateMaessageResult);
+
+ var firstContract =
+ _institutionContractRepository.GetFirstContract(command.ContractingPartyId, command.TypeOfContract);
+
+ var syear = firstContract.ContractStartFa.Substring(0, 4);
+ var smonth = firstContract.ContractStartFa.Substring(5, 2);
+ var sday = firstContract.ContractStartFa.Substring(8, 2);
+ var contractingParty = _contractingPartyRepository.GetDetails(command.ContractingPartyId);
+ //شماره قرارداد
+ var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/{command.ExtensionNo}";
+
+
+ var contractStartGr = command.ContractStartFa.ToGeorgianDateTime();
+ var contractEndGr = command.ContractEndFa.ToGeorgianDateTime();
+
+ var contractDateGr = command.ContractDateFa.ToGeorgianDateTime();
+ if (_institutionContractRepository.Exists(x =>
+ ((contractStartGr >= x.ContractStartGr && contractStartGr <= x.ContractEndGr) ||
+ (contractEndGr >= x.ContractStartGr && contractEndGr <= x.ContractEndGr)) &&
+ x.TypeOfContract == command.TypeOfContract && x.ContractingPartyId == command.ContractingPartyId))
+ return opration.Failed("تاریخ شروع و پایان وارد شده با قرارداد دیگری تداخل دارد");
+ if (command.Address != null && command.State == null)
+ {
+ return opration.Failed("لطفا استان و شهر را انتخاب کنید");
+ }
+
+ if ((command.Address != null && command.State != null) && command.City == "شهرستان")
+ {
+ return opration.Failed("لطفا شهر را انتخاب کنید");
+ }
+
+ if (command.Address == null && command.State != null)
+ {
+ return opration.Failed("لطفا آدرس را وارد کنید");
+ }
+
+ if (string.IsNullOrWhiteSpace(command.OfficialCompany))
+ return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید");
+ if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax))
+ return opration.Failed("وضعیت ارزش افزوده را مشخص کنید");
+ if (string.IsNullOrWhiteSpace(command.TypeOfContract))
+ return opration.Failed("عنوان قرارداد را انتخاب کنید");
+ if (string.IsNullOrWhiteSpace(command.ContractAmountString))
+ command.ContractAmountString = "0";
+ if (string.IsNullOrWhiteSpace(command.DailyCompenseationString))
+ command.DailyCompenseationString = "0";
+ if (string.IsNullOrWhiteSpace(command.ObligationString))
+ command.ObligationString = "0";
+ if (string.IsNullOrWhiteSpace(command.TotalAmountString))
+ command.TotalAmountString = "0";
+ command.ValueAddedTax = string.IsNullOrWhiteSpace(command.ValueAddedTaxStr)
+ ? 0
+ : command.ValueAddedTaxStr.MoneyToDouble();
+ var contractAmount = command.ContractAmountString.ToDoubleMoney();
+ command.ContractAmount = Convert.ToDouble(contractAmount);
+ var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney();
+ command.DailyCompenseation = Convert.ToDouble(DailyCompenseation);
+ var Obligation = command.ObligationString.ToDoubleMoney();
+ command.Obligation = Convert.ToDouble(Obligation);
+ var TotalAmount = command.TotalAmountString.ToDoubleMoney();
+ command.TotalAmount = Convert.ToDouble(TotalAmount);
+ var createContract = new InstitutionContract(contractNo, command.RepresentativeId, command.RepresentativeName,
+ command.ContractingPartyId,
+ command.ContractingPartyName, contractDateGr, command.ContractDateFa, command.State, command.City,
+ command.Address, contractStartGr,
+ command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount,
+ command.DailyCompenseation, command.Obligation,
+ command.TotalAmount, command.ExtensionNo, command.WorkshopManualCount, command.EmployeeManualCount,
+ command.Description, command.OfficialCompany, command.TypeOfContract, command.HasValueAddedTax,
+ command.ValueAddedTax, [], command.LawId);
+
+ _institutionContractRepository.Create(createContract);
+ _institutionContractRepository.SaveChanges();
+
+
+ return opration.Succcedded(createContract.id);
+ }
+
+ public OperationResult Edit(EditInstitutionContract command)
+ {
+ bool dateMessages = false;
+ string dateMaessageResult = String.Empty;
+ var opration = new OperationResult();
+ var ContractEdit = _institutionContractRepository.Get(command.Id);
+ if (ContractEdit == null)
+ opration.Failed("رکورد مورد نظر وجود ندارد");
+
+ var contractStartGr = command.ContractStartFa.ToGeorgianDateTime();
+ var contractEndGr = command.ContractEndFa.ToGeorgianDateTime();
+
+ var contractDateGr = command.ContractDateFa.ToGeorgianDateTime();
+
+ if (_institutionContractRepository.Exists(x =>
+ x.ContractingPartyId == ContractEdit.ContractingPartyId &&
+ ((contractStartGr >= x.ContractStartGr && contractStartGr <= x.ContractEndGr) ||
+ (contractEndGr >= x.ContractStartGr && contractEndGr <= x.ContractEndGr)) && x.id != command.Id &&
+ x.TypeOfContract == command.TypeOfContract))
+ return opration.Failed("در بازه تاریخ وارد شده قرارداد دیگری وجود دارد");
+ //if (_institutionContractRepository.Exists(x =>
+ // x.ContractingPartyId == ContractEdit.ContractingPartyId && (x.ContractStartGr <= contractDateGr || x.ContractDateGr <= contractDateGr) && x.id != command.Id))
+ // return opration.Failed("تاریخ عقد قرارداد با قرارداد دیگری تداخل دارد");
+ if (string.IsNullOrWhiteSpace(command.ContractDateFa))
+ {
+ dateMaessageResult = "تاریخ قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (string.IsNullOrWhiteSpace(command.ContractStartFa))
+ {
+ dateMaessageResult += "تاریخ شروع قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (string.IsNullOrWhiteSpace(command.ContractEndFa))
+ {
+ dateMaessageResult += "تاریخ پایان قراراداد اجباری است. ";
+ dateMessages = true;
+ }
+
+ if (dateMessages)
+ return opration.Failed(dateMaessageResult);
+ if (command.Address != null && command.State == null)
+ {
+ return opration.Failed("لطفا استان و شهر را انتخاب کنید");
+ }
+
+ if ((command.Address != null && command.State != null) && command.City == "شهرستان")
+ {
+ return opration.Failed("لطفا شهر را انتخاب کنید");
+ }
+
+ if (command.Address == null && command.State != null)
+ {
+ return opration.Failed("لطفا آدرس را وارد کنید");
+ }
+
+ if (string.IsNullOrWhiteSpace(command.OfficialCompany))
+ return opration.Failed("رسمی یا غیر رسمی بودن پرداخت را مشخص کنید");
+ if (command.OfficialCompany == "Official" && string.IsNullOrWhiteSpace(command.HasValueAddedTax))
+ return opration.Failed("وضعیت ارزش افزوده را مشخص کنید");
+ if (string.IsNullOrWhiteSpace(command.TypeOfContract))
+ return opration.Failed("عنوان قرارداد را انتخاب کنید");
+
+ if (string.IsNullOrWhiteSpace(command.ContractAmountString))
+ command.ContractAmountString = "0";
+ if (string.IsNullOrWhiteSpace(command.DailyCompenseationString))
+ command.DailyCompenseationString = "0";
+ if (string.IsNullOrWhiteSpace(command.ObligationString))
+ command.ObligationString = "0";
+ if (string.IsNullOrWhiteSpace(command.TotalAmountString))
+ command.TotalAmountString = "0";
+
+ command.ValueAddedTax = command.ValueAddedTaxStr.MoneyToDouble();
+ var contractAmount = command.ContractAmountString.ToDoubleMoney();
+ command.ContractAmount = Convert.ToDouble(contractAmount);
+ var DailyCompenseation = command.DailyCompenseationString.ToDoubleMoney();
+ command.DailyCompenseation = Convert.ToDouble(DailyCompenseation);
+ var Obligation = command.ObligationString.ToDoubleMoney();
+ command.Obligation = Convert.ToDouble(Obligation);
+ var TotalAmount = command.TotalAmountString.ToDoubleMoney();
+ command.TotalAmount = Convert.ToDouble(TotalAmount);
+
+ ContractEdit.Edit(contractDateGr, command.ContractDateFa, command.State, command.City, command.Address,
+ contractStartGr,
+ command.ContractStartFa, contractEndGr, command.ContractEndFa, command.ContractAmount,
+ command.DailyCompenseation,
+ command.Obligation, command.TotalAmount, command.WorkshopManualCount, command.EmployeeManualCount,
+ command.Description, command.OfficialCompany, command.TypeOfContract, command.ValueAddedTax,
+ command.HasValueAddedTax);
+ _institutionContractRepository.SaveChanges();
+ return opration.Succcedded(command.Id);
+ }
+
+ public EditInstitutionContract GetDetails(long id)
+ {
+ return _institutionContractRepository.GetDetails(id);
+ }
+
+ public List Search(InstitutionContractSearchModel searchModel)
+ {
+ var query = _institutionContractRepository.Search(searchModel);
+ var join = new List();
+
+ var now = DateTime.Now;
+ var nowFa = now.ToFarsi();
+
+ var endFa = nowFa.FindeEndOfMonth();
+ var endThisMontGr = endFa.ToGeorgianDateTime();
+ //var watch = System.Diagnostics.Stopwatch.StartNew();
+
+
+ var newResult = query.Select(x => new InstitutionContractViewModel
+ {
+ Id = x.Id,
+ ContractNo = x.ContractNo,
+ ContractStartGr = x.ContractStartGr,
+ ContractStartFa = x.ContractStartFa,
+ ContractEndGr = x.ContractEndGr,
+ ContractEndFa = x.ContractEndFa,
+ //RepresentativeId = x.RepresentativeId,
+ RepresentativeName = x.RepresentativeName,
+ //ContractingPartyName = _contractingPartyRepository.GetDetails(x.ContractingPartyId).LName,
+ //IsContractingPartyBlock = _contractingPartyRepository.GetDetails(x.ContractingPartyId).IsBlock,
+ //BlockTimes = _contractingPartyRepository.GetDetails(x.ContractingPartyId).BlockTimes,
+ ContractingPartyId = x.ContractingPartyId,
+ EmployerViewModels = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId),
+ EmployerNo = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId)
+ .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.EmployerNo,
+ EmployerName = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId)
+ .FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.FullName,
+ //EmployerId = _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)?.Id == null ? 0 :
+ // _employerRepository.GetEmployerByContracrtingPartyID(x.ContractingPartyId).FirstOrDefault(xn => xn.ContractingPartyID == x.ContractingPartyId)!.Id,
+ ContractAmount = x.ContractAmount,
+ TotalAmount = x.TotalAmount,
+ SearchAmount = x.SearchAmount,
+ IsActiveString = x.IsActiveString,
+ OfficialCompany = x.OfficialCompany,
+ Signature = x.Signature,
+ ExpireColor = ExpCheckColor(now, x.ContractEndGr, endThisMontGr, x.ContractAmount, x.IsActiveString),
+ BalanceDouble = TotalBalance(x.ContractingPartyId).TotalBalanceDbl,
+ BalanceStr = TotalBalance(x.ContractingPartyId).TotalBalanceStr,
+ //WorkshopViewModels = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopViewModels,
+ //WorkshopCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).WorkshopCount,
+ //EmployeeCount = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).EmployeeCount,
+ //ArchiveCode = WorkShopDetailsAndEmployeeCount(x.ContractingPartyId).ArchiveCode,
+ TypeOfContract = x.TypeOfContract
+ }).ToList();
+ //Console.WriteLine("efTime : " + watch.Elapsed);
+
+ //var watchw = System.Diagnostics.Stopwatch.StartNew();
+ foreach (var item in newResult)
+ {
+ //string totalBalanceStr = "0";
+ //double totalBalance = 0;
+ //var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(item.ContractingPartyId);
+ //var allTransactions = firstGetStatement.FinancialTransactionViewModels;
+ //if (allTransactions != null)
+ //{
+ // allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList();
+ // var debt = allTransactions.Sum(x => x.Deptor);
+ // var credit = allTransactions.Sum(x => x.Creditor);
+ // totalBalance = debt - credit;
+ // totalBalanceStr = totalBalance.ToMoney();
+ //}
+ var contractingParty = _contractingPartyRepository.GetDetails(item.ContractingPartyId);
+ if (contractingParty != null)
+ {
+ item.ContractingPartyName = contractingParty.LName;
+ item.IsContractingPartyBlock = contractingParty.IsBlock;
+ item.BlockTimes = contractingParty.BlockTimes;
+ }
+
+
+ var employer = _employerRepository.GetEmployerByContracrtingPartyID(item.ContractingPartyId);
+ item.EmployerViewModels = employer;
+ item.EmployerName = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.FullName;
+ var id = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.Id;
+ item.EmployerNo = employer.FirstOrDefault(x => x.ContractingPartyID == item.ContractingPartyId)?.EmployerNo;
+ if (id != null) item.EmployerId = (long)id;
+
+ var emplId = item.EmployerViewModels.Select(x => x.Id).ToList();
+
+ item.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId);
+ var workshopIds = item.WorkshopViewModels.Select(x => x.Id).ToList();
+ var left = 0;
+ item.WorkshopCount = Convert.ToString(item.WorkshopViewModels.Count);
+ //var joinPersonelList = new List();
+ int pCount = 0;
+ foreach (var workshopId in workshopIds)
+ {
+ //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId);
+ //var noBlock = reslt.Where(x => x.Black == false).ToList();
+ //joinPersonelList.AddRange(noBlock);
+ var p = _workshopApplication.PersonnelCount(workshopId);
+ pCount += p;
+ }
+ //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList();
+ //left = joinlistWithoutDuplicat.Count();
+ // var left= _leftWorkRepository.GetLeftPersonelByWorkshopId(workshopIds).Count();
+
+ item.EmployeeCount = Convert.ToString(pCount);
+ //if (item.ContractEndGr < now)
+ // item.ExpireColor = "black";
+ //if (item.ContractEndGr >= now && item.ContractEndGr <= endThisMontGr)
+ // item.ExpireColor = "red";
+ //if (item.ContractAmount == "0")
+ // item.ExpireColor = "purple";
+ int archiveCode = 0;
+ if (item.WorkshopViewModels.Count > 0)
+ {
+ var workshop = item.WorkshopViewModels.OrderBy(x => x.Id)?.ToList();
+
+ var arc = workshop.Select(x => new ArchiveCodConvertoint
+ {
+ ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(),
+ }).OrderBy(x => x.ArchiveCodeInt).ToList();
+ var minArchiveCode = arc.Min(x => x.ArchiveCodeInt);
+ archiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode;
+ }
+
+ var result = new InstitutionContractViewModel()
+ {
+ Id = item.Id,
+ ContractNo = item.ContractNo,
+ ContractStartGr = item.ContractStartGr,
+ ContractStartFa = item.ContractStartFa,
+ ContractEndGr = item.ContractEndGr,
+ ContractEndFa = item.ContractEndFa,
+ RepresentativeName = item.RepresentativeName,
+ ContractingPartyName = item.ContractingPartyName,
+ ContractingPartyId = item.ContractingPartyId,
+ EmployerNo = item.EmployerNo,
+ ContractAmount = item.ContractAmount,
+ EmployerName = item.EmployerName,
+ EmployerViewModels = item.EmployerViewModels,
+ IsActiveString = item.IsActiveString,
+ WorkshopCount = item.WorkshopCount,
+ WorkshopViewModels = item.WorkshopViewModels,
+ EmployeeCount = item.EmployeeCount,
+ ExpireColor = item.ExpireColor,
+ SearchAmount = item.SearchAmount,
+ BalanceDouble = item.BalanceDouble,
+ BalanceStr = item.BalanceStr,
+ Signature = item.Signature,
+ ArchiveCode = archiveCode,
+ TypeOfContract = item.TypeOfContract,
+ IsContractingPartyBlock = item.IsContractingPartyBlock,
+ BlockTimes = item.BlockTimes,
+ };
+ join.Add(result);
+ }
+
+ //Console.WriteLine("forEchTime : " + watchw.Elapsed);
+ var findeByFilter = new List();
+ if (searchModel.WorkshopId != 0)
+ {
+ foreach (var item in join)
+ {
+ var check = item.WorkshopViewModels.Where(x => x.Id == searchModel.WorkshopId).ToList();
+ if (check.Count > 0)
+ findeByFilter.Add(item);
+ }
+
+ join = findeByFilter;
+ }
+
+ var findeByFilter2 = new List();
+ if (searchModel.EmployerId != 0)
+ {
+ foreach (var item in join)
+ {
+ var check = item.EmployerViewModels.Where(x => x.Id == searchModel.EmployerId).ToList();
+ if (check.Count > 0)
+ findeByFilter2.Add(item);
+ }
+
+ join = findeByFilter2;
+ }
+
+
+ join = join.OrderBy(x => x.WorkshopCount != "0" && string.IsNullOrWhiteSpace(x.ExpireColor))
+ .ThenBy(x => x.WorkshopCount == "0" && string.IsNullOrWhiteSpace(x.ExpireColor))
+ .ThenBy(x => x.ExpireColor == "red")
+ .ThenBy(x => x.ExpireColor == "purple")
+ .ThenBy(x => x.ExpireColor == "black").ToList();
+
+ return join;
+ }
+
+ public List NewSearch(InstitutionContractSearchModel searchModel)
+ {
+ return _institutionContractRepository.NewSearch(searchModel);
+ }
+
+
+ public List GetInstitutionContractToSetServicesExcelImport()
+ {
+ var result = _institutionContractRepository.NewSearch(new InstitutionContractSearchModel());
+
+ return result.Where(x =>
+ x.IsActiveString == "true" && x.IsContractingPartyBlock != "true" && x.WorkshopCount != "0" &&
+ x.ContractStartGr <= DateTime.Now && x.ContractEndGr >= DateTime.Now).ToList();
+ }
+
+ public string ExpCheckColor(DateTime now, DateTime ContractEndGr, DateTime endThisMontGr, string ContractAmount,
+ string isActiveString)
+ {
+ string result = "";
+
+ if (ContractEndGr < now)
+ result = "black";
+ if (ContractEndGr >= now && ContractEndGr <= endThisMontGr)
+ result = "red";
+ if (ContractAmount == "0")
+ result = "purple";
+ if (isActiveString == "blue")
+ result = "blue";
+ return result;
+ }
+
+ public TotalbalancViewModel TotalBalance(long contractingPartyId)
+ {
+ var result = new TotalbalancViewModel();
+
+ var firstGetStatement = _financialStatmentApplication.GetDetailsByContractingPartyId(contractingPartyId);
+ var allTransactions = firstGetStatement.FinancialTransactionViewModels;
+ if (allTransactions != null)
+ {
+ allTransactions = allTransactions.OrderBy(x => x.TdateGr).ToList();
+ var debt = allTransactions.Sum(x => x.Deptor);
+ var credit = allTransactions.Sum(x => x.Creditor);
+ result.TotalBalanceDbl = debt - credit;
+ result.TotalBalanceStr = result.TotalBalanceDbl.ToMoney();
+ }
+
+ return result;
+ }
+
+ public WorkshopsAndEmployeeViewModel WorkShopDetailsAndEmployeeCount(long contractingPartyId)
+ {
+ var result = new WorkshopsAndEmployeeViewModel();
+
+ var emplId = _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId).Select(x => x.Id)
+ .ToList();
+ ;
+ result.WorkshopViewModels = _workshopRepository.GetWorkshopsByEmployerId(emplId);
+ var workshopIds = result.WorkshopViewModels.Select(x => x.Id).ToList();
+ var left = 0;
+ result.WorkshopCount = Convert.ToString(workshopIds.Count);
+ var joinPersonelList = new List();
+ foreach (var workshopId in workshopIds)
+ {
+ //var reslt = _workshopApplication.GetConnectedPersonnels(workshopId);
+ //var noBlock = reslt.Where(x => x.Black == false).ToList();
+ //joinPersonelList.AddRange(noBlock);
+ var pCount = _workshopApplication.PersonnelCount(workshopId);
+ result.EmployeeCount = Convert.ToString(pCount);
+ }
+ //var joinlistWithoutDuplicat = joinPersonelList.GroupBy(x => x.PersonName).Select(x => x.First()).ToList();
+ //left = joinlistWithoutDuplicat.Count();
+ //result.EmployeeCount = Convert.ToString(left);
+
+
+ result.ArchiveCode = 0;
+ if (workshopIds.Count > 0)
+ {
+ var workshop = result.WorkshopViewModels.OrderBy(x => x.Id)?.ToList();
+
+ var arc = workshop.Select(x => new ArchiveCodConvertoint
+ {
+ ArchiveCodeInt = x.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : x.ArchiveCode.ConvertToInt(),
+ }).OrderBy(x => x.ArchiveCodeInt).ToList();
+ var minArchiveCode = arc.Min(x => x.ArchiveCodeInt);
+ result.ArchiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode;
+ }
+
+ return result;
+ }
+
+ public List PrintAll(List id)
+ {
+ throw new NotImplementedException();
+ }
+
+ public InstitutionContractViewModel PrintOne(long id)
+ {
+ var get = _institutionContractRepository.GetDetails(id);
+ var employer = _employerRepository.GetEmployerByContracrtingPartyID(get.ContractingPartyId);
+ var employerViewModels = employer;
+ var emplId = employerViewModels.Select(x => x.Id).ToList();
+ var workshops = _workshopRepository.GetWorkshopsByEmployerId(emplId);
+ var res = new InstitutionContractViewModel()
+ {
+ Id = get.Id,
+ ContractNo = get.ContractNo,
+
+ ContractStartFa = get.ContractStartFa,
+
+ ContractEndFa = get.ContractEndFa,
+
+ ContractingPartyName = get.ContractingPartyName,
+
+ ContractingPartyId = get.ContractingPartyId,
+ ContractDateFa = get.ContractDateFa,
+ State = get.State,
+ City = get.City,
+ Address = get.Address,
+ Description = get.Description,
+ HasValueAddedTax = get.HasValueAddedTax,
+ ValueAddedTax = get.ValueAddedTax,
+ ContractAmount = get.ContractAmountString,
+ DailyCompenseation = get.DailyCompenseationString,
+ Obligation = get.ObligationString,
+ TotalAmount = get.TotalAmountString,
+ WorkshopViewModels = workshops
+ };
+ return res;
+ }
+
+
+ public OperationResult Active(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _institutionContractRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.Active();
+
+ _institutionContractRepository.SaveChanges();
+ return opration.Succcedded();
+ }
+
+ public OperationResult DeActive(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _institutionContractRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.DeActive();
+
+
+ _institutionContractRepository.SaveChanges();
+ return opration.Succcedded();
+ }
+
+ public OperationResult DeActiveBlue(long id)
+ {
+ var opration = new OperationResult();
+ var institutionContract = _institutionContractRepository.Get(id);
+ if (institutionContract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ institutionContract.DeActiveBlue();
+ _institutionContractRepository.SaveChanges();
+
+ return opration.Succcedded();
+ }
+
+ public OperationResult DeActiveAllConnections(long id)
+ {
+ var opration = new OperationResult();
+ var institutionContract = _institutionContractRepository.Get(id);
+ if (institutionContract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+
+ var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
+ if (contractingParty != null)
+ {
+ contractingParty.DeActive();
+ _contractingPartyRepository.SaveChanges();
+ var employers =
+ _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId);
+ //var employersIdList = employers.Select(x => x.Id).ToList();
+ //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList);
+ //foreach (var workshop in workshops)
+ //{
+ // var res = _workshopApplication.DeActive(workshop.Id);
+ //}
+ foreach (var employer in employers)
+ {
+ var res = _employerRepository.DeActiveAll(employer.Id);
+ }
+ }
+
+ return opration.Succcedded();
+ }
+
+ public OperationResult ReActiveAllConnections(long id)
+ {
+ var opration = new OperationResult();
+ var institutionContract = _institutionContractRepository.Get(id);
+ if (institutionContract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+
+ var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
+ if (contractingParty != null)
+ {
+ contractingParty.Active();
+ _contractingPartyRepository.SaveChanges();
+ var employers =
+ _employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId);
+ //var employersIdList = employers.Select(x => x.Id).ToList();
+ //var workshops = _workshopApplication.GetWorkshopsByEmployerId(employersIdList);
+ //foreach (var workshop in workshops)
+ //{
+ // var res = _workshopApplication.DeActive(workshop.Id);
+ //}
+ foreach (var employer in employers)
+ {
+ var res = _employerRepository.ActiveAll(employer.Id);
+ }
+ }
+
+ return opration.Succcedded();
+ }
+
+ public void ReActiveAllAfterCreateNew(long contractingPartyId)
+ {
+ var contractingParty = _contractingPartyRepository.Get(contractingPartyId);
+ if (contractingParty != null)
+ {
+ if (contractingParty.IsActiveString == "false")
+ {
+ contractingParty.Active();
+ _contractingPartyRepository.SaveChanges();
+ }
+
+ var employers =
+ _employerRepository.GetEmployerByContracrtingPartyID(contractingPartyId);
+
+ foreach (var employer in employers)
+ {
+ var res = _employerRepository.ActiveAll(employer.Id);
+ }
+ }
+ }
+
+
+ public void RemoveContract(long id)
+ {
+ _institutionContractRepository.RemoveContract(id);
+ }
+
+
+ public OperationResult Sign(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _institutionContractRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.Sign();
+
+
+ _institutionContractRepository.SaveChanges();
+ opration.IsSuccedded = true;
+ return opration.Succcedded();
+ }
+
+ public OperationResult UnSign(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _institutionContractRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.UnSign();
+
+
+ _institutionContractRepository.SaveChanges();
+ opration.IsSuccedded = true;
+ return opration.Succcedded();
+ }
+
+ public void CreateContractingPartyAccount(long contractingPartyid, long accountId)
+ {
+ _institutionContractRepository.CreateContractingPartyAccount(contractingPartyid, accountId);
+ }
+
+ public double GetcontractAmount(int countPerson)
+ {
+ return _institutionContractRepository.GetcontractAmount(countPerson);
+ }
+
+ public async Task> GetList(
+ InstitutionContractListSearchModel searchModel)
+ {
+ return await _institutionContractRepository.GetList(searchModel);
+ }
+
+ public Task GetListStats(InstitutionContractListSearchModel searchModel)
+ {
+ return _institutionContractRepository.GetListStats(searchModel);
+ }
+
+ public async Task CreateAsync(CreateInstitutionContractRequest command)
+ {
+
+ var opration = new OperationResult();
+ var syear = command.ContractStartFa.Substring(0, 4);
+ var smonth = command.ContractStartFa.Substring(5, 2);
+ var sday = command.ContractStartFa.Substring(8, 2);
+
+ var transaction = await _contractingPartyRepository.BeginTransactionAsync();
+
+ if (command.ContractStartFa.TryToGeorgianDateTime(out var contractStartGr) == false)
+ return opration.Failed("تاریخ شروع قرارداد معتبر نیست");
+
+ contractStartGr.AddMonthsFa((int)command.Duration, out var contractEndGr);
+
+ contractEndGr = contractEndGr.ToFarsi().FindeEndOfMonth().ToGeorgianDateTime();
+
+ PersonalContractingParty existingContractingParty = null;
+ if (command.ContractingPartyLegalType == LegalType.Legal)
+ {
+ existingContractingParty =
+ await _contractingPartyRepository.GetByNationalId(command.LegalParty.NationalId);
+ if (_contractingPartyRepository.Exists(x =>
+ x.LName == command.LegalParty.CompanyName && x.RegisterId == command.LegalParty.RegisterId))
+ {
+ if (_institutionContractRepository.Exists(x => x.ContractStartGr < contractEndGr
+ && contractStartGr < x.ContractEndGr
+ && x.ContractingPartyId == existingContractingParty.id
+ && x.IsActiveString == "true"))
+ {
+ throw new BadRequestException("امکان ایجاد قرارداد تکراری وجود ندارد");
+ }
+ }
+ }
+ else if (command.ContractingPartyLegalType == LegalType.Real)
+ {
+ existingContractingParty =
+ await _contractingPartyRepository.GetByNationalCode(command.RealParty.NationalCode);
+ if (_contractingPartyRepository.Exists(x =>
+ x.LName == command.RealParty.LName && x.Nationalcode == command.RealParty.NationalCode))
+ {
+ if (_institutionContractRepository.Exists(x => x.ContractStartGr < contractEndGr
+ && contractStartGr < x.ContractEndGr
+ && x.ContractingPartyId == existingContractingParty.id
+ && x.IsActiveString == "true"))
+ {
+ throw new BadRequestException("امکان ایجاد قرارداد تکراری وجود ندارد");
+ }
+ }
+ }
+
+ PersonalContractingParty contractingParty;
+ if (existingContractingParty != null)
+ {
+ contractingParty = existingContractingParty;
+ }
+ else
+ {
+ OperationResult contractingPartyResult = command.ContractingPartyLegalType switch
+ {
+ LegalType.Legal => await CreateLegalContractingPartyEntity(command.LegalParty, command.RepresentativeId,
+ command.Address,
+ command.City, command.Province),
+ LegalType.Real => await CreateRealContractingPartyEntity(command.RealParty, command.RepresentativeId,
+ command.Address,
+ command.City, command.Province),
+ _ => throw new BadRequestException("نوع طرف قرارداد مشخص نشده است")
+ };
+
+ if (!contractingPartyResult.IsSuccedded)
+ return opration.Failed(contractingPartyResult.Message);
+
+ contractingParty = contractingPartyResult.Data;
+ }
+
+ if (_institutionContractRepository.Exists(x =>
+ x.ContractingPartyId == contractingParty.id && x.RepresentativeId == command.RepresentativeId &&
+ x.TypeOfContract == "JobRelation"))
+ return opration.Failed(
+ "برای این معرف و طرف حساب قبلا قرارداد ایجاد شده است، شما میتوانید از تمدید استفاده کنید");
+
+ var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/0";
+
+ var representative = _representativeRepository.Get(command.RepresentativeId);
+ if (representative == null)
+ return opration.Failed("معرف مورد نظر یافت نشد");
+
+ if (command.IsInstallment &&
+ !command.Workshops.Any(x => x.HasContractPlanInPerson || x.HasInsurancePlanInPerson))
+ {
+ return opration.Failed("برای قراردادهای اقساطی حداقل یک کارگاه باید دارای طرح حضوری باشد");
+ }
+
+
+ var today = DateTime.Today;
+
+ var contractDateGr = today;
+ var contractDateFa = contractDateGr.ToFarsi();
+
+
+ var hasValueAddedTax = command.TaxAmount > 0 ? "true" : "false";
+
+ var contractingPartyFullName = "";
+ if (contractingParty.IsLegal == "حقیقی")
+ {
+
+ contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName;
+ }
+ else
+ {
+ contractingPartyFullName = contractingParty.CeoFName + " " + contractingParty.CeoLName;
+ }
+
+ var workshopDetails = command.Workshops.Select(x =>
+ new InstitutionContractWorkshopInitial(x.WorkshopName, x.HasRollCallPlan, false, x.HasCustomizeCheckoutPlan,
+ x.HasContractPlan, x.HasContractPlanInPerson, x.HasInsurancePlan, x.HasInsurancePlanInPerson,
+ x.PersonnelCount, x.Price)).ToList();
+
+
+ var entity = new InstitutionContract(contractNo, command.RepresentativeId, representative.FullName,
+ contractingParty.id,
+ contractingPartyFullName, contractDateGr, contractDateFa, command.Province, command.City, command.Address,
+ contractStartGr,
+ contractStartGr.ToFarsi(), contractEndGr, contractEndGr.ToFarsi(), command.OneMonthAmount,
+ command.DailyCompensation,
+ command.Obligation, command.TotalAmount, 0,
+ command.Workshops.Count.ToString(),
+ command.Workshops.Sum(x => x.PersonnelCount).ToString(), command.Description,
+ "NotOfficial", "JobRelation", hasValueAddedTax,
+ command.TaxAmount, workshopDetails, command.LawId);
+
+
+ FinancialStatment financialStatement;
+ if (_financialStatmentRepository.Exists(x => x.ContractingPartyId == contractingParty.id))
+ {
+ financialStatement = await _financialStatmentRepository.GetByContractingPartyId(contractingParty.id);
+ }
+ else
+ {
+ financialStatement = new FinancialStatment(contractingParty.id, contractingPartyFullName);
+ await _financialStatmentRepository.CreateAsync(financialStatement);
+ }
+ await _institutionContractRepository.CreateAsync(entity);
+ await _institutionContractRepository.SaveChangesAsync();
+
+ double invoiceAmount;
+ string invoiceItemDescription;
+ FinancialInvoiceItemType invoiceItemType;
+ long invoiceItemEntityId;
+ if (command.IsInstallment)
+ {
+ var installments =
+ CalculateInstallment(command.TotalAmount, (int)command.Duration, command.ContractStartFa, true);
+
+
+ // دریافت مبلغ اولین قسط
+ //این کار برای این هست که اولین قسط باید با تاریخ امروز باشد و باید به وضعیت مالی بدهی ایجاد شود که یوزر اولین بدهی را وارد کند
+ var firstInstallmentAmount = installments.First().Amount;
+
+ // حذف اولین قسط
+ installments.RemoveAt(0);
+
+ // ایجاد قسط جدید با تاریخ امروز
+ var todayInstallment = new InstitutionContractInstallment(DateTime.Today, firstInstallmentAmount, "");
+
+
+ // اضافه کردن قسط جدید به ابتدای لیست
+ installments.Insert(0, todayInstallment);
+
+ entity.SetInstallments(installments);
+
+ await _institutionContractRepository.SaveChangesAsync();
+
+ var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
+ "قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0);
+
+ financialStatement.AddFinancialTransaction(financialTransaction);
+ invoiceAmount = firstInstallmentAmount;
+ invoiceItemDescription = $"پرداخت قسط اول قرارداد شماره {entity.ContractNo}";
+ invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment;
+ invoiceItemEntityId = todayInstallment.Id;
+ }
+ else
+ {
+ var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
+ "پرداخت کل سرویس", "debt", "بابت خدمات", command.TotalAmount, 0, 0);
+ financialStatement.AddFinancialTransaction(financialTransaction);
+ invoiceAmount = command.TotalAmount;
+ invoiceItemDescription = $"پرداخت کل قرارداد شماره {entity.ContractNo}";
+ invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
+ invoiceItemEntityId = entity.id;
+ }
+
+ var financialInvoice = new FinancialInvoice(invoiceAmount, contractingParty.id, $"خرید قرارداد مالی شماره {entity.ContractNo}");
+ var financialInvoiceItem = new FinancialInvoiceItem(invoiceItemDescription, invoiceAmount, 0, invoiceItemType, invoiceItemEntityId);
+ financialInvoice.AddItem(financialInvoiceItem);
+
+
+ await _financialInvoiceRepository.CreateAsync(financialInvoice);
+ await _institutionContractRepository.SaveChangesAsync();
+
+ var mainContactInfo = new CreateContactInfo
+ {
+ InstitutionContractId = entity.id,
+ PhoneType = "شماره همراه",
+ Position = "طرف قرارداد",
+ PhoneNumber = contractingParty.Phone,
+ FnameLname = contractingPartyFullName,
+ SendSms = true
+ };
+ _contactInfoApplication.Create(mainContactInfo);
+
+ foreach (var contactInfo in command.ContactInfos)
+ {
+ if (contactInfo.PhoneNumber != null)
+ {
+ var contactinfo = new CreateContactInfo
+ {
+ InstitutionContractId = entity.id,
+ PhoneType = contactInfo.PhoneType,
+ Position = contactInfo.Position,
+ PhoneNumber = contactInfo.PhoneNumber,
+ FnameLname = contactInfo.FnameLname,
+ SendSms = contactInfo.SendSmsString == "true" ? true : false
+ };
+ _contactInfoApplication.Create(contactinfo);
+ }
+ }
+
+ var userPass = contractingParty.IsLegal == "حقیقی"
+ ? contractingParty.Nationalcode
+ : contractingParty.NationalId;
+ var createAcc = new RegisterAccount
+ {
+ Fullname = contractingParty.LName,
+ Username = userPass,
+ Password = userPass,
+ Mobile = contractingParty.Phone,
+ NationalCode = userPass
+ };
+ var res = _accountApplication.RegisterClient(createAcc);
+ if (res.IsSuccedded)
+ CreateContractingPartyAccount(contractingParty.id, res.SendId);
+
+
+ await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
+ entity.PublicId, contractingParty.id, entity.id);
+
+ await _institutionContractRepository.SaveChangesAsync();
+
+ await transaction.CommitAsync();
+ return opration.Succcedded();
+ }
+
+ public async Task EditAsync(EditInstitutionContractRequest command)
+ {
+ throw new NotImplementedException();
+ }
+
+
+ public Task> RegistrationWorkflowMainList()
+ {
+ return _institutionContractRepository.RegistrationWorkflowMainList();
+ }
+
+ public Task> RegistrationWorkflowItems(long institutionContractId)
+ {
+ return _institutionContractRepository.RegistrationWorkflowItems(institutionContractId);
+ }
+
+ public async Task GetVerificationDetails(Guid id)
+ {
+ return await _institutionContractRepository.GetVerificationDetails(id);
+ }
+
+
+ public async Task> SendVerifyOtp(Guid id)
+ {
+ var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(id);
+ if (institutionContract == null)
+ {
+ throw new NotFoundException("رکورد مورد نظر یافت نشد");
+ }
+
+ if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified)
+ throw new BadRequestException("این قرارداد مالی قبلا تایید شده است");
+
+ if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify &&
+ institutionContract.VerifyCodeCreation != DateTime.MinValue)
+ {
+ if (!institutionContract.CanResendVerifyCode)
+ {
+ throw new BadRequestException("کد تایید قبلی هنوز منقضی نشده است",
+ new Dictionary
+ {
+ {
+ "expireTime", (int)institutionContract.ReSendTime.TotalSeconds -
+ (int)(DateTime.Now - institutionContract.VerifyCodeCreation).TotalSeconds
+ }
+ });
+ }
+ }
+
+ var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
+ if (contractingParty == null)
+ throw new NotFoundException("طرف قرارداد یافت نشد");
+
+ var code = new Random().Next(1000, 9999).ToString();
+
+ var contractingPartyFullName = contractingParty.IsLegal == "حقیقی"
+ ? contractingParty.FName + " " + contractingParty.LName
+ : contractingParty.CeoFName + " " + contractingParty.CeoLName;
+
+ institutionContract.SetVerifyCode(code, contractingPartyFullName, contractingParty.Phone);
+
+ var transaction = await _institutionContractRepository.BeginTransactionAsync();
+ try
+ {
+ await _institutionContractRepository.SaveChangesAsync();
+ _smsService.VerifySend(contractingParty.Phone, code);
+ }
+ catch (Exception e)
+ {
+ transaction.Rollback();
+ Console.WriteLine(e);
+ throw;
+ }
+
+ await transaction.CommitAsync();
+ var result = new OtpResultViewModel
+ {
+ ExpireTimeSec = (int)institutionContract.ExpireTime.TotalSeconds,
+ ReSendTimeSec = (int)institutionContract.ReSendTime.TotalSeconds
+ };
+ return new OperationResult().Succcedded(result);
+ }
+
+ public async Task> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl)
+ {
+ var op = new OperationResult();
+ var institutionContract = await _institutionContractRepository.GetByPublicIdAsync(publicId);
+ if (institutionContract == null)
+ {
+ throw new NotFoundException("رکورد مورد نظر یافت نشد");
+ }
+
+ if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.Verified)
+ throw new BadRequestException("این قرارداد مالی قبلا تایید شده است");
+
+ if (institutionContract.VerificationStatus == InstitutionContractVerificationStatus.PendingForVerify &&
+ institutionContract.VerifyCodeExpired)
+ throw new BadRequestException("کد تایید منقضی شده است");
+
+ var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
+ if (contractingParty == null)
+ throw new NotFoundException("طرف قرارداد یافت نشد");
+
+ if (institutionContract.VerifyCode != code)
+ return op.Failed("کد وارد شده صحیح نمی باشد");
+
+ var dbTransaction = await _institutionContractRepository.BeginTransactionAsync();
+
+ long entityId = 0;
+ FinancialInvoiceItemType financialInvoiceItemType;
+ if (institutionContract.IsInstallment)
+ {
+ entityId = institutionContract.Installments.MinBy(x => x.InstallmentDateGr).Id;
+ financialInvoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment;
+ }
+ else
+ {
+ entityId = institutionContract.id;
+ financialInvoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
+ }
+
+ var financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(entityId, financialInvoiceItemType);
+ var amount = financialInvoice.Amount;
+
+ var transaction = new PaymentTransaction(institutionContract.ContractingPartyId, amount,
+ institutionContract.ContractingPartyName, "https://client.gozareshgir.ir",
+ PaymentTransactionGateWay.SepehrPay);
+ await _paymentTransactionRepository.CreateAsync(transaction);
+ await _financialInvoiceRepository.SaveChangesAsync();
+
+ var createPayment = new CreatePaymentGatewayRequest()
+ {
+ Amount = amount,
+ TransactionId = transaction.id.ToString(),
+ CallBackUrl = callbackUrl,
+ FinancialInvoiceId = financialInvoice.id,
+ };
+ var gatewayResponse = await _paymentGateway.Create(createPayment);
+ if (!gatewayResponse.IsSuccess)
+ return op.Failed("خطا در ایجاد درگاه پرداخت: " + gatewayResponse.Message + gatewayResponse.ErrorCode);
+
+
+ // institutionContract.SetPendingWorkflow();
+ //
+ // var phone = institutionContract.ContactInfoList.FirstOrDefault(x =>
+ // x.SendSms && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه");
+ // if (phone !=null)
+ // {
+ // var userPass = contractingParty.IsLegal == "حقیقی"
+ // ? contractingParty.Nationalcode
+ // : contractingParty.NationalId;
+ // var createAcc = new RegisterAccount
+ // {
+ // Fullname = contractingParty.LName,
+ // Username = userPass,
+ // Password = userPass,
+ // Mobile = phone.PhoneNumber,
+ // NationalCode = userPass
+ // };
+ // var res = _accountApplication.RegisterClient(createAcc);
+ // if (res.IsSuccedded)
+ // CreateContractingPartyAccount(contractingParty.id, res.SendId);
+ // }
+
+ await dbTransaction.CommitAsync();
+ await _institutionContractRepository.SaveChangesAsync();
+ return op.Succcedded(gatewayResponse.Token);
+ }
+
+ public async Task GetWorkshopInitialDetails(long workshopDetailsId)
+ {
+ var details = await _institutionContractRepository.GetInstitutionWorkshopInitialDetails(workshopDetailsId);
+ var services = details.Services;
+ var newArchiveCode = _workshopRepository.GetLastArchiveCode() + 1;
+
+ var res = new InstitutionContractWorkshopDetailViewModel()
+ {
+ ServicesViewModel = new WorkshopServicesViewModel()
+ {
+ Contract = services.Contract,
+ ContractInPerson = services.ContractInPerson,
+ CustomizeCheckout = services.CustomizeCheckout,
+ Insurance = services.Insurance,
+ InsuranceInPerson = services.InsuranceInPerson,
+ RollCall = services.RollCall,
+ RollCallInPerson = services.RollCallInPerson
+ },
+ WorkshopName = details.WorkshopName,
+ ArchiveCode = newArchiveCode
+ };
+ return res;
+ }
+
+ public async Task GetExtensionInquiry(long previousContractId)
+ {
+ return await _institutionContractRepository.GetExtensionInquiry(previousContractId);
+ }
+
+ public async Task GetExtensionWorkshops(
+ InstitutionContractExtensionWorkshopsRequest request)
+ {
+ return await _institutionContractRepository.GetExtensionWorkshops(request);
+ }
+
+ public async Task GetExtensionInstitutionPlan(
+ InstitutionContractExtensionPlanRequest request)
+ {
+ return await _institutionContractRepository.GetExtensionInstitutionPlan(request);
+ }
+
+ public async Task GetExtensionPaymentMethod(
+ InstitutionContractExtensionPaymentRequest request)
+ {
+ return await _institutionContractRepository.GetExtensionPaymentMethod(request);
+ }
+
+ public async Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request)
+ {
+ return await _institutionContractRepository.ExtensionComplete(request);
+ }
+
+ public async Task> GetInstitutionContractSelectList(string search, string selected)
+ {
+ return await _institutionContractRepository.GetInstitutionContractSelectList(search, selected);
+ }
+
+ public async Task GetAmendmentWorkshops(long institutionContractId)
+ {
+ return await _institutionContractRepository.GetAmendmentWorkshops(institutionContractId);
+ }
+
+ public async Task InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request)
+ {
+ return await _institutionContractRepository.InsertAmendmentTempWorkshops(request);
+ }
+
+ public Task RemoveAmendmentWorkshops(Guid workshopTempId)
+ {
+ return _institutionContractRepository.RemoveAmendmentWorkshops(workshopTempId);
+ }
+
+ public Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request)
+ {
+ return _institutionContractRepository.GetAmendmentPaymentDetails(request);
+ }
+
+ public async Task ResendVerifyLink(long institutionContractId)
+ {
+ var institutionContract = _institutionContractRepository.Get(institutionContractId);
+
+ if (institutionContract == null)
+ {
+ throw new NotFoundException("رکورد مورد نظر یافت نشد");
+ }
+
+ if (institutionContract.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify)
+ {
+ throw new BadRequestException("این قرارداد مالی در وضعیت مناسبی برای ارسال مجدد لینک تایید نمی باشد");
+ }
+ var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
+ if (contractingParty == null)
+ throw new NotFoundException("طرف قرارداد یافت نشد");
+ var contractingPartyFullName = contractingParty.FName + " " + contractingParty.LName;
+ await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName,
+ institutionContract.PublicId, contractingParty.id, institutionContract.id);
+ return new OperationResult().Succcedded();
+ }
+
+ public async Task PrintOneAsync(long id)
+ {
+ return (await _institutionContractRepository.PrintAllAsync([id])).FirstOrDefault();
+ }
+
+ public async Task SetPendingWorkflow(long entityId)
+ {
+ var op = new OperationResult();
+ var institutionContract = _institutionContractRepository.Get(entityId);
+ if (institutionContract == null)
+ {
+ return op.Failed("قرارداد مالی یافت نشد");
+ }
+
+ if (institutionContract.VerificationStatus != InstitutionContractVerificationStatus.PendingForVerify)
+ {
+ return op.Failed("وضعیت قرارداد مالی برای این عملیات مناسب نمی باشد");
+ }
+ institutionContract.SetPendingWorkflow();
+ await _institutionContractRepository.SaveChangesAsync();
+ return op.Succcedded();
+ }
public Task GetContractWorkshopsDetails(long id)
{
@@ -1403,206 +1502,206 @@ public class InstitutionContractApplication : IInstitutionContractApplication
}
- private async Task> CreateLegalContractingPartyEntity(
- CreateInstitutionContractLegalPartyRequest request, long representativeId, string address, string city,
- string state)
- {
- var opration = new OperationResult();
+ private async Task> CreateLegalContractingPartyEntity(
+ CreateInstitutionContractLegalPartyRequest request, long representativeId, string address, string city,
+ string state)
+ {
+ var opration = new OperationResult();
- if (representativeId < 1)
- return opration.Failed("لطفا معرف را انتخاب کنید");
+ if (representativeId < 1)
+ return opration.Failed("لطفا معرف را انتخاب کنید");
- if (_contractingPartyRepository.Exists(x =>
- x.LName == request.CompanyName && x.NationalId == request.NationalId))
- return opration.Failed("نام شرکت وارد شده تکراری است");
+ if (_contractingPartyRepository.Exists(x =>
+ x.LName == request.CompanyName && x.NationalId == request.NationalId))
+ return opration.Failed("نام شرکت وارد شده تکراری است");
- if (_contractingPartyRepository.Exists(x =>
- x.RegisterId == request.RegisterId && x.LName != request.CompanyName))
- return opration.Failed("شماره ثبت وارد شده تکراری است");
+ //if (_contractingPartyRepository.Exists(x =>
+ // x.RegisterId == request.RegisterId && x.LName != request.CompanyName))
+ // return opration.Failed("شماره ثبت وارد شده تکراری است");
- if (_contractingPartyRepository.Exists(x =>
- x.NationalId == request.NationalId && x.LName != request.CompanyName))
- {
- return opration.Failed("شناسه ملی وارد شده تکراری است");
- }
+ if (_contractingPartyRepository.Exists(x =>
+ x.NationalId == request.NationalId && x.LName != request.CompanyName))
+ {
+ return opration.Failed("شناسه ملی وارد شده تکراری است");
+ }
- var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode();
+ var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode();
- var representative = _representativeRepository.GetDetails(representativeId);
- var legalContractingParty = new PersonalContractingParty("*", request.CompanyName,
- "*", "*", request.RegisterId, request.NationalId,
- "حقوقی",
- request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName,
- archiveCode, state, city, null, null,
- request.FName, request.LName, request.Position);
+ var representative = _representativeRepository.GetDetails(representativeId);
+ var legalContractingParty = new PersonalContractingParty("*", request.CompanyName,
+ "*", "*", request.RegisterId, request.NationalId,
+ "حقوقی",
+ request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName,
+ archiveCode, state, city, null, null,
+ request.FName, request.LName, request.Position);
- if (request.IsAuth)
- {
- legalContractingParty.LegalAuthentication(request.FName, request.LName, request.FatherName,
- request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber);
- }
+ if (request.IsAuth)
+ {
+ legalContractingParty.LegalAuthentication(request.FName, request.LName, request.FatherName,
+ request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber);
+ }
- await _contractingPartyRepository.CreateAsync(legalContractingParty);
- await _contractingPartyRepository.SaveChangesAsync();
+ await _contractingPartyRepository.CreateAsync(legalContractingParty);
+ await _contractingPartyRepository.SaveChangesAsync();
- return opration.Succcedded(legalContractingParty);
- }
+ return opration.Succcedded(legalContractingParty);
+ }
- private async Task> CreateRealContractingPartyEntity(
- CreateInstitutionContractRealPartyRequest request, long representativeId, string address,
- string city, string province)
- {
- var operation = new OperationResult();
+ private async Task> CreateRealContractingPartyEntity(
+ CreateInstitutionContractRealPartyRequest request, long representativeId, string address,
+ string city, string province)
+ {
+ var operation = new OperationResult();
- if (representativeId < 1)
- return operation.Failed("لطفا معرف را انتخاب کنید");
+ if (representativeId < 1)
+ return operation.Failed("لطفا معرف را انتخاب کنید");
- if (_contractingPartyRepository.Exists(x => x.Nationalcode == request.NationalCode))
- {
- return operation.Failed("کد ملی وارد شده تکراری است");
- }
+ if (_contractingPartyRepository.Exists(x => x.Nationalcode == request.NationalCode))
+ {
+ return operation.Failed("کد ملی وارد شده تکراری است");
+ }
- var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode();
+ var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode();
- if (request.NationalCode.NationalCodeValid() != "valid")
- {
- return operation.Failed("کد ملی وارد شده نا معتبر است");
- }
+ if (request.NationalCode.NationalCodeValid() != "valid")
+ {
+ return operation.Failed("کد ملی وارد شده نا معتبر است");
+ }
- var representative = _representativeRepository.GetDetails(representativeId);
+ var representative = _representativeRepository.GetDetails(representativeId);
- if (representative == null)
- return operation.Failed("معرف مورد نظر یافت نشد");
+ if (representative == null)
+ return operation.Failed("معرف مورد نظر یافت نشد");
- var personalContractingParty = new PersonalContractingParty(request.FName, request.LName,
- request.NationalCode, request.IdNumber, "*", "*",
- "حقیقی",
- request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName, archiveCode,
- province, city, null, null, null, null);
+ var personalContractingParty = new PersonalContractingParty(request.FName, request.LName,
+ request.NationalCode, request.IdNumber, "*", "*",
+ "حقیقی",
+ request.PhoneNumber, request.PhoneNumber, address, representativeId, representative.FullName, archiveCode,
+ province, city, null, null, null, null);
- if (request.IsAuth)
- {
- personalContractingParty.Authentication(request.FName, request.LName, request.FatherName,
- request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber);
- }
+ if (request.IsAuth)
+ {
+ personalContractingParty.Authentication(request.FName, request.LName, request.FatherName,
+ request.IdNumber, null, null, request.BirthDateFa, request.Gender, request.PhoneNumber);
+ }
- await _contractingPartyRepository.CreateAsync(personalContractingParty);
- await _contractingPartyRepository.SaveChangesAsync();
+ await _contractingPartyRepository.CreateAsync(personalContractingParty);
+ await _contractingPartyRepository.SaveChangesAsync();
- return operation.Succcedded(personalContractingParty);
- }
+ return operation.Succcedded(personalContractingParty);
+ }
- public static List CalculateInstallment(double amount, int installmentCount,
- string loanStartDate, bool getRounded)
- {
- int day = Convert.ToInt32(loanStartDate.Substring(8, 2));
- int month = Convert.ToInt32(loanStartDate.Substring(5, 2));
- int year = Convert.ToInt32(loanStartDate.Substring(0, 4));
+ public static List CalculateInstallment(double amount, int installmentCount,
+ string loanStartDate, bool getRounded)
+ {
+ int day = Convert.ToInt32(loanStartDate.Substring(8, 2));
+ int month = Convert.ToInt32(loanStartDate.Substring(5, 2));
+ int year = Convert.ToInt32(loanStartDate.Substring(0, 4));
- var installments = new List();
+ var installments = new List();
- bool endOfMonth = day == 31;
+ bool endOfMonth = day == 31;
- var dividedAmount = amount / installmentCount;
+ var dividedAmount = amount / installmentCount;
- double moneyPerMonth = 0;
+ double moneyPerMonth = 0;
- if (getRounded)
- moneyPerMonth = Math.Floor(dividedAmount / 1000) * 1000;
- else
- moneyPerMonth = Math.Floor(dividedAmount);
+ if (getRounded)
+ moneyPerMonth = Math.Floor(dividedAmount / 1000) * 1000;
+ else
+ moneyPerMonth = Math.Floor(dividedAmount);
- double lastLoan = amount - (moneyPerMonth * (installmentCount - 1));
+ double lastLoan = amount - (moneyPerMonth * (installmentCount - 1));
- if (endOfMonth)
- {
- for (int i = 1; i < installmentCount; i++)
- {
- var installment =
- new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, "");
+ if (endOfMonth)
+ {
+ for (int i = 1; i < installmentCount; i++)
+ {
+ var installment =
+ new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, "");
- installments.Add(installment);
+ installments.Add(installment);
- if (month == 12)
- {
- year++;
- month = 1;
- }
- else
- {
- month++;
- }
+ if (month == 12)
+ {
+ year++;
+ month = 1;
+ }
+ else
+ {
+ month++;
+ }
- loanStartDate = $"{year:0000}/{month:00}/01".FindeEndOfMonth();
- }
+ loanStartDate = $"{year:0000}/{month:00}/01".FindeEndOfMonth();
+ }
- var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, "");
+ var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, "");
- installments.Add(lastInstallment);
- return installments;
- }
- else
- {
- for (int i = 1; i < installmentCount; i++)
- {
- var installment =
- new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, "");
+ installments.Add(lastInstallment);
+ return installments;
+ }
+ else
+ {
+ for (int i = 1; i < installmentCount; i++)
+ {
+ var installment =
+ new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), moneyPerMonth, "");
- installments.Add(installment);
- var endDay = 0;
+ installments.Add(installment);
+ var endDay = 0;
- if (month == 12)
- {
- year++;
- month = 1;
- }
- else
- {
- month++;
- }
+ if (month == 12)
+ {
+ year++;
+ month = 1;
+ }
+ else
+ {
+ month++;
+ }
- if (day == 30)
- {
- if (month == 12)
- {
- var lastYearDay =
- Convert.ToInt32($"{year:0000}/{month:00}/1".FindeEndOfMonth().Substring(8, 2));
- endDay = lastYearDay == 30 ? lastYearDay : 29;
- }
- }
+ if (day == 30)
+ {
+ if (month == 12)
+ {
+ var lastYearDay =
+ Convert.ToInt32($"{year:0000}/{month:00}/1".FindeEndOfMonth().Substring(8, 2));
+ endDay = lastYearDay == 30 ? lastYearDay : 29;
+ }
+ }
- loanStartDate =
- endDay == 0 ? $"{year:0000}/{month:00}/{day:00}" : $"{year:0000}/{month:00}/{endDay:00}";
- }
+ loanStartDate =
+ endDay == 0 ? $"{year:0000}/{month:00}/{day:00}" : $"{year:0000}/{month:00}/{endDay:00}";
+ }
- var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, "");
- installments.Add(lastInstallment);
- return installments;
- }
- }
+ var lastInstallment = new InstitutionContractInstallment(loanStartDate.ToGeorgianDateTime(), lastLoan, "");
+ installments.Add(lastInstallment);
+ return installments;
+ }
+ }
}
#region CustomViewModels
public class TotalbalancViewModel
{
- public string TotalBalanceStr { get; set; } = "0";
- public double TotalBalanceDbl { get; set; } = 0;
+ public string TotalBalanceStr { get; set; } = "0";
+ public double TotalBalanceDbl { get; set; } = 0;
}
public class WorkshopsAndEmployeeViewModel
{
- public List WorkshopViewModels { get; set; }
- public string WorkshopCount { get; set; }
- public string EmployeeCount { get; set; }
- public int ArchiveCode { get; set; }
+ public List WorkshopViewModels { get; set; }
+ public string WorkshopCount { get; set; }
+ public string EmployeeCount { get; set; }
+ public int ArchiveCode { get; set; }
}
#endregion
\ No newline at end of file
diff --git a/CompanyManagment.Application/SmsSettingApplication.cs b/CompanyManagment.Application/SmsSettingApplication.cs
new file mode 100644
index 00000000..5888d331
--- /dev/null
+++ b/CompanyManagment.Application/SmsSettingApplication.cs
@@ -0,0 +1,165 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+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;
+
+namespace CompanyManagment.Application;
+
+public class SmsSettingApplication : ISmsSettingApplication
+{
+ private readonly ISmsSettingsRepository _smsSettingsRepository;
+ private readonly IInstitutionContractRepository _institutionContractRepository;
+
+ public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository)
+ {
+ _smsSettingsRepository = smsSettingsRepository;
+ _institutionContractRepository = institutionContractRepository;
+ }
+
+
+ public async Task GetSmsSettingsByType(TypeOfSmsSetting typeOfSmsSetting)
+ {
+ return await _smsSettingsRepository.GetSmsSettingsByType(typeOfSmsSetting);
+ }
+
+ ///
+ /// ایجاد تنظیمات پیامک یادآور
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task CreateSmsSetting(int dayOfMonth, string timeOfDay,
+ TypeOfSmsSetting typeOfSmsSetting)
+ {
+ var op = new OperationResult();
+ var timeSpan = new TimeSpan();
+ if (string.IsNullOrWhiteSpace(timeOfDay))
+ return op.Failed("ساعت وارد نشده است");
+
+ try
+ {
+ timeSpan = TimeSpan.ParseExact(timeOfDay, @"hh\:mm", null);
+ }
+ catch (Exception e)
+ {
+ return op.Failed("فرمت ساعت اشتباه است");
+ }
+
+
+ if (dayOfMonth < 1 || dayOfMonth > 31)
+ {
+ return op.Failed("عدد روز می بایست بین 1 تا 31 باشد");
+ }
+
+ if (_smsSettingsRepository.Exists(x => x.DayOfMonth == dayOfMonth && x.TimeOfDay == timeSpan && x.TypeOfSmsSetting == typeOfSmsSetting))
+ return op.Failed("رکورد ایجاد شده تکراری است");
+
+ var create = new SmsSetting(typeOfSmsSetting, dayOfMonth, timeSpan);
+ await _smsSettingsRepository.CreateAsync(create);
+ await _smsSettingsRepository.SaveChangesAsync();
+
+
+ return op.Succcedded();
+ }
+
+ public async Task GetSmsSettingToEdit(long id)
+ {
+ return await _smsSettingsRepository.GetSmsSettingToEdit(id);
+ }
+
+ public async Task EditeSmsSetting(EditSmsSetting command)
+ {
+ var op = new OperationResult();
+ var timeSpan = new TimeSpan();
+ if (string.IsNullOrWhiteSpace(command.TimeOfDayDisplay))
+ return op.Failed("ساعت وارد نشده است");
+
+ try
+ {
+ timeSpan = TimeSpan.ParseExact(command.TimeOfDayDisplay, @"hh\:mm", null);
+ }
+ catch (Exception e)
+ {
+ return op.Failed("فرمت ساعت اشتباه است");
+ }
+
+ if (command.DayOfMonth < 1 || command.DayOfMonth > 31)
+ {
+ return op.Failed("عدد روز می بایست بین 1 تا 31 باشد");
+ }
+
+ if (_smsSettingsRepository.Exists(x => x.DayOfMonth == command.DayOfMonth && x.TimeOfDay == timeSpan && x.TypeOfSmsSetting == command.TypeOfSmsSetting && x.id != command.Id))
+ return op.Failed("رکورد ایجاد شده تکراری است");
+
+ var editSmsSetting = _smsSettingsRepository.Get(command.Id);
+ editSmsSetting.Edit(command.DayOfMonth, timeSpan);
+ await _smsSettingsRepository.SaveChangesAsync();
+
+ return op.Succcedded();
+ }
+
+ public async Task RemoveSetting(long id)
+ {
+ await _smsSettingsRepository.RemoveItem(id);
+ }
+
+
+
+
+
+ public async Task> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting)
+ {
+ return await _institutionContractRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting);
+ }
+
+ public async Task> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting)
+ {
+ return await _institutionContractRepository.GetBlockListData(DateTime.Now);
+ }
+
+
+ public async Task InstantSendReminderSms(List command)
+ {
+ var op = new OperationResult();
+ string typeOfSms = "یادآور بدهی ماهانه";
+ string sendMessStart = "شروع یادآور آنی";
+ string sendMessEnd = "پایان یادآور آنی";
+
+ if (command.Any())
+ {
+ await _institutionContractRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd);
+ return op.Succcedded();
+ }
+ else
+ {
+ return op.Failed("موردی انتخاب نشده است");
+ }
+
+
+ }
+
+ public async Task InstantSendBlockSms(List command)
+ {
+ var op = new OperationResult();
+ string typeOfSms = "اعلام مسدودی طرف حساب";
+ string sendMessStart = "شروع مسدودی آنی";
+ string sendMessEnd = "پایان مسدودی آنی ";
+ if (command.Any())
+ {
+ await _institutionContractRepository.SendBlockSmsToContractingParties(command, typeOfSms, sendMessStart,
+ sendMessEnd);
+ return op.Succcedded();
+ }
+ else
+ {
+ return op.Failed("موردی انتخاب نشده است");
+ }
+ }
+}
\ No newline at end of file
diff --git a/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs b/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs
index fb81f9d6..868c8835 100644
--- a/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs
+++ b/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs
@@ -209,6 +209,11 @@ public class TemporaryClientRegistrationApplication : ITemporaryClientRegistrati
if (apiRespons.ResponseContext.Status.Code == 14)
throw new InternalServerException("سیستم احراز هویت در دسترس نمی باشد");
+ if (apiRespons.ResponseContext.Status.Code == 2)
+ {
+ throw new InternalServerException("سیستم احراز هویت در دسترس نمی باشد");
+ }
+
if (apiRespons.ResponseContext.Status.Code != 0)
return op.Failed($"{apiRespons.ResponseContext.Status.Message}");
diff --git a/CompanyManagment.EFCore/CompanyContext.cs b/CompanyManagment.EFCore/CompanyContext.cs
index 30a5d8d8..b7abcbe0 100644
--- a/CompanyManagment.EFCore/CompanyContext.cs
+++ b/CompanyManagment.EFCore/CompanyContext.cs
@@ -45,6 +45,7 @@ using Company.Domain.FileEmployerAgg;
using Company.Domain.FileState;
using Company.Domain.FileTiming;
using Company.Domain.FileTitle;
+using Company.Domain.FinancialInvoiceAgg;
using Company.Domain.FinancialStatmentAgg;
using Company.Domain.FinancialTransactionAgg;
using Company.Domain.FineAgg;
@@ -162,6 +163,12 @@ public class CompanyContext : DbContext
//-------Main-Project----------------------------
+ #region SmsSettings
+
+ public DbSet SmsSettings { get; set; }
+
+ #endregion
+
#region Mahan
//-----------------------------RollCallWorkshopSettings-----------------------------
@@ -204,12 +211,13 @@ public class CompanyContext : DbContext
public DbSet AuthorizedBankDetails { get; set; }
-
- #endregion
+ public DbSet FinancialInvoices { get; set; }
- #region Pooya
+ #endregion
- public DbSet EmployeeDocumentItems { get; set; }
+ #region Pooya
+
+ public DbSet EmployeeDocumentItems { get; set; }
public DbSet EmployeeDocuments { get; set; }
public DbSet WorkshopSubAccounts { get; set; }
diff --git a/CompanyManagment.EFCore/Mapping/FinancialInvoiceItemMapping.cs b/CompanyManagment.EFCore/Mapping/FinancialInvoiceItemMapping.cs
new file mode 100644
index 00000000..b2d8f7e9
--- /dev/null
+++ b/CompanyManagment.EFCore/Mapping/FinancialInvoiceItemMapping.cs
@@ -0,0 +1,17 @@
+using Company.Domain.FinancialInvoiceAgg;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace CompanyManagment.EFCore.Mapping;
+
+public class FinancialInvoiceItemMapping : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.Property(x=>x.Description).HasMaxLength(800);
+ builder.Property(x => x.Type).HasConversion().HasMaxLength(50);
+
+ builder.HasOne(x => x.FinancialInvoice).WithMany(x => x.Items)
+ .HasForeignKey(x => x.FinancialInvoiceId);
+ }
+}
\ No newline at end of file
diff --git a/CompanyManagment.EFCore/Mapping/FinancialInvoiceMapping.cs b/CompanyManagment.EFCore/Mapping/FinancialInvoiceMapping.cs
new file mode 100644
index 00000000..6fc2ed09
--- /dev/null
+++ b/CompanyManagment.EFCore/Mapping/FinancialInvoiceMapping.cs
@@ -0,0 +1,25 @@
+using Company.Domain.FinancialInvoiceAgg;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace CompanyManagment.EFCore.Mapping;
+
+public class FinancialInvoiceMapping:IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(x => x.id);
+
+ builder.Property(x => x.Status).HasConversion().HasMaxLength(20);
+ builder.Property(x => x.PaidAt).IsRequired(false);
+ builder.Property(x => x.Description).HasMaxLength(800);
+ builder.Property(x => x.InvoiceNumber).HasMaxLength(22);
+
+ builder.HasMany(x => x.Items).WithOne(x => x.FinancialInvoice)
+ .HasForeignKey(x => x.FinancialInvoiceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
+ builder.HasMany(x => x.PaymentTransactions).WithOne(x => x.FinancialInvoice)
+ .HasForeignKey(x => x.FinancialInvoiceId).IsRequired(false).OnDelete(DeleteBehavior.NoAction);
+
+
+ }
+}
\ No newline at end of file
diff --git a/CompanyManagment.EFCore/Mapping/FinancialTransactionMapping.cs b/CompanyManagment.EFCore/Mapping/FinancialTransactionMapping.cs
index 6d5e2e29..dd7491d8 100644
--- a/CompanyManagment.EFCore/Mapping/FinancialTransactionMapping.cs
+++ b/CompanyManagment.EFCore/Mapping/FinancialTransactionMapping.cs
@@ -14,7 +14,7 @@ public class FinancialTransactionMapping : IEntityTypeConfiguration x.TdateFa);
builder.Property(x => x.TdateFa).HasMaxLength(10);
builder.Property(x => x.TypeOfTransaction).HasMaxLength(10);
- builder.Property(x => x.DescriptionOption).HasMaxLength(50);
+ builder.Property(x => x.DescriptionOption).HasMaxLength(100);
builder.Property(x => x.Description).HasMaxLength(600);
builder.Property(x => x.Deptor);
builder.Property(x => x.Creditor);
diff --git a/CompanyManagment.EFCore/Mapping/InstitutinContractContactInfoMapping.cs b/CompanyManagment.EFCore/Mapping/InstitutinContractContactInfoMapping.cs
index d8ba3bf6..726eeee7 100644
--- a/CompanyManagment.EFCore/Mapping/InstitutinContractContactInfoMapping.cs
+++ b/CompanyManagment.EFCore/Mapping/InstitutinContractContactInfoMapping.cs
@@ -11,7 +11,7 @@ public class InstitutinContractContactInfoMapping : IEntityTypeConfiguration x.id);
- builder.Property(x => x.FnameLname).HasMaxLength(50);
+ builder.Property(x => x.FnameLname).HasMaxLength(150);
builder.Property(x => x.PhoneNumber).HasMaxLength(20);
builder.Property(x => x.PhoneType).HasMaxLength(20);
builder.Property(x => x.Position).HasMaxLength(50);
diff --git a/CompanyManagment.EFCore/Mapping/PersonalContractingpartyMapping.cs b/CompanyManagment.EFCore/Mapping/PersonalContractingpartyMapping.cs
index 1499042b..229f2e17 100644
--- a/CompanyManagment.EFCore/Mapping/PersonalContractingpartyMapping.cs
+++ b/CompanyManagment.EFCore/Mapping/PersonalContractingpartyMapping.cs
@@ -14,8 +14,8 @@ public class PersonalContractingpartyMapping : IEntityTypeConfiguration x.id);
//builder.Property(x => x.LegalName).HasMaxLength(255).IsRequired();
- builder.Property(x => x.FName).HasMaxLength(50).IsRequired();
- builder.Property(x => x.LName).HasMaxLength(50).IsRequired();
+ builder.Property(x => x.FName).HasMaxLength(150).IsRequired();
+ builder.Property(x => x.LName).HasMaxLength(150).IsRequired();
builder.Property(x => x.SureName).HasMaxLength(50).IsRequired(false);
builder.Property(x => x.Nationalcode).HasMaxLength(10).IsRequired();
builder.Property(x => x.IdNumber).HasMaxLength(20).IsRequired(false);
diff --git a/CompanyManagment.EFCore/Mapping/SmsSettingMapping.cs b/CompanyManagment.EFCore/Mapping/SmsSettingMapping.cs
new file mode 100644
index 00000000..b3c43d65
--- /dev/null
+++ b/CompanyManagment.EFCore/Mapping/SmsSettingMapping.cs
@@ -0,0 +1,30 @@
+using System;
+using _0_Framework.Application.Enums;
+using Company.Domain.SmsResultAgg;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace CompanyManagment.EFCore.Mapping;
+
+public class SmsSettingMapping : IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.ToTable("SmsSettings");
+ builder.HasKey(x => x.id);
+
+
+ builder.Property(x => x.DayOfMonth)
+ .IsRequired();
+
+ builder.Property(x => x.TimeOfDay)
+ .HasColumnType("time(0)")
+ .IsRequired();
+
+ builder.Property(x => x.TypeOfSmsSetting).HasConversion(
+ v => v.ToString(),
+ v => (TypeOfSmsSetting)Enum.Parse(typeof(TypeOfSmsSetting), v)).HasMaxLength(70);
+
+
+ }
+}
\ No newline at end of file
diff --git a/CompanyManagment.EFCore/Migrations/20250715100203_Add financialInvoiceTable.Designer.cs b/CompanyManagment.EFCore/Migrations/20250715100203_Add financialInvoiceTable.Designer.cs
new file mode 100644
index 00000000..8a066866
--- /dev/null
+++ b/CompanyManagment.EFCore/Migrations/20250715100203_Add financialInvoiceTable.Designer.cs
@@ -0,0 +1,10013 @@
+//
+using System;
+using System.Collections.Generic;
+using CompanyManagment.EFCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace CompanyManagment.EFCore.Migrations
+{
+ [DbContext(typeof(CompanyContext))]
+ [Migration("20250715100203_Add financialInvoiceTable")]
+ partial class AddfinancialInvoiceTable
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.10")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("Company.Domain.AdminMonthlyOverviewAgg.AdminMonthlyOverview", b =>
+ {
+ b.Property("id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Month")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(155)
+ .HasColumnType("nvarchar(155)");
+
+ b.Property("WorkshopId")
+ .HasColumnType("bigint");
+
+ b.Property("Year")
+ .HasColumnType("int");
+
+ b.HasKey("id");
+
+ b.ToTable("AdminMonthlyOverviews");
+ });
+
+ modelBuilder.Entity("Company.Domain.AndroidApkVersionAgg.AndroidApkVersion", b =>
+ {
+ b.Property("id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("IsActive")
+ .IsRequired()
+ .HasMaxLength(5)
+ .HasColumnType("nvarchar(5)");
+
+ b.Property("Path")
+ .HasMaxLength(255)
+ .HasColumnType("nvarchar(255)");
+
+ b.Property("Title")
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("VersionCode")
+ .HasMaxLength(20)
+ .HasColumnType("nvarchar(20)");
+
+ b.Property("VersionName")
+ .HasMaxLength(35)
+ .HasColumnType("nvarchar(35)");
+
+ b.HasKey("id");
+
+ b.ToTable("AndroidApkVersions", (string)null);
+ });
+
+ modelBuilder.Entity("Company.Domain.BankAgg.Bank", b =>
+ {
+ b.Property("id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("id"));
+
+ b.Property("BankLogoMediaId")
+ .HasColumnType("bigint");
+
+ b.Property("BankName")
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.HasKey("id");
+
+ b.ToTable("Banks", (string)null);
+ });
+
+ modelBuilder.Entity("Company.Domain.BillAgg.EntityBill", b =>
+ {
+ b.Property("id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("id"));
+
+ b.Property("Appointed")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Contact")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("IsActiveString")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ProcessingStage")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("SubjectBill")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("id");
+
+ b.ToTable("TextManager_Bill", (string)null);
+ });
+
+ modelBuilder.Entity("Company.Domain.Board.Board", b =>
+ {
+ b.Property("id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("id"));
+
+ b.Property("BoardChairman")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("BoardType_Id")
+ .HasColumnType("int");
+
+ b.Property("Branch")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("DisputeResolutionPetitionDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ExpertReport")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("File_Id")
+ .HasColumnType("bigint");
+
+ b.HasKey("id");
+
+ b.HasIndex("BoardType_Id");
+
+ b.HasIndex("File_Id");
+
+ b.ToTable("Boards", (string)null);
+ });
+
+ modelBuilder.Entity("Company.Domain.BoardType.BoardType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Title")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("BoardTypes", (string)null);
+ });
+
+ modelBuilder.Entity("Company.Domain.ChapterAgg.EntityChapter", b =>
+ {
+ b.Property("id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("id"));
+
+ b.Property("Chapter")
+ .IsRequired()
+ .HasMaxLength(60)
+ .HasColumnType("nvarchar(60)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("IsActiveString")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Subtitle_Id")
+ .HasColumnType("bigint");
+
+ b.HasKey("id");
+
+ b.HasIndex("Subtitle_Id");
+
+ b.ToTable("TextManager_Chapter", (string)null);
+ });
+
+ modelBuilder.Entity("Company.Domain.CheckoutAgg.Checkout", b =>
+ {
+ b.Property("id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("id"));
+
+ b.Property("AbsenceDeduction")
+ .HasColumnType("float");
+
+ b.Property("AbsencePeriod")
+ .HasColumnType("float");
+
+ b.Property("AbsenceValue")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)");
+
+ b.Property("ArchiveCode")
+ .HasMaxLength(15)
+ .HasColumnType("nvarchar(15)");
+
+ b.Property("AverageHoursPerDay")
+ .HasColumnType("float");
+
+ b.Property("BaseYearsPay")
+ .HasColumnType("float");
+
+ b.Property("BonusesPay")
+ .HasColumnType("float");
+
+ b.Property("ConsumableItems")
+ .HasColumnType("float");
+
+ b.Property("ContractEnd")
+ .HasColumnType("datetime2");
+
+ b.Property("ContractId")
+ .HasColumnType("bigint");
+
+ b.Property("ContractNo")
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property