Compare commits
189 Commits
Feature/in
...
Feature/pr
| Author | SHA1 | Date | |
|---|---|---|---|
| 23d42bd8f5 | |||
| 25aa76b16c | |||
| d6a9c5e87d | |||
|
|
34d336f43e | ||
|
|
6b81f383f6 | ||
|
|
54ff59de48 | ||
|
|
9f09b6af97 | ||
|
|
63e169b82d | ||
|
|
7339eaaadf | ||
|
|
e5c96c8bcb | ||
| 8622f12f12 | |||
| a20a847065 | |||
| 258a809451 | |||
|
|
6285c7320e | ||
|
|
17f117726e | ||
|
|
13fb6fec5d | ||
| 9bca1b81d6 | |||
| 9ff6b5cf56 | |||
|
|
04642b7257 | ||
| c1c9fe51cb | |||
|
|
0d2ac58bbb | ||
| 64693b2ca3 | |||
| 43ccb3a1dd | |||
| 0134111aba | |||
|
|
3cc7adae35 | ||
|
|
c97ea5356f | ||
| 03657b6848 | |||
| 69f4819bf6 | |||
|
|
1257e15b62 | ||
|
|
331fb24a99 | ||
| 3be1547137 | |||
| 15f1c938f7 | |||
| 7e563a0f01 | |||
| 900b4b3f4d | |||
| bdc6f95af8 | |||
| 7a73e69afa | |||
| a3fd3e6920 | |||
| 025c59e695 | |||
| 36ccd96352 | |||
| a7c97b22b4 | |||
| 4c143d6bbc | |||
| 0e5a0a16ac | |||
| 88f54b6310 | |||
| d4694e7e1c | |||
| 4bde4ade2d | |||
| bd12ff0506 | |||
|
|
21302803b6 | ||
|
|
8ec13ffae1 | ||
|
|
5508d4e88f | ||
| 43abb74c61 | |||
| 73e6681baa | |||
| 90b2fd2eab | |||
| b7172630e2 | |||
| 0604514190 | |||
| d9c431e20e | |||
| ff5180eb75 | |||
| a1c9335487 | |||
|
|
2746bf69ea | ||
|
|
77dbb50512 | ||
|
|
1c7e8824c7 | ||
| 20ece4886c | |||
| 0eff1b9a66 | |||
|
|
0d33d79620 | ||
|
|
e4355faffc | ||
|
|
577fe5db76 | ||
| 587fa40d81 | |||
| b741ab9ed2 | |||
| b6fde4903a | |||
| 0772604432 | |||
|
|
ec8333c715 | ||
|
|
8aa93e089a | ||
| 59891d1199 | |||
| 7cb39b1b92 | |||
|
|
5580d56874 | ||
|
|
423b49e6e7 | ||
|
|
0ab3052251 | ||
| 38027352d6 | |||
| 43562fb49c | |||
|
|
5202779d9f | ||
| 80a58f8cdc | |||
| 7c611825a4 | |||
|
|
67a85735f0 | ||
|
|
bf46dfd1dc | ||
|
|
a1ed3ad648 | ||
|
|
35e6355069 | ||
| 8679abb1e7 | |||
| c8dddabdff | |||
| 6f076bdc77 | |||
|
|
4de2e12ac5 | ||
| 380ed8f6b1 | |||
| 7423391003 | |||
|
|
23b65cfbfe | ||
| 572f66f905 | |||
|
|
48b75d2baa | ||
| 140414b866 | |||
| 4ade9e12a6 | |||
|
|
63edb33bf5 | ||
| dd7e816767 | |||
| 1deeff996f | |||
| 2bea265989 | |||
| ef9b78b924 | |||
| 8ad296fe61 | |||
|
|
823110ea74 | ||
| 061058cbeb | |||
| 95d66c2d89 | |||
| 609daf4353 | |||
| a81e01ce2b | |||
| 2cd838a5e3 | |||
| c6ed46d8b7 | |||
| 3da7453ece | |||
|
|
9a591fabff | ||
| 9d09ef60f8 | |||
| 0757ac7e74 | |||
| a9789023ac | |||
| 34bd7ba444 | |||
| 16b11a8bb8 | |||
|
|
dd5455d80a | ||
| 9360dcad71 | |||
| 1971252713 | |||
| 02cc099104 | |||
| 43b124664e | |||
| d2dd67343b | |||
| 3d2b5ff6bd | |||
| 209aa5912d | |||
| 340685a06c | |||
| b20a56df26 | |||
| 8d93fa4fc6 | |||
| 8f10f7057c | |||
| 00b5066f6f | |||
| abd221cb55 | |||
| 33833a408c | |||
| c2fca9f9eb | |||
| a16c20440b | |||
| 1f365f3642 | |||
| 0bfcde6a3f | |||
| 4ada29a98a | |||
| 6f64ee1ce4 | |||
| 582da511c6 | |||
| 3340edcc17 | |||
| 385a885c93 | |||
| f99f199a77 | |||
| 287b31e356 | |||
| 5f8232809a | |||
| 3c72311096 | |||
| 250d17eba2 | |||
| 5db8e7d319 | |||
|
|
3300f60845 | ||
|
|
7537cfe5b8 | ||
|
|
3c1bf7dff0 | ||
| 6909fcf715 | |||
| fe66ff5aa3 | |||
| ce305edac4 | |||
| a49b825ce9 | |||
| fb62523a23 | |||
|
|
e171a4749c | ||
| 9b6c0d4cc4 | |||
| f8126b4000 | |||
|
|
cf62d75f0e | ||
|
|
f93e59b77c | ||
|
|
8f37d9f388 | ||
| 8e72b56758 | |||
| a6e1251445 | |||
| 490a1a69d5 | |||
| 7e3ea39d5b | |||
| 66a6c411d6 | |||
|
|
b03a806dfb | ||
| 14ff0a2e59 | |||
| 58f695fe95 | |||
| b4ccacd37e | |||
| 1fef8e355a | |||
|
|
4d326b1983 | ||
| aa37ca4b28 | |||
| 45615684ed | |||
| eb9a3e52fe | |||
| 94955ea1b4 | |||
| 16c1ae04a9 | |||
| 656bb49fab | |||
| cf3f0564f9 | |||
| fb5b98bf25 | |||
| 1e733f3f20 | |||
| d855684cd7 | |||
| 9e5e8d8e5d | |||
| 9eefdd8fd1 | |||
| 2159901614 | |||
| 7ce7854091 | |||
| 4c638cbdae | |||
| 39a5918a11 | |||
| b9e271de1a | |||
| e661bc2dcb |
9
.gitignore
vendored
9
.gitignore
vendored
@@ -362,3 +362,12 @@ MigrationBackup/
|
|||||||
# # Fody - auto-generated XML schema
|
# # Fody - auto-generated XML schema
|
||||||
# FodyWeavers.xsd
|
# FodyWeavers.xsd
|
||||||
.idea
|
.idea
|
||||||
|
/ServiceHost/appsettings.Development.json
|
||||||
|
/ServiceHost/appsettings.json
|
||||||
|
|
||||||
|
# Storage folder - ignore all uploaded files, thumbnails, and temporary files
|
||||||
|
ServiceHost/Storage
|
||||||
|
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
public enum TypeOfSmsSetting
|
public enum TypeOfSmsSetting
|
||||||
{
|
{
|
||||||
|
//همه انواع پیامک
|
||||||
|
All = 0,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک
|
/// پیامک
|
||||||
@@ -23,7 +25,7 @@ public enum TypeOfSmsSetting
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک
|
/// پیامک
|
||||||
/// هشدار اول
|
/// هشدار بدهی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Warning,
|
Warning,
|
||||||
|
|
||||||
@@ -38,4 +40,14 @@ public enum TypeOfSmsSetting
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
InstitutionContractConfirm,
|
InstitutionContractConfirm,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال کد تاییدیه قرارداد مالی
|
||||||
|
/// </summary>
|
||||||
|
SendInstitutionContractConfirmationCode,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// یادآور وظایف
|
||||||
|
/// </summary>
|
||||||
|
TaskReminder,
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ using System.Net.Http;
|
|||||||
using System.Net.Http.Json;
|
using System.Net.Http.Json;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace _0_Framework.Application.PaymentGateway;
|
namespace _0_Framework.Application.PaymentGateway;
|
||||||
@@ -12,18 +13,24 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
{
|
{
|
||||||
private readonly HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
private const long TerminalId = 99213700;
|
private const long TerminalId = 99213700;
|
||||||
|
private readonly ILogger<SepehrPaymentGateway> _logger;
|
||||||
|
|
||||||
public SepehrPaymentGateway(IHttpClientFactory httpClient)
|
public SepehrPaymentGateway(IHttpClientFactory httpClient, ILogger<SepehrPaymentGateway> logger)
|
||||||
{
|
{
|
||||||
|
_logger = logger;
|
||||||
_httpClient = httpClient.CreateClient();
|
_httpClient = httpClient.CreateClient();
|
||||||
_httpClient.BaseAddress = new Uri("https://sepehr.shaparak.ir/Rest/V1/PeymentApi/");
|
_httpClient.BaseAddress = new Uri("https://sepehr.shaparak.ir/Rest/V1/PeymentApi/");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PaymentGatewayResponse> Create(CreatePaymentGatewayRequest command, CancellationToken cancellationToken = default)
|
public async Task<PaymentGatewayResponse> Create(CreatePaymentGatewayRequest command, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("Create payment started. TransactionId: {TransactionId}, Amount: {Amount}", command.TransactionId, command.Amount);
|
||||||
command.ExtraData ??= new Dictionary<string, object>();
|
command.ExtraData ??= new Dictionary<string, object>();
|
||||||
|
_logger.LogInformation("Initializing extra data with FinancialInvoiceId: {FinancialInvoiceId}", command.FinancialInvoiceId);
|
||||||
command.ExtraData.Add("financialInvoiceId", command.FinancialInvoiceId);
|
command.ExtraData.Add("financialInvoiceId", command.FinancialInvoiceId);
|
||||||
var extraData = JsonConvert.SerializeObject(command.ExtraData);
|
var extraData = JsonConvert.SerializeObject(command.ExtraData);
|
||||||
|
_logger.LogInformation("Serialized extra data payload: {Payload}", extraData);
|
||||||
|
|
||||||
var res = await _httpClient.PostAsJsonAsync("GetToken", new
|
var res = await _httpClient.PostAsJsonAsync("GetToken", new
|
||||||
{
|
{
|
||||||
TerminalID = TerminalId,
|
TerminalID = TerminalId,
|
||||||
@@ -32,21 +39,25 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
callbackURL = command.CallBackUrl,
|
callbackURL = command.CallBackUrl,
|
||||||
payload = extraData
|
payload = extraData
|
||||||
}, cancellationToken: cancellationToken);
|
}, cancellationToken: cancellationToken);
|
||||||
|
_logger.LogInformation("Create payment request sent. StatusCode: {StatusCode}", res.StatusCode);
|
||||||
// خواندن محتوای پاسخ
|
// خواندن محتوای پاسخ
|
||||||
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
||||||
|
_logger.LogInformation("Create payment response content: {Content}", content);
|
||||||
|
|
||||||
// تبدیل پاسخ JSON به آبجکت داتنت
|
// تبدیل پاسخ JSON به آبجکت داتنت
|
||||||
var json = System.Text.Json.JsonDocument.Parse(content);
|
var json = System.Text.Json.JsonDocument.Parse(content);
|
||||||
|
_logger.LogInformation("Create payment JSON parsed successfully.");
|
||||||
|
|
||||||
// گرفتن مقدار AccessToken
|
// گرفتن مقدار AccessToken
|
||||||
var accessToken = json.RootElement.GetProperty("Accesstoken").ToString();
|
var accessToken = json.RootElement.GetProperty("Accesstoken").ToString();
|
||||||
var status = json.RootElement.GetProperty("Status").ToString();
|
var status = json.RootElement.GetProperty("Status").ToString();
|
||||||
|
_logger.LogInformation("Create payment parsed values. Status: {Status}, AccessToken: {AccessToken}", status, accessToken);
|
||||||
|
|
||||||
return new PaymentGatewayResponse
|
return new PaymentGatewayResponse
|
||||||
{
|
{
|
||||||
Status = status,
|
Status = status,
|
||||||
IsSuccess = status == "0",
|
IsSuccess = status == "0",
|
||||||
Token = accessToken
|
Token = accessToken,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,21 +66,24 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
|
|
||||||
public async Task<PaymentGatewayResponse> Verify(VerifyPaymentGateWayRequest command, CancellationToken cancellationToken = default)
|
public async Task<PaymentGatewayResponse> Verify(VerifyPaymentGateWayRequest command, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("Verify payment started. DigitalReceipt: {DigitalReceipt}", command.DigitalReceipt);
|
||||||
var res = await _httpClient.PostAsJsonAsync("Advice", new
|
var res = await _httpClient.PostAsJsonAsync("Advice", new
|
||||||
{
|
{
|
||||||
digitalreceipt = command.DigitalReceipt,
|
digitalreceipt = command.DigitalReceipt,
|
||||||
Tid = TerminalId,
|
Tid = TerminalId,
|
||||||
}, cancellationToken: cancellationToken);
|
}, cancellationToken: cancellationToken);
|
||||||
|
_logger.LogInformation("Verify payment request sent. StatusCode: {StatusCode}", res.StatusCode);
|
||||||
// خواندن محتوای پاسخ
|
// خواندن محتوای پاسخ
|
||||||
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
||||||
|
_logger.LogInformation("Verify payment response content: {Content}", content);
|
||||||
|
|
||||||
// تبدیل پاسخ JSON به آبجکت داتنت
|
// تبدیل پاسخ JSON به آبجکت داتنت
|
||||||
var json = System.Text.Json.JsonDocument.Parse(content);
|
var json = System.Text.Json.JsonDocument.Parse(content);
|
||||||
|
_logger.LogInformation("Verify payment JSON parsed successfully.");
|
||||||
|
|
||||||
var message = json.RootElement.GetProperty("Message").GetString();
|
var message = json.RootElement.GetProperty("Message").GetString();
|
||||||
var status = json.RootElement.GetProperty("Status").GetString();
|
var status = json.RootElement.GetProperty("Status").GetString();
|
||||||
|
_logger.LogInformation("Verify payment parsed values. Status: {Status}, Message: {Message}", status, message);
|
||||||
return new PaymentGatewayResponse
|
return new PaymentGatewayResponse
|
||||||
{
|
{
|
||||||
Status = status,
|
Status = status,
|
||||||
|
|||||||
@@ -18,3 +18,17 @@ public class ApiResultViewModel
|
|||||||
public string DeliveryColor { get; set; }
|
public string DeliveryColor { get; set; }
|
||||||
public string FullName { get; set; }
|
public string FullName { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class ApiReportDto
|
||||||
|
{
|
||||||
|
public int MessageId { get; set; }
|
||||||
|
|
||||||
|
public long Mobile { get; set; }
|
||||||
|
|
||||||
|
public string SendUnixTime { get; set; }
|
||||||
|
public string DeliveryState { get; set; }
|
||||||
|
public string DeliveryUnixTime { get; set; }
|
||||||
|
public string DeliveryColor { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,6 +19,13 @@ public interface ISmsService
|
|||||||
bool SendAccountsInfo(string number,string fullName, string userName);
|
bool SendAccountsInfo(string number,string fullName, string userName);
|
||||||
Task<ApiResultViewModel> GetByMessageId(int messId);
|
Task<ApiResultViewModel> GetByMessageId(int messId);
|
||||||
Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate);
|
Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate);
|
||||||
|
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
Task<List<ApiReportDto>> GetApiReport(string startDate, string endDate);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
string DeliveryStatus(byte? dv);
|
string DeliveryStatus(byte? dv);
|
||||||
string DeliveryColorStatus(byte? dv);
|
string DeliveryColorStatus(byte? dv);
|
||||||
string UnixTimeStampToDateTime(int? unixTimeStamp);
|
string UnixTimeStampToDateTime(int? unixTimeStamp);
|
||||||
@@ -64,6 +71,7 @@ public interface ISmsService
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک مسدودی طرف حساب
|
/// پیامک مسدودی طرف حساب
|
||||||
|
/// قراردادهای قدیم
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="number"></param>
|
/// <param name="number"></param>
|
||||||
/// <param name="fullname"></param>
|
/// <param name="fullname"></param>
|
||||||
@@ -74,6 +82,19 @@ public interface ISmsService
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessage(string number, string fullname, string amount, string accountType, 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);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک مسدودی طرف حساب
|
||||||
|
/// قرارداد های جدید
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="number"></param>
|
||||||
|
/// <param name="fullname"></param>
|
||||||
|
/// <param name="amount"></param>
|
||||||
|
/// <param name="code1"></param>
|
||||||
|
/// <param name="code2"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessageForElectronicContract(string number,
|
||||||
|
string fullname,
|
||||||
|
string amount, string code1, string code2);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region AlarmMessage
|
#region AlarmMessage
|
||||||
|
|||||||
@@ -31,8 +31,9 @@ public static class StaticWorkshopAccounts
|
|||||||
/// 381 - مهدی قربانی
|
/// 381 - مهدی قربانی
|
||||||
/// 392 - عمار حسن دوست
|
/// 392 - عمار حسن دوست
|
||||||
/// 20 - سمیرا الهی نیا
|
/// 20 - سمیرا الهی نیا
|
||||||
|
/// 322 - ماهان چمنی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20, 476];
|
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20, 476,322];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// این تاریخ در جدول اکانت لفت ورک به این معنیست
|
/// این تاریخ در جدول اکانت لفت ورک به این معنیست
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ public interface IAccountApplication
|
|||||||
void CameraLogin(CameraLoginRequest request);
|
void CameraLogin(CameraLoginRequest request);
|
||||||
|
|
||||||
Task<GetPmUserDto> GetPmUserAsync(long accountId);
|
Task<GetPmUserDto> GetPmUserAsync(long accountId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CameraLoginRequest
|
public class CameraLoginRequest
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<NuGetAudit>false</NuGetAudit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using Shared.Contracts.PmUser.Commands;
|
using Shared.Contracts.PmUser.Commands;
|
||||||
using Shared.Contracts.PmUser.Queries;
|
using Shared.Contracts.PmUser.Queries;
|
||||||
|
|
||||||
@@ -48,7 +47,13 @@ public class AccountApplication : IAccountApplication
|
|||||||
private readonly IPmUserCommandService _pmUserCommandService;
|
private readonly IPmUserCommandService _pmUserCommandService;
|
||||||
|
|
||||||
public AccountApplication(IAccountRepository accountRepository, IPasswordHasher passwordHasher,
|
public AccountApplication(IAccountRepository accountRepository, IPasswordHasher passwordHasher,
|
||||||
IFileUploader fileUploader, IAuthHelper authHelper, IRoleRepository roleRepository, IWorker worker, ISmsService smsService, ICameraAccountRepository cameraAccountRepository, IPositionRepository positionRepository, IAccountLeftworkRepository accountLeftworkRepository, IWorkshopRepository workshopRepository, ISubAccountRepository subAccountRepository, ISubAccountRoleRepository subAccountRoleRepository, IWorkshopSubAccountRepository workshopSubAccountRepository, ISubAccountPermissionSubtitle1Repository accountPermissionSubtitle1Repository, IUnitOfWork unitOfWork, IPmUserQueryService pmUserQueryService, IPmUserCommandService pmUserCommandService)
|
IFileUploader fileUploader, IAuthHelper authHelper, IRoleRepository roleRepository, IWorker worker,
|
||||||
|
ISmsService smsService, ICameraAccountRepository cameraAccountRepository,
|
||||||
|
IPositionRepository positionRepository, IAccountLeftworkRepository accountLeftworkRepository,
|
||||||
|
IWorkshopRepository workshopRepository, ISubAccountRepository subAccountRepository,
|
||||||
|
ISubAccountRoleRepository subAccountRoleRepository, IWorkshopSubAccountRepository workshopSubAccountRepository,
|
||||||
|
ISubAccountPermissionSubtitle1Repository accountPermissionSubtitle1Repository, IUnitOfWork unitOfWork,
|
||||||
|
IPmUserQueryService pmUserQueryService, IPmUserCommandService pmUserCommandService)
|
||||||
{
|
{
|
||||||
_authHelper = authHelper;
|
_authHelper = authHelper;
|
||||||
_roleRepository = roleRepository;
|
_roleRepository = roleRepository;
|
||||||
@@ -68,7 +73,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
_fileUploader = fileUploader;
|
_fileUploader = fileUploader;
|
||||||
_passwordHasher = passwordHasher;
|
_passwordHasher = passwordHasher;
|
||||||
_accountRepository = accountRepository;
|
_accountRepository = accountRepository;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult EditClient(EditClientAccount command)
|
public OperationResult EditClient(EditClientAccount command)
|
||||||
@@ -89,7 +93,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
(x.Mobile == command.Mobile && x.id != command.Id)))
|
(x.Mobile == command.Mobile && x.id != command.Id)))
|
||||||
return opreation.Failed("شماره موبایل تکراری است");
|
return opreation.Failed("شماره موبایل تکراری است");
|
||||||
if (_accountRepository.Exists(x =>
|
if (_accountRepository.Exists(x =>
|
||||||
(x.NationalCode == command.NationalCode && !string.IsNullOrWhiteSpace(x.NationalCode) && x.id != command.Id)))
|
(x.NationalCode == command.NationalCode && !string.IsNullOrWhiteSpace(x.NationalCode) &&
|
||||||
|
x.id != command.Id)))
|
||||||
return opreation.Failed("کد ملی تکراری است");
|
return opreation.Failed("کد ملی تکراری است");
|
||||||
if (_accountRepository.Exists(x =>
|
if (_accountRepository.Exists(x =>
|
||||||
(x.Email == command.Email && !string.IsNullOrWhiteSpace(x.Email) && x.id != command.Id)))
|
(x.Email == command.Email && !string.IsNullOrWhiteSpace(x.Email) && x.id != command.Id)))
|
||||||
@@ -97,7 +102,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
var path = $"profilePhotos";
|
var path = $"profilePhotos";
|
||||||
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||||
editAccount.EditClient(command.Fullname, command.Username, command.Mobile, picturePath, command.Email, command.NationalCode);
|
editAccount.EditClient(command.Fullname, command.Username, command.Mobile, picturePath, command.Email,
|
||||||
|
command.NationalCode);
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return opreation.Succcedded();
|
return opreation.Succcedded();
|
||||||
}
|
}
|
||||||
@@ -142,8 +148,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
if (_fileUploader != null)
|
if (_fileUploader != null)
|
||||||
{
|
{
|
||||||
picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
||||||
picturePath, roleName.Name, "true", "false");
|
picturePath, roleName.Name, "true", "false");
|
||||||
|
|
||||||
@@ -158,7 +164,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
if (command.UserRoles == null)
|
if (command.UserRoles == null)
|
||||||
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||||
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||||
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username, account.Password, command.Mobile,
|
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username,
|
||||||
|
account.Password, command.Mobile,
|
||||||
null, account.id, pmUserRoles));
|
null, account.id, pmUserRoles));
|
||||||
if (!createPm.isSuccess)
|
if (!createPm.isSuccess)
|
||||||
{
|
{
|
||||||
@@ -167,7 +174,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//var url = "api/user/create";
|
//var url = "api/user/create";
|
||||||
//var key = SecretKeys.ProgramManagerInternalApi;
|
//var key = SecretKeys.ProgramManagerInternalApi;
|
||||||
|
|
||||||
@@ -252,14 +258,14 @@ public class AccountApplication : IAccountApplication
|
|||||||
// $"api/user/{account.id}",
|
// $"api/user/{account.id}",
|
||||||
// key
|
// key
|
||||||
//);
|
//);
|
||||||
var userResult =await _pmUserQueryService.GetPmUserDataByAccountId(account.id);
|
var userResult = await _pmUserQueryService.GetPmUserDataByAccountId(account.id);
|
||||||
|
|
||||||
if (command.UserRoles == null)
|
if (command.UserRoles == null)
|
||||||
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||||
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||||
|
|
||||||
//اگر کاربر در پروگرام منیجر قبلا ایجاد شده
|
//اگر کاربر در پروگرام منیجر قبلا ایجاد شده
|
||||||
if (userResult.Id >0)
|
if (userResult.Id > 0)
|
||||||
{
|
{
|
||||||
if (!command.UserRoles.Any())
|
if (!command.UserRoles.Any())
|
||||||
{
|
{
|
||||||
@@ -267,7 +273,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
||||||
}
|
}
|
||||||
|
|
||||||
var editPm =await _pmUserCommandService.Edit(new EditPmUserDto(command.Fullname, command.Username, command.Mobile, account.id, pmUserRoles,
|
var editPm = await _pmUserCommandService.Edit(new EditPmUserDto(command.Fullname, command.Username,
|
||||||
|
command.Mobile, account.id, pmUserRoles,
|
||||||
command.IsProgramManagerUser));
|
command.IsProgramManagerUser));
|
||||||
if (!editPm.isSuccess)
|
if (!editPm.isSuccess)
|
||||||
{
|
{
|
||||||
@@ -302,7 +309,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
// _unitOfWork.RollbackAccountContext();
|
// _unitOfWork.RollbackAccountContext();
|
||||||
// return operation.Failed(response.Error);
|
// return operation.Failed(response.Error);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
else //اگر کاربر قبلا ایجاد نشده
|
else //اگر کاربر قبلا ایجاد نشده
|
||||||
{
|
{
|
||||||
@@ -316,11 +322,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname,
|
||||||
|
command.Username, account.Password, command.Mobile,
|
||||||
|
|
||||||
|
|
||||||
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username, account.Password, command.Mobile,
|
|
||||||
null, account.id, pmUserRoles));
|
null, account.id, pmUserRoles));
|
||||||
if (!createPm.isSuccess)
|
if (!createPm.isSuccess)
|
||||||
{
|
{
|
||||||
@@ -329,7 +332,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//var parameters = new CreateProgramManagerUser(
|
//var parameters = new CreateProgramManagerUser(
|
||||||
// command.Fullname,
|
// command.Fullname,
|
||||||
// command.Username,
|
// command.Username,
|
||||||
@@ -362,7 +364,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
// return operation.Failed(response.Error);
|
// return operation.Failed(response.Error);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_unitOfWork.CommitAccountContext();
|
_unitOfWork.CommitAccountContext();
|
||||||
@@ -376,7 +377,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
public OperationResult Login(Login command)
|
public OperationResult Login(Login command)
|
||||||
{
|
{
|
||||||
|
|
||||||
long idAutoriz = 0;
|
long idAutoriz = 0;
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
if (string.IsNullOrWhiteSpace(command.Password))
|
if (string.IsNullOrWhiteSpace(command.Password))
|
||||||
@@ -401,19 +401,25 @@ public class AccountApplication : IAccountApplication
|
|||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
.ToList();
|
.ToList();
|
||||||
//PmPermission
|
//PmPermission
|
||||||
var PmUserData = _pmUserQueryService.GetPmUserDataByAccountId(account.id).GetAwaiter().GetResult();
|
var PmUserData = _pmUserQueryService.GetPmUserDataByAccountId(account.id)
|
||||||
if (PmUserData.AccountId > 0 && PmUserData.IsActive)
|
.GetAwaiter().GetResult();
|
||||||
|
long? pmUserId = null;
|
||||||
|
if (PmUserData != null)
|
||||||
{
|
{
|
||||||
|
if (PmUserData.AccountId > 0 && PmUserData.IsActive)
|
||||||
|
{
|
||||||
|
var pmUserPermissions =
|
||||||
|
PmUserData.RoleListDto != null
|
||||||
|
? PmUserData.RoleListDto
|
||||||
|
.SelectMany(x => x.Permissions)
|
||||||
|
.Where(p => p != 99)
|
||||||
|
.Distinct()
|
||||||
|
.ToList()
|
||||||
|
: new List<int>();
|
||||||
|
permissions.AddRange(pmUserPermissions);
|
||||||
|
}
|
||||||
|
|
||||||
var pmUserPermissions =
|
pmUserId = PmUserData.Id > 0 ? PmUserData.Id : null;
|
||||||
PmUserData.RoleListDto != null
|
|
||||||
? PmUserData.RoleListDto
|
|
||||||
.SelectMany(x => x.Permissions)
|
|
||||||
.Where(p => p != 99)
|
|
||||||
.Distinct()
|
|
||||||
.ToList()
|
|
||||||
: new List<int>();
|
|
||||||
permissions.AddRange(pmUserPermissions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -426,24 +432,25 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
positionValue = null;
|
positionValue = null;
|
||||||
}
|
}
|
||||||
var pmUserId = PmUserData.AccountId > 0 ? PmUserData.AccountId : null;
|
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto,
|
, account.Username, account.Mobile, account.ProfilePhoto,
|
||||||
permissions, account.RoleName, account.AdminAreaPermission,
|
permissions, account.RoleName, account.AdminAreaPermission,
|
||||||
account.ClientAriaPermission, positionValue,0,pmUserId);
|
account.ClientAriaPermission, positionValue, 0, pmUserId);
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
account.IsActiveString == "true")
|
account.IsActiveString == "true")
|
||||||
{
|
{
|
||||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||||
authViewModel.Permissions = clientPermissions;
|
authViewModel.Permissions = clientPermissions;
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x =>
|
||||||
{
|
new WorkshopClaim
|
||||||
PersonnelCount = x.PersonnelCount,
|
{
|
||||||
Id = x.Id,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Name = x.WorkshopFullName,
|
Id = x.Id,
|
||||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
Name = x.WorkshopFullName,
|
||||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||||
|
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||||
authViewModel.WorkshopList = workshopList;
|
authViewModel.WorkshopList = workshopList;
|
||||||
if (workshopList.Any())
|
if (workshopList.Any())
|
||||||
{
|
{
|
||||||
@@ -456,10 +463,14 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
|
|
||||||
if ((account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" && account.IsActiveString == "true") || (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false" && account.IsActiveString == "true"))
|
if ((account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" &&
|
||||||
|
account.IsActiveString == "true") || (account.AdminAreaPermission == "true" &&
|
||||||
|
account.ClientAriaPermission == "false" &&
|
||||||
|
account.IsActiveString == "true"))
|
||||||
idAutoriz = 1;
|
idAutoriz = 1;
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" && account.IsActiveString == "true")
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
|
account.IsActiveString == "true")
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -471,7 +482,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId, cameraAccount.IsActiveSting);
|
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,
|
||||||
|
cameraAccount.IsActiveSting);
|
||||||
if (cameraAccount.IsActiveSting == "true")
|
if (cameraAccount.IsActiveSting == "true")
|
||||||
{
|
{
|
||||||
_authHelper.CameraSignIn(authViewModel);
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
@@ -481,7 +493,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
idAutoriz = 0;
|
idAutoriz = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subAccount != null)
|
if (subAccount != null)
|
||||||
@@ -511,12 +522,14 @@ public class AccountApplication : IAccountApplication
|
|||||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
||||||
authViewModel.WorkshopId = workshop.WorkshopId;
|
authViewModel.WorkshopId = workshop.WorkshopId;
|
||||||
}
|
}
|
||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return operation.Succcedded(idAutoriz);
|
return operation.Succcedded(idAutoriz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult LoginWithMobile(long id)
|
public OperationResult LoginWithMobile(long id)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
@@ -525,7 +538,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -541,20 +553,22 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, account.AdminAreaPermission, account.ClientAriaPermission, positionValue);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName,
|
||||||
|
account.AdminAreaPermission, account.ClientAriaPermission, positionValue);
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
account.IsActiveString == "true")
|
account.IsActiveString == "true")
|
||||||
{
|
{
|
||||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||||
authViewModel.Permissions = clientPermissions;
|
authViewModel.Permissions = clientPermissions;
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x =>
|
||||||
{
|
new WorkshopClaim
|
||||||
PersonnelCount = x.PersonnelCount,
|
{
|
||||||
Id = x.Id,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Name = x.WorkshopFullName,
|
Id = x.Id,
|
||||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
Name = x.WorkshopFullName,
|
||||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||||
|
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||||
authViewModel.WorkshopList = workshopList;
|
authViewModel.WorkshopList = workshopList;
|
||||||
if (workshopList.Any())
|
if (workshopList.Any())
|
||||||
{
|
{
|
||||||
@@ -567,13 +581,15 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
long idAutoriz = 0;
|
long idAutoriz = 0;
|
||||||
if (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" || account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false")
|
if (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" ||
|
||||||
|
account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false")
|
||||||
idAutoriz = 1;
|
idAutoriz = 1;
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false")
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false")
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
return operation.Succcedded(idAutoriz);
|
return operation.Succcedded(idAutoriz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Logout()
|
public void Logout()
|
||||||
{
|
{
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
@@ -609,6 +625,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
public EditAccount GetByVerifyCode(string code, string phone)
|
public EditAccount GetByVerifyCode(string code, string phone)
|
||||||
{
|
{
|
||||||
return _accountRepository.GetByVerifyCode(code, phone);
|
return _accountRepository.GetByVerifyCode(code, phone);
|
||||||
@@ -637,7 +654,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
await _accountRepository.RemoveCode(id);
|
await _accountRepository.RemoveCode(id);
|
||||||
|
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -682,7 +698,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -691,7 +706,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true", null);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true",
|
||||||
|
null);
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||||
{
|
{
|
||||||
PersonnelCount = x.PersonnelCount,
|
PersonnelCount = x.PersonnelCount,
|
||||||
@@ -711,9 +727,11 @@ public class AccountApplication : IAccountApplication
|
|||||||
authViewModel.WorkshopName = workshop.Name;
|
authViewModel.WorkshopName = workshop.Name;
|
||||||
authViewModel.WorkshopId = workshop.Id;
|
authViewModel.WorkshopId = workshop.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult DirectCameraLogin(long cameraAccountId)
|
public OperationResult DirectCameraLogin(long cameraAccountId)
|
||||||
{
|
{
|
||||||
var prAcc = _authHelper.CurrentAccountInfo();
|
var prAcc = _authHelper.CurrentAccountInfo();
|
||||||
@@ -723,24 +741,22 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
|
|
||||||
|
|
||||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId, cameraAccount.IsActiveSting);
|
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,
|
||||||
|
cameraAccount.IsActiveSting);
|
||||||
if (cameraAccount.IsActiveSting == "true")
|
if (cameraAccount.IsActiveSting == "true")
|
||||||
{
|
{
|
||||||
_authHelper.CameraSignIn(authViewModel);
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return operation.Failed("این اکانت غیر فعال شده است");
|
return operation.Failed("این اکانت غیر فعال شده است");
|
||||||
}
|
}
|
||||||
|
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,10 +789,12 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
return this._accountLeftworkRepository.SaveWorkshopAccount(workshopAccountList, startDate, leftDate, accountId);
|
return this._accountLeftworkRepository.SaveWorkshopAccount(workshopAccountList, startDate, leftDate, accountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult CreateNewWorkshopAccount(long currentAccountId, long newAccountId)
|
public OperationResult CreateNewWorkshopAccount(long currentAccountId, long newAccountId)
|
||||||
{
|
{
|
||||||
return this._accountLeftworkRepository.CopyWorkshopToNewAccount(currentAccountId, newAccountId);
|
return this._accountLeftworkRepository.CopyWorkshopToNewAccount(currentAccountId, newAccountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Mahan
|
#region Mahan
|
||||||
|
|
||||||
public List<AccountViewModel> AccountsForAssign(long taskId)
|
public List<AccountViewModel> AccountsForAssign(long taskId)
|
||||||
@@ -790,6 +808,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
return new List<AccountViewModel>();
|
return new List<AccountViewModel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _accountRepository.GetAccountsByPositionId(positionId);
|
return _accountRepository.GetAccountsByPositionId(positionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -807,7 +826,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -816,10 +834,10 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, account.AdminAreaPermission, account.ClientAriaPermission, account.Position.PositionValue);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName,
|
||||||
|
account.AdminAreaPermission, account.ClientAriaPermission, account.Position.PositionValue);
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
|
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
|
||||||
@@ -828,8 +846,11 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Pooya
|
#region Pooya
|
||||||
public OperationResult IsPhoneNumberAndPasswordValid(long accountId, string phoneNumber, string password, string rePassword)
|
|
||||||
|
public OperationResult IsPhoneNumberAndPasswordValid(long accountId, string phoneNumber, string password,
|
||||||
|
string rePassword)
|
||||||
{
|
{
|
||||||
OperationResult op = new();
|
OperationResult op = new();
|
||||||
|
|
||||||
@@ -847,7 +868,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) && string.IsNullOrWhiteSpace(rePassword))
|
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) &&
|
||||||
|
string.IsNullOrWhiteSpace(rePassword))
|
||||||
return op.Failed("چیزی برای تغییر وجود ندارد");
|
return op.Failed("چیزی برای تغییر وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
@@ -873,20 +895,22 @@ public class AccountApplication : IAccountApplication
|
|||||||
var entity = _accountRepository.Get(command.AccountId);
|
var entity = _accountRepository.Get(command.AccountId);
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||||
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password, command.RePassword);
|
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password,
|
||||||
|
command.RePassword);
|
||||||
if (validationResult.IsSuccedded == false)
|
if (validationResult.IsSuccedded == false)
|
||||||
return validationResult;
|
return validationResult;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(command.RePassword))
|
if (!string.IsNullOrWhiteSpace(command.RePassword))
|
||||||
{
|
{
|
||||||
|
|
||||||
entity.ChangePassword(_passwordHasher.Hash(command.Password));
|
entity.ChangePassword(_passwordHasher.Hash(command.Password));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(command.PhoneNumber))
|
if (!string.IsNullOrWhiteSpace(command.PhoneNumber))
|
||||||
{
|
{
|
||||||
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto, entity.RoleName);
|
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto,
|
||||||
|
entity.RoleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
}
|
}
|
||||||
@@ -982,6 +1006,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
// return claimsResponse.Failed(ApplicationMessages.WrongUserPass);
|
// return claimsResponse.Failed(ApplicationMessages.WrongUserPass);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
|
using _0_Framework.Application.Enums;
|
||||||
using _0_Framework.Application.Sms;
|
using _0_Framework.Application.Sms;
|
||||||
using Company.Domain.ContarctingPartyAgg;
|
using Company.Domain.ContarctingPartyAgg;
|
||||||
using Company.Domain.InstitutionContractAgg;
|
using Company.Domain.InstitutionContractAgg;
|
||||||
@@ -12,19 +13,21 @@ public class JobSchedulerRegistrator
|
|||||||
private readonly IBackgroundJobClient _backgroundJobClient;
|
private readonly IBackgroundJobClient _backgroundJobClient;
|
||||||
private readonly SmsReminder _smsReminder;
|
private readonly SmsReminder _smsReminder;
|
||||||
private readonly IInstitutionContractRepository _institutionContractRepository;
|
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||||
|
private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository;
|
||||||
private static DateTime? _lastRunCreateTransaction;
|
private static DateTime? _lastRunCreateTransaction;
|
||||||
private static DateTime? _lastRunSendMonthlySms;
|
private static DateTime? _lastRunSendMonthlySms;
|
||||||
private readonly ISmsService _smsService;
|
private readonly ISmsService _smsService;
|
||||||
private readonly ILogger<JobSchedulerRegistrator> _logger;
|
private readonly ILogger<JobSchedulerRegistrator> _logger;
|
||||||
|
|
||||||
|
|
||||||
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger<JobSchedulerRegistrator> logger)
|
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger<JobSchedulerRegistrator> logger, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository)
|
||||||
{
|
{
|
||||||
_smsReminder = smsReminder;
|
_smsReminder = smsReminder;
|
||||||
_backgroundJobClient = backgroundJobClient;
|
_backgroundJobClient = backgroundJobClient;
|
||||||
_institutionContractRepository = institutionContractRepository;
|
_institutionContractRepository = institutionContractRepository;
|
||||||
_smsService = smsService;
|
_smsService = smsService;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_institutionContractSmsServiceRepository = institutionContractSmsServiceRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Register()
|
public void Register()
|
||||||
@@ -57,6 +60,44 @@ public class JobSchedulerRegistrator
|
|||||||
() => SendInstitutionContractConfirmSms(),
|
() => SendInstitutionContractConfirmSms(),
|
||||||
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
);
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendWarningSms",
|
||||||
|
() => SendWarningSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendLegalActionSms",
|
||||||
|
() => SendLegalActionSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.Block",
|
||||||
|
() => Block(),
|
||||||
|
"*/30 * * * *" // هر 30 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.UnBlock",
|
||||||
|
() => UnBlock(),
|
||||||
|
"*/10 * * * *"
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.DeActiveInstitutionEndOfContract",
|
||||||
|
() => DeActiveInstitutionEndOfContract(),
|
||||||
|
"*/30 * * * *"
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.BlueDeActiveAfterZeroDebt",
|
||||||
|
() => BlueDeActiveAfterZeroDebt(),
|
||||||
|
"*/10 * * * *"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -67,7 +108,7 @@ public class JobSchedulerRegistrator
|
|||||||
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
||||||
public async System.Threading.Tasks.Task CreateFinancialTransaction()
|
public async System.Threading.Tasks.Task CreateFinancialTransaction()
|
||||||
{
|
{
|
||||||
var now =DateTime.Now;
|
var now = DateTime.Now;
|
||||||
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
||||||
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
||||||
_logger.LogInformation("CreateFinancialTransaction job run");
|
_logger.LogInformation("CreateFinancialTransaction job run");
|
||||||
@@ -89,7 +130,7 @@ public class JobSchedulerRegistrator
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description);
|
await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description);
|
||||||
_lastRunCreateTransaction = now;
|
_lastRunCreateTransaction = now;
|
||||||
Console.WriteLine("CreateTransAction executed");
|
Console.WriteLine("CreateTransAction executed");
|
||||||
|
|
||||||
@@ -122,7 +163,7 @@ public class JobSchedulerRegistrator
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendMonthlySms(now);
|
await _institutionContractSmsServiceRepository.SendMonthlySms(now);
|
||||||
_lastRunSendMonthlySms = now;
|
_lastRunSendMonthlySms = now;
|
||||||
Console.WriteLine("Send Monthly sms executed");
|
Console.WriteLine("Send Monthly sms executed");
|
||||||
|
|
||||||
@@ -144,7 +185,7 @@ public class JobSchedulerRegistrator
|
|||||||
public async System.Threading.Tasks.Task SendReminderSms()
|
public async System.Threading.Tasks.Task SendReminderSms()
|
||||||
{
|
{
|
||||||
_logger.LogInformation("SendReminderSms job run");
|
_logger.LogInformation("SendReminderSms job run");
|
||||||
await _institutionContractRepository.SendReminderSmsForBackgroundTask();
|
await _institutionContractSmsServiceRepository.SendReminderSmsForBackgroundTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -155,7 +196,7 @@ public class JobSchedulerRegistrator
|
|||||||
public async System.Threading.Tasks.Task SendBlockSms()
|
public async System.Threading.Tasks.Task SendBlockSms()
|
||||||
{
|
{
|
||||||
_logger.LogInformation("SendBlockSms job run");
|
_logger.LogInformation("SendBlockSms job run");
|
||||||
await _institutionContractRepository.SendBlockSmsForBackgroundTask();
|
await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -167,7 +208,97 @@ public class JobSchedulerRegistrator
|
|||||||
public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms()
|
public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms()
|
||||||
{
|
{
|
||||||
_logger.LogInformation("SendInstitutionContractConfirmSms job run");
|
_logger.LogInformation("SendInstitutionContractConfirmSms job run");
|
||||||
await _institutionContractRepository.SendInstitutionContractConfirmSmsTask();
|
await _institutionContractSmsServiceRepository.SendInstitutionContractConfirmSmsTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک هشدار
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendWarningSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendWarningSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendLegalActionSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendWarningSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بلاگ سازی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task Block()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("block job run");
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var executeDate = now.ToFarsi().Substring(8, 2);
|
||||||
|
if (executeDate == "20")
|
||||||
|
{
|
||||||
|
if (now.Hour >= 9 && now.Hour < 10)
|
||||||
|
{
|
||||||
|
await _institutionContractSmsServiceRepository.Block(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آنبلاک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task UnBlock()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("UnBlock job run");
|
||||||
|
|
||||||
|
await _institutionContractSmsServiceRepository.UnBlock();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیر فعال سازی قراداد های پایان یافته
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task DeActiveInstitutionEndOfContract()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("DeActiveInstitutionEndOfContract job run");
|
||||||
|
|
||||||
|
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var executeDate = now.ToFarsi().Substring(8, 2);
|
||||||
|
if (executeDate == "01")
|
||||||
|
{
|
||||||
|
if (now.Hour >= 9 && now.Hour < 10)
|
||||||
|
{
|
||||||
|
await _institutionContractSmsServiceRepository.DeActiveInstitutionEndOfContract(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیرفعال سازس قرارداد های آبی که بدهی ندارند
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 800)]
|
||||||
|
public async System.Threading.Tasks.Task BlueDeActiveAfterZeroDebt()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("BlueDeActiveAfterZeroDebt job run");
|
||||||
|
await _institutionContractSmsServiceRepository.BlueDeActiveAfterZeroDebt();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ public class Checkout : EntityBase
|
|||||||
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
||||||
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
||||||
ICollection<CheckoutLoanInstallment> loanInstallments,
|
ICollection<CheckoutLoanInstallment> loanInstallments,
|
||||||
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList)
|
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList, ICollection<CheckoutReward> rewards,double rewardPay)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -71,7 +71,7 @@ public class Checkout : EntityBase
|
|||||||
TotalClaims = totalClaims;
|
TotalClaims = totalClaims;
|
||||||
TotalDeductions = totalDeductions;
|
TotalDeductions = totalDeductions;
|
||||||
TotalPayment = totalPayment;
|
TotalPayment = totalPayment;
|
||||||
RewardPay = 0;
|
RewardPay = rewardPay;
|
||||||
IsActiveString = "true";
|
IsActiveString = "true";
|
||||||
Signature = signature;
|
Signature = signature;
|
||||||
MarriedAllowance = marriedAllowance;
|
MarriedAllowance = marriedAllowance;
|
||||||
@@ -93,6 +93,7 @@ public class Checkout : EntityBase
|
|||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
EmployeeMandatoryHours = employeeMandatoryHours;
|
EmployeeMandatoryHours = employeeMandatoryHours;
|
||||||
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
||||||
|
Rewards = rewards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -130,7 +131,7 @@ public class Checkout : EntityBase
|
|||||||
public double BonusesPay { get; private set; }
|
public double BonusesPay { get; private set; }
|
||||||
public double YearsPay { get; private set; }
|
public double YearsPay { get; private set; }
|
||||||
public double LeavePay { get; private set; }
|
public double LeavePay { get; private set; }
|
||||||
public double? RewardPay { get; private set; }
|
public double RewardPay { get; private set; }
|
||||||
public double InsuranceDeduction { get; private set; }
|
public double InsuranceDeduction { get; private set; }
|
||||||
public double TaxDeducation { get; private set; }
|
public double TaxDeducation { get; private set; }
|
||||||
public double InstallmentDeduction { get; private set; }
|
public double InstallmentDeduction { get; private set; }
|
||||||
@@ -223,6 +224,8 @@ public class Checkout : EntityBase
|
|||||||
|
|
||||||
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
||||||
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
||||||
|
|
||||||
|
public ICollection<CheckoutReward> Rewards { get; set; } = [];
|
||||||
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -239,7 +242,7 @@ public class Checkout : EntityBase
|
|||||||
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
||||||
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
||||||
, string archiveCode, string personnelCode,
|
, string archiveCode, string personnelCode,
|
||||||
string totalClaims, string totalDeductions, double totalPayment, double? rewardPay)
|
string totalClaims, string totalDeductions, double totalPayment, double rewardPay)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -337,6 +340,11 @@ public class Checkout : EntityBase
|
|||||||
InstallmentDeduction = installmentsAmount;
|
InstallmentDeduction = installmentsAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetReward(ICollection<CheckoutReward> rewards, double rewardAmount)
|
||||||
|
{
|
||||||
|
RewardPay = rewardAmount;
|
||||||
|
Rewards = rewards;
|
||||||
|
}
|
||||||
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
||||||
{
|
{
|
||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
|
|||||||
57
Company.Domain/CheckoutAgg/ValueObjects/CheckoutReward.cs
Normal file
57
Company.Domain/CheckoutAgg/ValueObjects/CheckoutReward.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Company.Domain.CheckoutAgg.ValueObjects;
|
||||||
|
|
||||||
|
public class CheckoutReward
|
||||||
|
{
|
||||||
|
public CheckoutReward(string amount, double amountDouble, string grantDateFa, DateTime grantDateGr, string description, string title, long entityId)
|
||||||
|
{
|
||||||
|
Amount = amount;
|
||||||
|
AmountDouble = amountDouble;
|
||||||
|
GrantDateFa = grantDateFa;
|
||||||
|
GrantDateGr = grantDateGr;
|
||||||
|
Description = description;
|
||||||
|
Title = title;
|
||||||
|
EntityId = entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مبلغ پاداش
|
||||||
|
/// string
|
||||||
|
/// </summary>
|
||||||
|
public string Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مبلغ پاداش
|
||||||
|
/// double
|
||||||
|
/// </summary>
|
||||||
|
public double AmountDouble { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ اعطاء
|
||||||
|
/// شمسی
|
||||||
|
/// </summary>
|
||||||
|
public string GrantDateFa { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ اعطاء
|
||||||
|
/// میلادی
|
||||||
|
/// </summary>
|
||||||
|
public DateTime GrantDateGr { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// توضیحات
|
||||||
|
/// </summary>
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// عنوان
|
||||||
|
/// </summary>
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی پاداش
|
||||||
|
/// </summary>
|
||||||
|
public long EntityId { get; set; }
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
using System;
|
||||||
|
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
@@ -32,7 +33,9 @@ public interface IPersonalContractingPartyRepository :IRepository<long, Personal
|
|||||||
List<PersonalContractingPartyViewModel> SearchForMain(PersonalContractingPartySearchModel searchModel2);
|
List<PersonalContractingPartyViewModel> SearchForMain(PersonalContractingPartySearchModel searchModel2);
|
||||||
OperationResult DeletePersonalContractingParties(long id);
|
OperationResult DeletePersonalContractingParties(long id);
|
||||||
bool GetHasContract(long id);
|
bool GetHasContract(long id);
|
||||||
|
[Obsolete("از متدهای async استفاده کنید")]
|
||||||
OperationResult DeActiveAll(long id);
|
OperationResult DeActiveAll(long id);
|
||||||
|
[Obsolete("از متدهای async استفاده کنید")]
|
||||||
OperationResult ActiveAll(long id);
|
OperationResult ActiveAll(long id);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -76,4 +79,9 @@ public interface IPersonalContractingPartyRepository :IRepository<long, Personal
|
|||||||
|
|
||||||
Task<PersonalContractingParty> GetByNationalCode(string nationalCode);
|
Task<PersonalContractingParty> GetByNationalCode(string nationalCode);
|
||||||
Task<PersonalContractingParty> GetByNationalId(string registerId);
|
Task<PersonalContractingParty> GetByNationalId(string registerId);
|
||||||
|
|
||||||
|
Task<OperationResult> DeActiveAllAsync(long id);
|
||||||
|
Task<OperationResult> ActiveAllAsync(long id);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -10,4 +10,6 @@ public interface IFinancialInvoiceRepository : IRepository<long, FinancialInvoic
|
|||||||
EditFinancialInvoice GetDetails(long id);
|
EditFinancialInvoice GetDetails(long id);
|
||||||
List<FinancialInvoiceViewModel> Search(FinancialInvoiceSearchModel searchModel);
|
List<FinancialInvoiceViewModel> Search(FinancialInvoiceSearchModel searchModel);
|
||||||
Task<FinancialInvoice> GetUnPaidByEntityId(long entityId, FinancialInvoiceItemType financialInvoiceItemType);
|
Task<FinancialInvoice> GetUnPaidByEntityId(long entityId, FinancialInvoiceItemType financialInvoiceItemType);
|
||||||
|
Task<FinancialInvoice> GetUnPaidFinancialInvoiceByContractingPartyIdAndAmount(long contractingPartyId,
|
||||||
|
double amount);
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
void UpdateStatusIfNeeded(long institutionContractId);
|
void UpdateStatusIfNeeded(long institutionContractId);
|
||||||
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
|
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
|
||||||
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
|
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
|
||||||
InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request,string contractStart = null);
|
InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request, string contractStart = null);
|
||||||
InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
|
InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
|
||||||
|
|
||||||
#region Creation
|
#region Creation
|
||||||
@@ -80,76 +80,18 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
|
|
||||||
#region Upgrade(Amendment)
|
#region Upgrade(Amendment)
|
||||||
|
|
||||||
Task<InstitutionContractAmendmentWorkshopsResponse> GetAmendmentWorkshops(long institutionContractId);
|
Task<InstitutionContractAmendmentWorkshopsResponse> GetAmendmentWorkshops(long institutionContractId);
|
||||||
Task<InsitutionContractAmendmentPaymentResponse> GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request);
|
Task<InsitutionContractAmendmentPaymentResponse> GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request);
|
||||||
|
|
||||||
Task<InsertAmendmentTempWorkshopResponse> InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request);
|
Task<InsertAmendmentTempWorkshopResponse> InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request);
|
||||||
Task RemoveAmendmentWorkshops(Guid workshopTempId);
|
Task RemoveAmendmentWorkshops(Guid workshopTempId);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
Task<List<InstitutionContractSelectListViewModel>> GetInstitutionContractSelectList(string search, string selected);
|
Task<List<InstitutionContractSelectListViewModel>> GetInstitutionContractSelectList(string search, string selected);
|
||||||
Task<List<InstitutionContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
Task<List<InstitutionContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
||||||
|
|
||||||
|
|
||||||
#region ReminderSMS
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست - ارسال پیامک
|
|
||||||
/// فراخوانی از سمت بک گراند سرویس
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<bool> SendReminderSmsForBackgroundTask();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک صورت حساب ماهانه
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="now"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendMonthlySms(DateTime now);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک مسدودی از طرف بک گراند سرویس
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendBlockSmsForBackgroundTask();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست واجد شرایط بلاک
|
|
||||||
/// جهت ارسال پیامک مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="checkDate"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<BlockSmsListData>> GetBlockListData(DateTime checkDate);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="smsListData"></param>
|
|
||||||
/// <param name="typeOfSms"></param>
|
|
||||||
/// <param name="sendMessStart"></param>
|
|
||||||
/// <param name="sendMessEnd"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendBlockSmsToContractingParties(List<BlockSmsListData> smsListData, string typeOfSms,
|
|
||||||
string sendMessStart, string sendMessEnd);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///دریافت لیست بدهکارن
|
|
||||||
/// جهت ارسال پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<SmsListData>> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک های یاد آور بدهی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendReminderSmsToContractingParties(List<SmsListData> smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک یادآور تایید قراداد مالی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendInstitutionContractConfirmSmsTask();
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region CreateMontlyTransaction
|
#region CreateMontlyTransaction
|
||||||
|
|
||||||
@@ -162,6 +104,13 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Task<long> GetIdByInstallmentId(long installmentId);
|
Task<long> GetIdByInstallmentId(long installmentId);
|
||||||
Task<InstitutionContract> GetPreviousContract(long currentInstitutionContractId);
|
Task<InstitutionContract> GetPreviousContract(long currentInstitutionContractId);
|
||||||
Task<InstitutionContractCreationInquiryResult> CreationInquiry(InstitutionContractCreationInquiryRequest request);
|
Task<InstitutionContractCreationInquiryResult> CreationInquiry(InstitutionContractCreationInquiryRequest request);
|
||||||
@@ -171,4 +120,5 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
Task<InstitutionContractDiscountResponse> SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request);
|
Task<InstitutionContractDiscountResponse> SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request);
|
||||||
Task<InstitutionContractDiscountResponse> ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request);
|
Task<InstitutionContractDiscountResponse> ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request);
|
||||||
Task<OperationResult> CreationComplete(InstitutionContractExtensionCompleteRequest request);
|
Task<OperationResult> CreationComplete(InstitutionContractExtensionCompleteRequest request);
|
||||||
|
Task<InstitutionContract> GetIncludeInstallments(long id);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractAgg;
|
||||||
|
|
||||||
|
public interface IInstitutionContractSmsServiceRepository : IRepository<long, InstitutionContract>
|
||||||
|
{
|
||||||
|
#region reminderSMs
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک یادآور تایید قراداد مالی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendInstitutionContractConfirmSmsTask();
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//هشدار و اقدام قضایی
|
||||||
|
#region WarningOrLegalActionSmsListData
|
||||||
|
/// <summary>
|
||||||
|
/// اجرای تسک پیامک هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست بدهکاران آبی جهت هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsListData>> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="smsListData"></param>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendWarningOrLegalActionSms(List<SmsListData> smsListData, TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//بلاک - آنبلاک - پیامک بلاک -
|
||||||
|
// غیر فعال سازی قراداد های پایان یافته
|
||||||
|
#region Block
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک مسدودی از طرف بک گراند سرویس
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendBlockSmsForBackgroundTask();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست واجد شرایط بلاک
|
||||||
|
/// جهت ارسال پیامک مسدودی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<BlockSmsListData>> GetBlockListData(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک مسدودی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="smsListData"></param>
|
||||||
|
/// <param name="typeOfSms"></param>
|
||||||
|
/// <param name="sendMessStart"></param>
|
||||||
|
/// <param name="sendMessEnd"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendBlockSmsToContractingParties(List<BlockSmsListData> smsListData, string typeOfSms,
|
||||||
|
string sendMessStart, string sendMessEnd);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بلاک سازی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task Block(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست بدهکارانی که باید بلاک شوند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<long>> GetToBeBlockList(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آنبلاک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task UnBlock();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیر فعالسازی قرارداد های پایان یافته
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task DeActiveInstitutionEndOfContract(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیرفعال سازس قرارداد های آبی که بدهی ندارند
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task BlueDeActiveAfterZeroDebt();
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region ReminderSMS
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست - ارسال پیامک
|
||||||
|
/// فراخوانی از سمت بک گراند سرویس
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> SendReminderSmsForBackgroundTask();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک صورت حساب ماهانه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="now"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendMonthlySms(DateTime now);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///دریافت لیست بدهکارن
|
||||||
|
/// جهت ارسال پیامک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsListData>> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک های یاد آور بدهی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendReminderSmsToContractingParties(List<SmsListData> smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interface برای Repository مربوط به فلگ ارسال قرارداد
|
||||||
|
/// </summary>
|
||||||
|
public interface IInstitutionContractSendFlagRepository
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد یک رکورد جدید برای فلگ ارسال قرارداد
|
||||||
|
/// </summary>
|
||||||
|
Task Create(InstitutionContractSendFlag flag);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بازیابی فلگ بر اساس شناسه قرارداد
|
||||||
|
/// </summary>
|
||||||
|
Task<InstitutionContractSendFlag> GetByContractId(long contractId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بهروزرسانی فلگ ارسال
|
||||||
|
/// </summary>
|
||||||
|
Task Update(InstitutionContractSendFlag flag);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بررسی اینکه آیا قرارداد ارسال شده است
|
||||||
|
/// </summary>
|
||||||
|
Task<bool> IsContractSent(long contractId);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
using System;
|
||||||
|
using MongoDB.Bson;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نمایندگی فلگ ارسال قرارداد در MongoDB
|
||||||
|
/// این موجودیت برای ردیابی اینکه آیا قرارداد ارسال شده است استفاده میشود
|
||||||
|
/// </summary>
|
||||||
|
public class InstitutionContractSendFlag
|
||||||
|
{
|
||||||
|
public InstitutionContractSendFlag(long institutionContractId,bool isSent)
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid();
|
||||||
|
InstitutionContractId = institutionContractId;
|
||||||
|
IsSent = isSent;
|
||||||
|
CreatedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه یکتای MongoDB
|
||||||
|
/// </summary>
|
||||||
|
[BsonId]
|
||||||
|
[BsonRepresentation(BsonType.String)]
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه قرارداد در SQL
|
||||||
|
/// </summary>
|
||||||
|
public long InstitutionContractId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا قرارداد ارسال شده است
|
||||||
|
/// </summary>
|
||||||
|
public bool IsSent { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ و زمان ارسال
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? SentDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ و زمان ایجاد رکورد
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CreatedDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ و زمان آخرین بهروزرسانی
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? LastModifiedDate { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// علامتگذاری قرارداد به عنوان ارسالشده
|
||||||
|
/// </summary>
|
||||||
|
public void MarkAsSent()
|
||||||
|
{
|
||||||
|
IsSent = true;
|
||||||
|
SentDate = DateTime.Now;
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بازگردانی علامت ارسال
|
||||||
|
/// </summary>
|
||||||
|
public void MarkAsNotSent()
|
||||||
|
{
|
||||||
|
IsSent = false;
|
||||||
|
SentDate = null;
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بهروزرسانی علامت آخری اصلاح
|
||||||
|
/// </summary>
|
||||||
|
public void UpdateLastModified()
|
||||||
|
{
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,15 +1,16 @@
|
|||||||
using System;
|
using _0_Framework.Domain;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Domain;
|
|
||||||
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg.Entities;
|
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg.Entities;
|
||||||
using CompanyManagment.App.Contracts.Contract;
|
using CompanyManagment.App.Contracts.Contract;
|
||||||
using CompanyManagment.App.Contracts.CustomizeCheckout;
|
using CompanyManagment.App.Contracts.CustomizeCheckout;
|
||||||
using CompanyManagment.App.Contracts.Leave;
|
using CompanyManagment.App.Contracts.Leave;
|
||||||
using CompanyManagment.App.Contracts.Loan;
|
using CompanyManagment.App.Contracts.Loan;
|
||||||
|
using CompanyManagment.App.Contracts.Reward;
|
||||||
using CompanyManagment.App.Contracts.RollCall;
|
using CompanyManagment.App.Contracts.RollCall;
|
||||||
using CompanyManagment.App.Contracts.SalaryAid;
|
using CompanyManagment.App.Contracts.SalaryAid;
|
||||||
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Company.Domain.RollCallAgg;
|
namespace Company.Domain.RollCallAgg;
|
||||||
|
|
||||||
@@ -53,6 +54,9 @@ public interface IRollCallMandatoryRepository : IRepository<long, RollCall>
|
|||||||
List<SalaryAidViewModel> SalaryAidsForCheckout(long employeeId, long workshopId, DateTime checkoutStart,
|
List<SalaryAidViewModel> SalaryAidsForCheckout(long employeeId, long workshopId, DateTime checkoutStart,
|
||||||
DateTime checkoutEnd);
|
DateTime checkoutEnd);
|
||||||
|
|
||||||
|
List<RewardViewModel> RewardForCheckout(long employeeId, long workshopId, DateTime checkoutEnd,
|
||||||
|
DateTime checkoutStart);
|
||||||
|
|
||||||
Task<ComputingViewModel> RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart,
|
Task<ComputingViewModel> RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart,
|
||||||
DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command,bool holidayWorking);
|
DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command,bool holidayWorking);
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,6 @@ public interface ISalaryAidRepository:IRepository<long,SalaryAid>
|
|||||||
void RemoveRange(IEnumerable<SalaryAid> salaryAids);
|
void RemoveRange(IEnumerable<SalaryAid> salaryAids);
|
||||||
|
|
||||||
#region Pooya
|
#region Pooya
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// گروهبندی بر اساس ماه هنگام جستجو با انتخاب کارمند
|
/// گروهبندی بر اساس ماه هنگام جستجو با انتخاب کارمند
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,10 +1,30 @@
|
|||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using _0_Framework.Domain;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Company.Domain.SmsResultAgg;
|
namespace Company.Domain.SmsResultAgg;
|
||||||
|
|
||||||
public interface ISmsResultRepository : IRepository<long, SmsResult>
|
public interface ISmsResultRepository : IRepository<long, SmsResult>
|
||||||
{
|
{
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست پیامکها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsReportDto>> GetSmsReportList(SmsReportSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت اکسپند لیست هر تاریخ
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <param name="date"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date);
|
||||||
|
|
||||||
|
#endregion
|
||||||
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
|
using MongoDB.Driver;
|
||||||
|
|
||||||
|
namespace CompanyManagement.Infrastructure.Mongo.InstitutionContractSendFlagRepo;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Repository برای مدیریت فلگ ارسال قرارداد در MongoDB
|
||||||
|
/// </summary>
|
||||||
|
public class InstitutionContractSendFlagRepository : IInstitutionContractSendFlagRepository
|
||||||
|
{
|
||||||
|
private readonly IMongoCollection<InstitutionContractSendFlag> _collection;
|
||||||
|
|
||||||
|
public InstitutionContractSendFlagRepository(IMongoDatabase database)
|
||||||
|
{
|
||||||
|
_collection = database.GetCollection<InstitutionContractSendFlag>("InstitutionContractSendFlag");
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Create(InstitutionContractSendFlag flag)
|
||||||
|
{
|
||||||
|
await _collection.InsertOneAsync(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<InstitutionContractSendFlag> GetByContractId(long contractId)
|
||||||
|
{
|
||||||
|
var filter = Builders<InstitutionContractSendFlag>.Filter
|
||||||
|
.Eq(x => x.InstitutionContractId, contractId);
|
||||||
|
|
||||||
|
return await _collection.Find(filter).FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task Update(InstitutionContractSendFlag flag)
|
||||||
|
{
|
||||||
|
var filter = Builders<InstitutionContractSendFlag>.Filter
|
||||||
|
.Eq(x => x.InstitutionContractId, flag.InstitutionContractId);
|
||||||
|
|
||||||
|
await _collection.ReplaceOneAsync(filter, flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> IsContractSent(long contractId)
|
||||||
|
{
|
||||||
|
var flag = await GetByContractId(contractId);
|
||||||
|
return flag != null && flag.IsSent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Remove(long contractId)
|
||||||
|
{
|
||||||
|
var filter = Builders<InstitutionContractSendFlag>.Filter
|
||||||
|
.Eq(x => x.InstitutionContractId, contractId);
|
||||||
|
|
||||||
|
await _collection.DeleteOneAsync(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@ using System.Collections.Generic;
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using Company.Application.Contracts.AuthorizedBankDetails;
|
using Company.Application.Contracts.AuthorizedBankDetails;
|
||||||
|
|
||||||
namespace Company.Application.Contracts.AuthorizedBankDetails
|
namespace CompanyManagment.App.Contracts.AuthorizedBankDetails
|
||||||
{
|
{
|
||||||
public interface IAuthorizedBankDetailsApplication
|
public interface IAuthorizedBankDetailsApplication
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -193,4 +193,9 @@ public class CreateCheckout
|
|||||||
/// پایه سنوات قبل از تاثیر ساعت کار
|
/// پایه سنوات قبل از تاثیر ساعت کار
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public double BaseYearUnAffected { get; set; }
|
public double BaseYearUnAffected { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا برای محاسبه پاداش مجاز است
|
||||||
|
/// </summary>
|
||||||
|
public bool RewardPayCompute { get; set; }
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<NoWarn>$(NoWarn);1591</NoWarn>
|
<NoWarn>$(NoWarn);1591</NoWarn>
|
||||||
|
<NuGetAudit>false</NuGetAudit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public class CreateFinancialInvoice
|
|||||||
public double Amount { get; set; }
|
public double Amount { get; set; }
|
||||||
public long ContractingPartyId { get; set; }
|
public long ContractingPartyId { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public List<CreateFinancialInvoiceItem>? Items { get; set; }
|
public List<CreateFinancialInvoiceItem> Items { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CreateFinancialInvoiceItem
|
public class CreateFinancialInvoiceItem
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ public class EditFinancialInvoice
|
|||||||
public double Amount { get; set; }
|
public double Amount { get; set; }
|
||||||
public FinancialInvoiceStatus Status { get; set; }
|
public FinancialInvoiceStatus Status { get; set; }
|
||||||
|
|
||||||
public List<EditFinancialInvoiceItem>? Items { get; set; }
|
public List<EditFinancialInvoiceItem> Items { get; set; }
|
||||||
|
public long ContractingPartyId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EditFinancialInvoiceItem
|
public class EditFinancialInvoiceItem
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.FinancialStatment;
|
namespace CompanyManagment.App.Contracts.FinancialStatment;
|
||||||
|
|
||||||
@@ -62,7 +63,17 @@ public interface IFinancialStatmentApplication
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(long contractingPartyId,
|
Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(long contractingPartyId,
|
||||||
FinancialStatementSearchModel searchModel);
|
FinancialStatementSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پردازش شارژ حساب از طریق درگاه پرداخت سپهر
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <param name="gateWayCallBackUrl">مسیر برگشت درگاه پرداخت</param>
|
||||||
|
///
|
||||||
|
Task<OperationResult<CreateSepehrPaymentGatewayResponse>> CreatePaymentGateWayAndCreateInvoice(
|
||||||
|
CreateFinancialPayRequest request, string gateWayCallBackUrl);
|
||||||
}
|
}
|
||||||
|
public record CreateFinancialPayRequest(long Id, string BaseUrl);
|
||||||
|
|
||||||
public class FinancialStatmentDetailsByContractingPartyViewModel
|
public class FinancialStatmentDetailsByContractingPartyViewModel
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ public class GetInstitutionContractListItemsViewModel
|
|||||||
/// مبلغ قسط
|
/// مبلغ قسط
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public double InstallmentAmount { get; set; }
|
public double InstallmentAmount { get; set; }
|
||||||
|
|
||||||
|
public bool InstitutionContractIsSentFlag { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractListWorkshop
|
public class InstitutionContractListWorkshop
|
||||||
|
|||||||
@@ -305,6 +305,14 @@ public interface IInstitutionContractApplication
|
|||||||
Task<InstitutionContractDiscountResponse> SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request);
|
Task<InstitutionContractDiscountResponse> SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request);
|
||||||
Task<InstitutionContractDiscountResponse> ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request);
|
Task<InstitutionContractDiscountResponse> ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request);
|
||||||
Task<OperationResult> CreationComplete(InstitutionContractExtensionCompleteRequest request);
|
Task<OperationResult> CreationComplete(InstitutionContractExtensionCompleteRequest request);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تعیین فلگ ارسال قرارداد در MongoDB
|
||||||
|
/// اگر فلگ وجود نداشتند ایجاد میکند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request">درخواست تعیین فلگ</param>
|
||||||
|
/// <returns>نتیجه عملیات</returns>
|
||||||
|
Task<OperationResult> SetContractSendFlag(SetInstitutionContractSendFlagRequest request);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CreationSetContractingPartyResponse
|
public class CreationSetContractingPartyResponse
|
||||||
@@ -316,6 +324,7 @@ public class InstitutionContractCreationWorkshopsResponse
|
|||||||
{
|
{
|
||||||
public List<WorkshopTempViewModel> WorkshopTemps { get; set; }
|
public List<WorkshopTempViewModel> WorkshopTemps { get; set; }
|
||||||
public string TotalAmount { get; set; }
|
public string TotalAmount { get; set; }
|
||||||
|
public Guid TempId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractCreationWorkshopsRequest
|
public class InstitutionContractCreationWorkshopsRequest
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// درخواست برای تعیین فلگ ارسال قرارداد
|
||||||
|
/// </summary>
|
||||||
|
public class SetInstitutionContractSendFlagRequest
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه قرارداد
|
||||||
|
/// </summary>
|
||||||
|
public long InstitutionContractId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا قرارداد ارسال شده است
|
||||||
|
/// </summary>
|
||||||
|
public bool IsSent { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -94,4 +94,29 @@ public class BlockSmsListData
|
|||||||
/// آی دی صورت حساب مالی
|
/// آی دی صورت حساب مالی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string AproveId { get; set; }
|
public string AproveId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا قرداد مالی قدیمی است
|
||||||
|
/// </summary>
|
||||||
|
public bool IsElectronicContract { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پابلیک آی دی بخش یک
|
||||||
|
/// </summary>
|
||||||
|
public string Code1 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پابلیک آی دی بخش دو
|
||||||
|
/// </summary>
|
||||||
|
public string Code2 { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لیست قراداد های آبی
|
||||||
|
/// جهت ارسال هشدار یا اقدام قضائی
|
||||||
|
/// </summary>
|
||||||
|
public class BlueWarningSmsData
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
using _0_Framework.Application;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.PaymentCallback;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// رابط برای مدیریت Callback درگاههای پرداخت
|
||||||
|
/// </summary>
|
||||||
|
public interface IPaymentCallbackHandler
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// تأیید و پردازش callback درگاه پرداخت سپهر
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command">دادههای callback درگاه</param>
|
||||||
|
/// <param name="cancellationToken">توکن لغو عملیات</param>
|
||||||
|
/// <returns>نتیجه عملیات</returns>
|
||||||
|
Task<OperationResult> VerifySepehrPaymentCallback(VerifyPaymentCallbackCommand command,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
namespace CompanyManagment.App.Contracts.PaymentCallback;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دستور تأیید callback درگاه پرداخت
|
||||||
|
/// </summary>
|
||||||
|
public class VerifyPaymentCallbackCommand
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// کد پاسخ درگاه (0 = موفق)
|
||||||
|
/// </summary>
|
||||||
|
public int ResponseCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه فاکتور/تراکنش
|
||||||
|
/// </summary>
|
||||||
|
public long InvoiceId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دادههای اضافی JSON
|
||||||
|
/// </summary>
|
||||||
|
public string Payload { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مبلغ تراکنش
|
||||||
|
/// </summary>
|
||||||
|
public long Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره پیگیری درگاه
|
||||||
|
/// </summary>
|
||||||
|
public long TraceNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره سند بانکی (RRN)
|
||||||
|
/// </summary>
|
||||||
|
public long Rrn { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// رسید دیجیتال
|
||||||
|
/// </summary>
|
||||||
|
public string DigitalReceipt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بانک صادر کننده کارت
|
||||||
|
/// </summary>
|
||||||
|
public string IssuerBank { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره کارت
|
||||||
|
/// </summary>
|
||||||
|
public string CardNumber { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پاسخ ایجاد درگاه پرداخت سپهر
|
||||||
|
/// </summary>
|
||||||
|
public class CreateSepehrPaymentGatewayResponse
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// توکن درگاه
|
||||||
|
/// </summary>
|
||||||
|
public string Token { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شناسه تراکنش
|
||||||
|
/// </summary>
|
||||||
|
public long TransactionId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL درگاه پرداخت
|
||||||
|
/// </summary>
|
||||||
|
public string PaymentUrl { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
using _0_Framework.Application;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// رابط برای سرویس مشترک ایجاد درگاه پرداخت سپهر
|
||||||
|
/// </summary>
|
||||||
|
public interface ISepehrPaymentGatewayService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد درگاه پرداخت سپهر برای یک تراکنش
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="amount">مبلغ</param>
|
||||||
|
/// <param name="contractingPartyId">شناسه طرف قرارداد</param>
|
||||||
|
/// <param name="frontCallbackUrl">آدرس بازگشتی به فرانت برای نمایش نتیجه</param>
|
||||||
|
/// <param name="gatewayCallbackUrl">آدرس بازگشتی درگاه پرداخت</param>
|
||||||
|
/// <param name="financialInvoiceId">شناسه فاکتور مالی (اختیاری) - این پارامتر مستقیماً به درگاه فرستاده میشود</param>
|
||||||
|
/// <param name="extraData">دادههای اضافی سفارشی برای payload (اختیاری)</param>
|
||||||
|
/// <param name="cancellationToken">توکن لغو</param>
|
||||||
|
/// <returns>شامل Token درگاه یا OperationResult با خطا</returns>
|
||||||
|
Task<OperationResult<CreateSepehrPaymentGatewayResponse>> CreateSepehrPaymentGateway(
|
||||||
|
double amount,
|
||||||
|
long contractingPartyId,
|
||||||
|
long financialInvoiceId,
|
||||||
|
string gatewayCallbackUrl,
|
||||||
|
string frontCallbackUrl="https://client.gozareshgir.ir",
|
||||||
|
Dictionary<string, object> extraData = null,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
|
}
|
||||||
15
CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs
Normal file
15
CompanyManagment.App.Contracts/SmsResult/Dto/SendStatus.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
namespace CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// وضعیت ارسال پیامک
|
||||||
|
/// </summary>
|
||||||
|
public enum SendStatus
|
||||||
|
{
|
||||||
|
All=0,
|
||||||
|
/// <summary>
|
||||||
|
/// موفق
|
||||||
|
/// </summary>
|
||||||
|
Success,
|
||||||
|
//ناموفق
|
||||||
|
Failed,
|
||||||
|
}
|
||||||
54
CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs
Normal file
54
CompanyManagment.App.Contracts/SmsResult/Dto/SmsReportDto.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
|
|
||||||
|
public class SmsReportDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ ارسال
|
||||||
|
/// </summary>
|
||||||
|
public string SentDate { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SmsReportListDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی
|
||||||
|
/// </summary>
|
||||||
|
public long Id { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی پیامک در sms.ir
|
||||||
|
/// </summary>
|
||||||
|
public int MessageId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// وضعیت ارسال
|
||||||
|
/// </summary>
|
||||||
|
public string Status { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نوع پیامک
|
||||||
|
/// </summary>
|
||||||
|
public string TypeOfSms { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام طرف حساب
|
||||||
|
/// </summary>
|
||||||
|
public string ContractingPartyName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره موبایل
|
||||||
|
/// </summary>
|
||||||
|
public string Mobile { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ساعت و دقیقه
|
||||||
|
/// </summary>
|
||||||
|
public string HourAndMinute { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
|
||||||
|
namespace CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
|
|
||||||
|
public class SmsReportSearchModel
|
||||||
|
{
|
||||||
|
//نوع پیامک
|
||||||
|
public TypeOfSmsSetting TypeOfSms { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// وضعیت ارسال پیامک
|
||||||
|
/// </summary>
|
||||||
|
public SendStatus SendStatus { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره موبایل
|
||||||
|
/// </summary>
|
||||||
|
public string Mobile { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی طرف حساب
|
||||||
|
/// </summary>
|
||||||
|
public long ContractingPatyId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// سال
|
||||||
|
/// </summary>
|
||||||
|
public string Year { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// ماه
|
||||||
|
/// </summary>
|
||||||
|
public string Month { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ شروع
|
||||||
|
/// </summary>
|
||||||
|
public string StartDateFa { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ پایان
|
||||||
|
/// </summary>
|
||||||
|
public string EndDateFa { get; set; }
|
||||||
|
}
|
||||||
@@ -1,14 +1,34 @@
|
|||||||
using System;
|
using _0_Framework.Application;
|
||||||
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
|
||||||
|
|
||||||
namespace CompanyManagment.App.Contracts.SmsResult;
|
namespace CompanyManagment.App.Contracts.SmsResult;
|
||||||
|
|
||||||
public interface ISmsResultApplication
|
public interface ISmsResultApplication
|
||||||
{
|
{
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست پیامکها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsReportDto>> GetSmsReportList(SmsReportSearchModel searchModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت اکسپند لیست هر تاریخ
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <param name="date"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
OperationResult Create(CreateSmsResult command);
|
OperationResult Create(CreateSmsResult command);
|
||||||
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
List<SmsResultViewModel> Search(SmsResultSearchModel searchModel);
|
||||||
}
|
}
|
||||||
@@ -152,5 +152,8 @@ public class CreateWorkshop
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsStaticCheckout { get; set; }
|
public bool IsStaticCheckout { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا پاداش در فیش حقوقی محاسبه شود
|
||||||
|
/// </summary>
|
||||||
|
public bool RewardComputeOnCheckout { get; set; }
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using Company.Application.Contracts.AuthorizedBankDetails;
|
using Company.Application.Contracts.AuthorizedBankDetails;
|
||||||
using Company.Domain.AuthorizedBankDetailsAgg;
|
using Company.Domain.AuthorizedBankDetailsAgg;
|
||||||
|
using CompanyManagment.App.Contracts.AuthorizedBankDetails;
|
||||||
|
|
||||||
namespace CompanyManagment.Application
|
namespace CompanyManagment.Application
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -240,6 +240,16 @@ public class CheckoutApplication : ICheckoutApplication
|
|||||||
|
|
||||||
command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble());
|
command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble());
|
||||||
|
|
||||||
|
var rewards = new List<CheckoutReward>();
|
||||||
|
double rewardPay = 0;
|
||||||
|
if (command.RewardPayCompute)
|
||||||
|
{
|
||||||
|
rewards = _rollCallMandatoryRepository.RewardForCheckout(command.EmployeeId, command.WorkshopId, checkoutEnd.ToGeorgianDateTime(), checkoutStart.ToGeorgianDateTime())
|
||||||
|
.Select(x => new CheckoutReward(x.Amount, x.AmountDouble, x.GrantDateFa, x.GrantDateGr, x.Description, x.Title, x.Id)).ToList();
|
||||||
|
|
||||||
|
rewardPay = rewards.Sum(x => x.AmountDouble);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -361,7 +371,7 @@ public class CheckoutApplication : ICheckoutApplication
|
|||||||
|
|
||||||
|
|
||||||
var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay +
|
var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay +
|
||||||
command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay;
|
command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay + rewardPay;
|
||||||
var totalClaims = totalClaimsDouble.ToMoney();
|
var totalClaims = totalClaimsDouble.ToMoney();
|
||||||
var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction;
|
var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction;
|
||||||
var totalDeductions = totalDeductionDouble.ToMoney();
|
var totalDeductions = totalDeductionDouble.ToMoney();
|
||||||
@@ -386,7 +396,7 @@ public class CheckoutApplication : ICheckoutApplication
|
|||||||
, command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays,
|
, command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays,
|
||||||
command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue
|
command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue
|
||||||
, command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute,
|
, command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute,
|
||||||
loanInstallments, salaryAids,checkoutRollCall,command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList);
|
loanInstallments, salaryAids,checkoutRollCall,command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList, rewards, rewardPay);
|
||||||
|
|
||||||
_checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult();
|
_checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult();
|
||||||
//_checkoutRepository.SaveChanges();
|
//_checkoutRepository.SaveChanges();
|
||||||
|
|||||||
@@ -9,15 +9,13 @@ using CompanyManagment.EFCore;
|
|||||||
|
|
||||||
namespace CompanyManagment.Application;
|
namespace CompanyManagment.Application;
|
||||||
|
|
||||||
public class FinancialInvoiceApplication : RepositoryBase<long, FinancialInvoice>, IFinancialInvoiceApplication
|
public class FinancialInvoiceApplication : IFinancialInvoiceApplication
|
||||||
{
|
{
|
||||||
private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
|
private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
|
||||||
private readonly CompanyContext _context;
|
|
||||||
|
|
||||||
public FinancialInvoiceApplication(IFinancialInvoiceRepository financialInvoiceRepository, CompanyContext context) : base(context)
|
public FinancialInvoiceApplication(IFinancialInvoiceRepository financialInvoiceRepository)
|
||||||
{
|
{
|
||||||
_financialInvoiceRepository = financialInvoiceRepository;
|
_financialInvoiceRepository = financialInvoiceRepository;
|
||||||
_context = context;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Create(CreateFinancialInvoice command)
|
public OperationResult Create(CreateFinancialInvoice command)
|
||||||
@@ -186,6 +184,7 @@ public class FinancialInvoiceApplication : RepositoryBase<long, FinancialInvoice
|
|||||||
return _financialInvoiceRepository.Search(searchModel);
|
return _financialInvoiceRepository.Search(searchModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//public OperationResult Remove(long id)
|
//public OperationResult Remove(long id)
|
||||||
//{
|
//{
|
||||||
// var operation = new OperationResult();
|
// var operation = new OperationResult();
|
||||||
|
|||||||
@@ -3,9 +3,12 @@ using System.Collections.Generic;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using Company.Domain.ContarctingPartyAgg;
|
using Company.Domain.ContarctingPartyAgg;
|
||||||
|
using Company.Domain.FinancialInvoiceAgg;
|
||||||
using Company.Domain.FinancialStatmentAgg;
|
using Company.Domain.FinancialStatmentAgg;
|
||||||
|
using CompanyManagment.App.Contracts.FinancialInvoice;
|
||||||
using CompanyManagment.App.Contracts.FinancialStatment;
|
using CompanyManagment.App.Contracts.FinancialStatment;
|
||||||
using CompanyManagment.App.Contracts.FinancilTransaction;
|
using CompanyManagment.App.Contracts.FinancilTransaction;
|
||||||
|
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||||
using Microsoft.AspNetCore.Components.Forms;
|
using Microsoft.AspNetCore.Components.Forms;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
@@ -16,12 +19,20 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
|||||||
private readonly IFinancialStatmentRepository _financialStatmentRepository;
|
private readonly IFinancialStatmentRepository _financialStatmentRepository;
|
||||||
private readonly IFinancialTransactionApplication _financialTransactionApplication;
|
private readonly IFinancialTransactionApplication _financialTransactionApplication;
|
||||||
private readonly IPersonalContractingPartyRepository _contractingPartyRepository;
|
private readonly IPersonalContractingPartyRepository _contractingPartyRepository;
|
||||||
|
private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
|
||||||
|
private readonly ISepehrPaymentGatewayService _sepehrPaymentGatewayService;
|
||||||
|
|
||||||
public FinancialStatmentApplication(IFinancialStatmentRepository financialStatmentRepository, IFinancialTransactionApplication financialTransactionApplication, IPersonalContractingPartyRepository contractingPartyRepository)
|
public FinancialStatmentApplication(IFinancialStatmentRepository financialStatmentRepository,
|
||||||
|
IFinancialTransactionApplication financialTransactionApplication,
|
||||||
|
IPersonalContractingPartyRepository contractingPartyRepository,
|
||||||
|
IFinancialInvoiceRepository financialInvoiceRepository,
|
||||||
|
ISepehrPaymentGatewayService sepehrPaymentGatewayService)
|
||||||
{
|
{
|
||||||
_financialStatmentRepository = financialStatmentRepository;
|
_financialStatmentRepository = financialStatmentRepository;
|
||||||
_financialTransactionApplication = financialTransactionApplication;
|
_financialTransactionApplication = financialTransactionApplication;
|
||||||
_contractingPartyRepository = contractingPartyRepository;
|
_contractingPartyRepository = contractingPartyRepository;
|
||||||
|
_financialInvoiceRepository = financialInvoiceRepository;
|
||||||
|
_sepehrPaymentGatewayService = sepehrPaymentGatewayService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult CreateFromBankGateway(CreateFinancialStatment command)
|
public OperationResult CreateFromBankGateway(CreateFinancialStatment command)
|
||||||
@@ -51,7 +62,6 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
|||||||
if (createTransaction.IsSuccedded)
|
if (createTransaction.IsSuccedded)
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
return op.Failed("خطا در انجام عملیات");
|
return op.Failed("خطا در انجام عملیات");
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -71,8 +81,6 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
|||||||
Balance = 0,
|
Balance = 0,
|
||||||
TypeOfTransaction = command.TypeOfTransaction,
|
TypeOfTransaction = command.TypeOfTransaction,
|
||||||
DescriptionOption = command.DescriptionOption
|
DescriptionOption = command.DescriptionOption
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
var createTransaction = _financialTransactionApplication.Create(transaction);
|
var createTransaction = _financialTransactionApplication.Create(transaction);
|
||||||
if (createTransaction.IsSuccedded)
|
if (createTransaction.IsSuccedded)
|
||||||
@@ -98,22 +106,22 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
|||||||
{
|
{
|
||||||
debtor = 0;
|
debtor = 0;
|
||||||
creditor = command.CreditorString.MoneyToDouble();
|
creditor = command.CreditorString.MoneyToDouble();
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (command.TypeOfTransaction == "debt")
|
else if (command.TypeOfTransaction == "debt")
|
||||||
{
|
{
|
||||||
creditor = 0;
|
creditor = 0;
|
||||||
debtor = command.DeptorString.MoneyToDouble();
|
debtor = command.DeptorString.MoneyToDouble();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!command.TdateFa.TryToGeorgianDateTime(out var tDateGr))
|
if (!command.TdateFa.TryToGeorgianDateTime(out var tDateGr))
|
||||||
{
|
{
|
||||||
return op.Failed("تاریخ وارد شده صحیح نمی باشد");
|
return op.Failed("تاریخ وارد شده صحیح نمی باشد");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_financialStatmentRepository.Exists(x => x.ContractingPartyId == command.ContractingPartyId))
|
if (_financialStatmentRepository.Exists(x => x.ContractingPartyId == command.ContractingPartyId))
|
||||||
{
|
{
|
||||||
var financialStatment = _financialStatmentRepository.GetDetailsByContractingPartyId(command.ContractingPartyId);
|
var financialStatment =
|
||||||
|
_financialStatmentRepository.GetDetailsByContractingPartyId(command.ContractingPartyId);
|
||||||
var transaction = new CreateFinancialTransaction()
|
var transaction = new CreateFinancialTransaction()
|
||||||
{
|
{
|
||||||
FinancialStatementId = financialStatment.Id,
|
FinancialStatementId = financialStatment.Id,
|
||||||
@@ -124,20 +132,15 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
|||||||
Creditor = creditor,
|
Creditor = creditor,
|
||||||
TypeOfTransaction = command.TypeOfTransaction,
|
TypeOfTransaction = command.TypeOfTransaction,
|
||||||
DescriptionOption = command.DescriptionOption
|
DescriptionOption = command.DescriptionOption
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var createTransaction = _financialTransactionApplication.Create(transaction);
|
var createTransaction = _financialTransactionApplication.Create(transaction);
|
||||||
if (createTransaction.IsSuccedded)
|
if (createTransaction.IsSuccedded)
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
return op.Failed("خطا در انجام عملیات");
|
return op.Failed("خطا در انجام عملیات");
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
var statement = new FinancialStatment(command.ContractingPartyId, command.ContractingPartyName);
|
var statement = new FinancialStatment(command.ContractingPartyId, command.ContractingPartyName);
|
||||||
_financialStatmentRepository.Create(statement);
|
_financialStatmentRepository.Create(statement);
|
||||||
_financialStatmentRepository.SaveChanges();
|
_financialStatmentRepository.SaveChanges();
|
||||||
@@ -153,21 +156,15 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
|||||||
Balance = 0,
|
Balance = 0,
|
||||||
TypeOfTransaction = command.TypeOfTransaction,
|
TypeOfTransaction = command.TypeOfTransaction,
|
||||||
DescriptionOption = command.DescriptionOption
|
DescriptionOption = command.DescriptionOption
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
var createTransaction = _financialTransactionApplication.Create(transaction);
|
var createTransaction = _financialTransactionApplication.Create(transaction);
|
||||||
if (createTransaction.IsSuccedded)
|
if (createTransaction.IsSuccedded)
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
return op.Failed("خطا در انجام عملیات");
|
return op.Failed("خطا در انجام عملیات");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public List<FinancialStatmentViewModel> Search(FinancialStatmentSearchModel searchModel)
|
public List<FinancialStatmentViewModel> Search(FinancialStatmentSearchModel searchModel)
|
||||||
{
|
{
|
||||||
return _financialStatmentRepository.Search(searchModel);
|
return _financialStatmentRepository.Search(searchModel);
|
||||||
@@ -203,6 +200,45 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
|||||||
public async Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(
|
public async Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(
|
||||||
long contractingPartyId, FinancialStatementSearchModel searchModel)
|
long contractingPartyId, FinancialStatementSearchModel searchModel)
|
||||||
{
|
{
|
||||||
return await _financialStatmentRepository.GetDetailsByContractingParty(contractingPartyId,searchModel);
|
return await _financialStatmentRepository.GetDetailsByContractingParty(contractingPartyId, searchModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult<CreateSepehrPaymentGatewayResponse>> CreatePaymentGateWayAndCreateInvoice(
|
||||||
|
CreateFinancialPayRequest request, string gateWayCallBackUrl)
|
||||||
|
{
|
||||||
|
var op = new OperationResult<CreateSepehrPaymentGatewayResponse>();
|
||||||
|
// گام 1: دریافت موجودی حساب
|
||||||
|
var balanceAmount = await GetBalanceAmount(request.Id);
|
||||||
|
if (balanceAmount.Amount <= 0)
|
||||||
|
{
|
||||||
|
return op.Failed("موجودی حساب شما صفر است");
|
||||||
|
}
|
||||||
|
// گام 2: ایجاد درگاه پرداخت سپهر
|
||||||
|
|
||||||
|
var financialInvoice = await _financialInvoiceRepository
|
||||||
|
.GetUnPaidFinancialInvoiceByContractingPartyIdAndAmount(balanceAmount.ContractingPartyId,
|
||||||
|
balanceAmount.Amount);
|
||||||
|
|
||||||
|
if (financialInvoice == null)
|
||||||
|
{
|
||||||
|
financialInvoice = new FinancialInvoice(balanceAmount.Amount, balanceAmount.ContractingPartyId,
|
||||||
|
"پرداخت بدهی صورت حساب مالی");
|
||||||
|
|
||||||
|
var items = new FinancialInvoiceItem("پرداخت بدهی صورت حساب مالی", balanceAmount.Amount,
|
||||||
|
financialInvoice.id, FinancialInvoiceItemType.PreviousDebt, 0);
|
||||||
|
financialInvoice.AddItem(items);
|
||||||
|
await _financialInvoiceRepository.CreateAsync(financialInvoice);
|
||||||
|
await _financialInvoiceRepository.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
var gatewayResult = await _sepehrPaymentGatewayService.CreateSepehrPaymentGateway(
|
||||||
|
amount: balanceAmount.Amount,
|
||||||
|
contractingPartyId: balanceAmount.ContractingPartyId,
|
||||||
|
frontCallbackUrl: request.BaseUrl,
|
||||||
|
gatewayCallbackUrl: gateWayCallBackUrl,
|
||||||
|
financialInvoiceId: financialInvoice.id,
|
||||||
|
extraData: null);
|
||||||
|
|
||||||
|
return gatewayResult;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,40 +1,33 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using _0_Framework.Application.Enums;
|
using _0_Framework.Application.Enums;
|
||||||
using _0_Framework.Application.PaymentGateway;
|
using _0_Framework.Application.PaymentGateway;
|
||||||
using _0_Framework.Application.Sms;
|
using _0_Framework.Application.Sms;
|
||||||
using _0_Framework.Application.UID;
|
|
||||||
using _0_Framework.Exceptions;
|
using _0_Framework.Exceptions;
|
||||||
using AccountManagement.Application.Contracts.Account;
|
using AccountManagement.Application.Contracts.Account;
|
||||||
using Company.Domain.ContarctingPartyAgg;
|
using Company.Domain.ContarctingPartyAgg;
|
||||||
using Company.Domain.EmployeeAgg;
|
|
||||||
using Company.Domain.empolyerAgg;
|
using Company.Domain.empolyerAgg;
|
||||||
using Company.Domain.FinancialInvoiceAgg;
|
using Company.Domain.FinancialInvoiceAgg;
|
||||||
using Company.Domain.FinancialStatmentAgg;
|
using Company.Domain.FinancialStatmentAgg;
|
||||||
using Company.Domain.FinancialTransactionAgg;
|
using Company.Domain.FinancialTransactionAgg;
|
||||||
using Company.Domain.InstitutionContractAgg;
|
using Company.Domain.InstitutionContractAgg;
|
||||||
using Company.Domain.LeftWorkAgg;
|
|
||||||
using Company.Domain.PaymentTransactionAgg;
|
using Company.Domain.PaymentTransactionAgg;
|
||||||
using Company.Domain.RepresentativeAgg;
|
using Company.Domain.RepresentativeAgg;
|
||||||
using Company.Domain.RollCallServiceAgg;
|
using Company.Domain.RollCallServiceAgg;
|
||||||
using Company.Domain.TemporaryClientRegistrationAgg;
|
|
||||||
using Company.Domain.WorkshopAgg;
|
using Company.Domain.WorkshopAgg;
|
||||||
|
using Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
using CompanyManagment.App.Contracts.FinancialInvoice;
|
using CompanyManagment.App.Contracts.FinancialInvoice;
|
||||||
using CompanyManagment.App.Contracts.FinancialStatment;
|
using CompanyManagment.App.Contracts.FinancialStatment;
|
||||||
using CompanyManagment.App.Contracts.InstitutionContract;
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
|
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
|
||||||
using CompanyManagment.App.Contracts.PaymentTransaction;
|
using CompanyManagment.App.Contracts.PaymentTransaction;
|
||||||
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
using CompanyManagment.App.Contracts.Workshop;
|
||||||
using CompanyManagment.EFCore.Migrations;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using OfficeOpenXml.Packaging.Ionic.Zip;
|
|
||||||
using PersianTools.Core;
|
using PersianTools.Core;
|
||||||
using ConnectedPersonnelViewModel = CompanyManagment.App.Contracts.Workshop.ConnectedPersonnelViewModel;
|
using ConnectedPersonnelViewModel = CompanyManagment.App.Contracts.Workshop.ConnectedPersonnelViewModel;
|
||||||
using FinancialStatment = Company.Domain.FinancialStatmentAgg.FinancialStatment;
|
using FinancialStatment = Company.Domain.FinancialStatmentAgg.FinancialStatment;
|
||||||
@@ -49,49 +42,48 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
private readonly IFinancialStatmentApplication _financialStatmentApplication;
|
private readonly IFinancialStatmentApplication _financialStatmentApplication;
|
||||||
private readonly IEmployerRepository _employerRepository;
|
private readonly IEmployerRepository _employerRepository;
|
||||||
private readonly IWorkshopRepository _workshopRepository;
|
private readonly IWorkshopRepository _workshopRepository;
|
||||||
private readonly ILeftWorkRepository _leftWorkRepository;
|
|
||||||
private readonly IWorkshopApplication _workshopApplication;
|
private readonly IWorkshopApplication _workshopApplication;
|
||||||
private readonly IContractingPartyTempRepository _contractingPartyTempRepository;
|
|
||||||
private readonly IFinancialStatmentRepository _financialStatmentRepository;
|
private readonly IFinancialStatmentRepository _financialStatmentRepository;
|
||||||
private readonly IContactInfoApplication _contactInfoApplication;
|
private readonly IContactInfoApplication _contactInfoApplication;
|
||||||
private readonly IAccountApplication _accountApplication;
|
private readonly IAccountApplication _accountApplication;
|
||||||
private readonly ISmsService _smsService;
|
private readonly ISmsService _smsService;
|
||||||
private readonly IUidService _uidService;
|
|
||||||
private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
|
private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
|
||||||
private readonly IPaymentGateway _paymentGateway;
|
private readonly IPaymentGateway _paymentGateway;
|
||||||
private readonly IPaymentTransactionRepository _paymentTransactionRepository;
|
private readonly IPaymentTransactionRepository _paymentTransactionRepository;
|
||||||
private readonly IRollCallServiceRepository _rollCallServiceRepository;
|
private readonly IRollCallServiceRepository _rollCallServiceRepository;
|
||||||
|
private readonly ISepehrPaymentGatewayService _sepehrPaymentGatewayService;
|
||||||
|
private readonly IInstitutionContractSendFlagRepository _institutionContractSendFlagRepository;
|
||||||
|
|
||||||
|
|
||||||
public InstitutionContractApplication(IInstitutionContractRepository institutionContractRepository,
|
public InstitutionContractApplication(IInstitutionContractRepository institutionContractRepository,
|
||||||
IPersonalContractingPartyRepository contractingPartyRepository,
|
IPersonalContractingPartyRepository contractingPartyRepository,
|
||||||
IRepresentativeRepository representativeRepository, IEmployerRepository employerRepository,
|
IRepresentativeRepository representativeRepository, IEmployerRepository employerRepository,
|
||||||
IWorkshopRepository workshopRepository, ILeftWorkRepository leftWorkRepository,
|
IWorkshopRepository workshopRepository,
|
||||||
IFinancialStatmentApplication financialStatmentApplication, IWorkshopApplication workshopApplication,
|
IFinancialStatmentApplication financialStatmentApplication, IWorkshopApplication workshopApplication,
|
||||||
IContractingPartyTempRepository contractingPartyTempRepository,
|
|
||||||
IFinancialStatmentRepository financialStatmentRepository, IContactInfoApplication contactInfoApplication,
|
IFinancialStatmentRepository financialStatmentRepository, IContactInfoApplication contactInfoApplication,
|
||||||
IAccountApplication accountApplication, ISmsService smsService, IUidService uidService,
|
IAccountApplication accountApplication, ISmsService smsService,
|
||||||
IFinancialInvoiceRepository financialInvoiceRepository, IHttpClientFactory httpClientFactory,
|
IFinancialInvoiceRepository financialInvoiceRepository, IHttpClientFactory httpClientFactory,
|
||||||
IPaymentTransactionRepository paymentTransactionRepository, IRollCallServiceRepository rollCallServiceRepository)
|
IPaymentTransactionRepository paymentTransactionRepository, IRollCallServiceRepository rollCallServiceRepository,
|
||||||
|
ISepehrPaymentGatewayService sepehrPaymentGatewayService,ILogger<SepehrPaymentGateway> sepehrGatewayLogger,
|
||||||
|
IInstitutionContractSendFlagRepository institutionContractSendFlagRepository)
|
||||||
{
|
{
|
||||||
_institutionContractRepository = institutionContractRepository;
|
_institutionContractRepository = institutionContractRepository;
|
||||||
_contractingPartyRepository = contractingPartyRepository;
|
_contractingPartyRepository = contractingPartyRepository;
|
||||||
_representativeRepository = representativeRepository;
|
_representativeRepository = representativeRepository;
|
||||||
_employerRepository = employerRepository;
|
_employerRepository = employerRepository;
|
||||||
_workshopRepository = workshopRepository;
|
_workshopRepository = workshopRepository;
|
||||||
_leftWorkRepository = leftWorkRepository;
|
|
||||||
_financialStatmentApplication = financialStatmentApplication;
|
_financialStatmentApplication = financialStatmentApplication;
|
||||||
_workshopApplication = workshopApplication;
|
_workshopApplication = workshopApplication;
|
||||||
_contractingPartyTempRepository = contractingPartyTempRepository;
|
|
||||||
_financialStatmentRepository = financialStatmentRepository;
|
_financialStatmentRepository = financialStatmentRepository;
|
||||||
_contactInfoApplication = contactInfoApplication;
|
_contactInfoApplication = contactInfoApplication;
|
||||||
_accountApplication = accountApplication;
|
_accountApplication = accountApplication;
|
||||||
_smsService = smsService;
|
_smsService = smsService;
|
||||||
_uidService = uidService;
|
|
||||||
_financialInvoiceRepository = financialInvoiceRepository;
|
_financialInvoiceRepository = financialInvoiceRepository;
|
||||||
_paymentTransactionRepository = paymentTransactionRepository;
|
_paymentTransactionRepository = paymentTransactionRepository;
|
||||||
_rollCallServiceRepository = rollCallServiceRepository;
|
_rollCallServiceRepository = rollCallServiceRepository;
|
||||||
_paymentGateway = new SepehrPaymentGateway(httpClientFactory);
|
_sepehrPaymentGatewayService = sepehrPaymentGatewayService;
|
||||||
|
_paymentGateway = new SepehrPaymentGateway(httpClientFactory,sepehrGatewayLogger);
|
||||||
|
_institutionContractSendFlagRepository = institutionContractSendFlagRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Create(CreateInstitutionContract command)
|
public OperationResult Create(CreateInstitutionContract command)
|
||||||
@@ -817,20 +809,11 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
|
var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
|
||||||
if (contractingParty != null)
|
if (contractingParty != null)
|
||||||
{
|
{
|
||||||
contractingParty.DeActive();
|
var accountsDeActiveRes = _contractingPartyRepository.DeActiveAllAsync(contractingParty.id)
|
||||||
_contractingPartyRepository.SaveChanges();
|
.GetAwaiter().GetResult();
|
||||||
var employers =
|
|
||||||
_employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId);
|
if (!accountsDeActiveRes.IsSuccedded)
|
||||||
//var employersIdList = employers.Select(x => x.Id).ToList();
|
return opration.Failed(accountsDeActiveRes.Message);
|
||||||
//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();
|
return opration.Succcedded();
|
||||||
@@ -847,20 +830,10 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
|
var contractingParty = _contractingPartyRepository.Get(institutionContract.ContractingPartyId);
|
||||||
if (contractingParty != null)
|
if (contractingParty != null)
|
||||||
{
|
{
|
||||||
contractingParty.Active();
|
var activeRes = _contractingPartyRepository.ActiveAllAsync(contractingParty.id).GetAwaiter()
|
||||||
_contractingPartyRepository.SaveChanges();
|
.GetResult();
|
||||||
var employers =
|
if (!activeRes.IsSuccedded)
|
||||||
_employerRepository.GetEmployerByContracrtingPartyID(institutionContract.ContractingPartyId);
|
return opration.Failed(activeRes.Message);
|
||||||
//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();
|
return opration.Succcedded();
|
||||||
@@ -925,6 +898,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
return opration.Succcedded();
|
return opration.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void CreateContractingPartyAccount(long contractingPartyid, long accountId)
|
public void CreateContractingPartyAccount(long contractingPartyid, long accountId)
|
||||||
{
|
{
|
||||||
_institutionContractRepository.CreateContractingPartyAccount(contractingPartyid, accountId);
|
_institutionContractRepository.CreateContractingPartyAccount(contractingPartyid, accountId);
|
||||||
@@ -1294,119 +1268,87 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
if (contractingParty == null)
|
if (contractingParty == null)
|
||||||
throw new NotFoundException("طرف قرارداد یافت نشد");
|
throw new NotFoundException("طرف قرارداد یافت نشد");
|
||||||
|
|
||||||
if (institutionContract.VerifyCode != code)
|
if (institutionContract.VerifyCode != code)
|
||||||
return op.Failed("کد وارد شده صحیح نمی باشد");
|
return op.Failed("کد وارد شده صحیح نمی باشد");
|
||||||
|
|
||||||
var financialStatement =await _financialStatmentRepository.GetByContractingPartyId(contractingParty.id);
|
var financialStatement = await _financialStatmentRepository.GetByContractingPartyId(contractingParty.id);
|
||||||
|
|
||||||
var dbTransaction = await _institutionContractRepository.BeginTransactionAsync();
|
var dbTransaction = await _institutionContractRepository.BeginTransactionAsync();
|
||||||
FinancialInvoice financialInvoice;
|
FinancialInvoice financialInvoice;
|
||||||
FinancialInvoiceItem financialInvoiceItem;
|
FinancialInvoiceItem financialInvoiceItem;
|
||||||
var today = DateTime.Today;
|
var today = DateTime.Today;
|
||||||
double invoiceAmount = 0;
|
double invoiceAmount = 0;
|
||||||
string invoiceItemDescription = string.Empty;
|
string invoiceItemDescription = string.Empty;
|
||||||
FinancialInvoiceItemType invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
FinancialInvoiceItemType invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
||||||
long invoiceItemEntityId = 0;
|
long invoiceItemEntityId = 0;
|
||||||
|
|
||||||
if (institutionContract.IsInstallment)
|
if (institutionContract.IsInstallment)
|
||||||
{
|
{
|
||||||
var firstInstallment = institutionContract.Installments.First();
|
var firstInstallment = institutionContract.Installments.First();
|
||||||
var firstInstallmentAmount = firstInstallment.Amount;
|
var firstInstallmentAmount = firstInstallment.Amount;
|
||||||
|
|
||||||
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(firstInstallment.Id, FinancialInvoiceItemType.BuyInstitutionContractInstallment);
|
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(firstInstallment.Id, FinancialInvoiceItemType.BuyInstitutionContractInstallment);
|
||||||
if (financialInvoice == null)
|
if (financialInvoice == null)
|
||||||
{
|
{
|
||||||
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
invoiceAmount = firstInstallmentAmount;
|
||||||
"قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0);
|
invoiceItemDescription = $"پرداخت قسط اول قرارداد شماره {institutionContract.ContractNo}";
|
||||||
financialStatement.AddFinancialTransaction(financialTransaction);
|
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment;
|
||||||
invoiceAmount = firstInstallmentAmount;
|
invoiceItemEntityId = firstInstallment.Id;
|
||||||
invoiceItemDescription = $"پرداخت قسط اول قرارداد شماره {institutionContract.ContractNo}";
|
}
|
||||||
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment;
|
else
|
||||||
invoiceItemEntityId = firstInstallment.Id;
|
{
|
||||||
}
|
invoiceAmount = financialInvoice.Amount;
|
||||||
else
|
invoiceItemDescription = financialInvoice.Items.First().Description;
|
||||||
{
|
invoiceItemType = financialInvoice.Items.First().Type;
|
||||||
invoiceAmount = financialInvoice.Amount;
|
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
||||||
invoiceItemDescription = financialInvoice.Items.First().Description;
|
}
|
||||||
invoiceItemType = financialInvoice.Items.First().Type;
|
}
|
||||||
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
else
|
||||||
}
|
{
|
||||||
}
|
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(institutionContract.id, FinancialInvoiceItemType.BuyInstitutionContract);
|
||||||
else
|
if (financialInvoice == null)
|
||||||
{
|
{
|
||||||
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(institutionContract.id, FinancialInvoiceItemType.BuyInstitutionContract);
|
invoiceAmount = institutionContract.TotalAmount;
|
||||||
if (financialInvoice == null)
|
invoiceItemDescription = $"پرداخت کل قرارداد شماره {institutionContract.ContractNo}";
|
||||||
{
|
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
||||||
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
invoiceItemEntityId = institutionContract.id;
|
||||||
"پرداخت کل سرویس", "debt", "بابت خدمات", institutionContract.TotalAmount, 0, 0);
|
}
|
||||||
financialStatement.AddFinancialTransaction(financialTransaction);
|
else
|
||||||
invoiceAmount = institutionContract.TotalAmount;
|
{
|
||||||
invoiceItemDescription = $"پرداخت کل قرارداد شماره {institutionContract.ContractNo}";
|
invoiceAmount = financialInvoice.Amount;
|
||||||
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
invoiceItemDescription = financialInvoice.Items.First().Description;
|
||||||
invoiceItemEntityId = institutionContract.id;
|
invoiceItemType = financialInvoice.Items.First().Type;
|
||||||
}
|
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
invoiceAmount = financialInvoice.Amount;
|
|
||||||
invoiceItemDescription = financialInvoice.Items.First().Description;
|
|
||||||
invoiceItemType = financialInvoice.Items.First().Type;
|
|
||||||
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (financialInvoice == null)
|
if (financialInvoice == null)
|
||||||
{
|
{
|
||||||
financialInvoice = new FinancialInvoice(invoiceAmount, contractingParty.id, $"خرید قرارداد مالی شماره {institutionContract.ContractNo}");
|
financialInvoice = new FinancialInvoice(invoiceAmount, contractingParty.id, $"خرید قرارداد مالی شماره {institutionContract.ContractNo}");
|
||||||
financialInvoiceItem = new FinancialInvoiceItem(invoiceItemDescription, invoiceAmount, 0, invoiceItemType, invoiceItemEntityId);
|
financialInvoiceItem = new FinancialInvoiceItem(invoiceItemDescription, invoiceAmount, 0, invoiceItemType, invoiceItemEntityId);
|
||||||
financialInvoice.AddItem(financialInvoiceItem);
|
financialInvoice.AddItem(financialInvoiceItem);
|
||||||
await _financialInvoiceRepository.CreateAsync(financialInvoice);
|
await _financialInvoiceRepository.CreateAsync(financialInvoice);
|
||||||
}
|
}
|
||||||
|
|
||||||
await _financialInvoiceRepository.SaveChangesAsync();
|
await _financialInvoiceRepository.SaveChangesAsync();
|
||||||
|
|
||||||
var transaction = new PaymentTransaction(institutionContract.ContractingPartyId, invoiceAmount,
|
// استفاده از سرویس مشترک برای ایجاد درگاه پرداخت
|
||||||
institutionContract.ContractingPartyName, "https://client.gozareshgir.ir",
|
var gatewayResult = await _sepehrPaymentGatewayService.CreateSepehrPaymentGateway(
|
||||||
PaymentTransactionGateWay.SepehrPay);
|
amount: (long)invoiceAmount,
|
||||||
await _paymentTransactionRepository.CreateAsync(transaction);
|
contractingPartyId: institutionContract.ContractingPartyId,
|
||||||
await _financialInvoiceRepository.SaveChangesAsync();
|
gatewayCallbackUrl: callbackUrl,
|
||||||
|
financialInvoiceId: financialInvoice.id,
|
||||||
|
extraData: null);
|
||||||
|
|
||||||
var createPayment = new CreatePaymentGatewayRequest()
|
if (!gatewayResult.IsSuccedded)
|
||||||
{
|
{
|
||||||
Amount = invoiceAmount,
|
await dbTransaction.RollbackAsync();
|
||||||
TransactionId = transaction.id.ToString(),
|
return op.Failed(gatewayResult.Message);
|
||||||
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 dbTransaction.CommitAsync();
|
||||||
await _institutionContractRepository.SaveChangesAsync();
|
await _institutionContractRepository.SaveChangesAsync();
|
||||||
return op.Succcedded(gatewayResponse.Token);
|
return op.Succcedded(gatewayResult.Data.Token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<InstitutionContractWorkshopDetailViewModel> GetWorkshopInitialDetails(long workshopDetailsId)
|
public async Task<InstitutionContractWorkshopDetailViewModel> GetWorkshopInitialDetails(long workshopDetailsId)
|
||||||
@@ -1574,8 +1516,9 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
.Where(x => x.WorkshopCreated && x.WorkshopId is > 0).ToList();
|
.Where(x => x.WorkshopCreated && x.WorkshopId is > 0).ToList();
|
||||||
|
|
||||||
var currentWorkshops = institutionContract.WorkshopGroup.CurrentWorkshops.ToList();
|
var currentWorkshops = institutionContract.WorkshopGroup.CurrentWorkshops.ToList();
|
||||||
var accountId = _contractingPartyRepository
|
var account = _contractingPartyRepository
|
||||||
.GetAccountByPersonalContractingParty(institutionContract.ContractingPartyId).Id;
|
.GetAccountByPersonalContractingParty(institutionContract.ContractingPartyId);
|
||||||
|
var accountId = account.Id;
|
||||||
foreach (var createdWorkshop in initialCreatedWorkshops)
|
foreach (var createdWorkshop in initialCreatedWorkshops)
|
||||||
{
|
{
|
||||||
if (currentWorkshops.Any(x => x.WorkshopId == createdWorkshop.WorkshopId))
|
if (currentWorkshops.Any(x => x.WorkshopId == createdWorkshop.WorkshopId))
|
||||||
@@ -1627,7 +1570,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
var previousInstitutionContract = await _institutionContractRepository
|
var previousInstitutionContract = await _institutionContractRepository
|
||||||
.GetPreviousContract(institutionContract.id);
|
.GetPreviousContract(institutionContract.id);
|
||||||
previousInstitutionContract?.DeActive();
|
previousInstitutionContract?.DeActive();
|
||||||
ReActiveAllAfterCreateNew(institutionContract.ContractingPartyId);
|
await _contractingPartyRepository.ActiveAllAsync(institutionContract.ContractingPartyId);
|
||||||
await _institutionContractRepository.SaveChangesAsync();
|
await _institutionContractRepository.SaveChangesAsync();
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
}
|
}
|
||||||
@@ -1883,7 +1826,60 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
|||||||
installments.Add(lastInstallment);
|
installments.Add(lastInstallment);
|
||||||
return installments;
|
return installments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// تعیین فلگ ارسال قرارداد
|
||||||
|
/// اگر فلگ وجود نداشتند ایجاد میکند
|
||||||
|
/// </summary>
|
||||||
|
public async Task<OperationResult> SetContractSendFlag(SetInstitutionContractSendFlagRequest request)
|
||||||
|
{
|
||||||
|
var operationResult = new OperationResult();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// بازیابی قرارداد از SQL
|
||||||
|
var contract = _institutionContractRepository.Get(request.InstitutionContractId);
|
||||||
|
if (contract == null)
|
||||||
|
return operationResult.Failed("قرارداد مورد نظر یافت نشد");
|
||||||
|
|
||||||
|
// بررسی اینکه آیا فلگ در MongoDB وجود دارد
|
||||||
|
var existingFlag = await _institutionContractSendFlagRepository
|
||||||
|
.GetByContractId(request.InstitutionContractId);
|
||||||
|
|
||||||
|
if (existingFlag != null)
|
||||||
|
{
|
||||||
|
// اگر فلگ وجود داشتند، آن را اپدیت کنیم
|
||||||
|
if (request.IsSent)
|
||||||
|
{
|
||||||
|
existingFlag.MarkAsSent();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
existingFlag.MarkAsNotSent();
|
||||||
|
}
|
||||||
|
existingFlag.UpdateLastModified();
|
||||||
|
await _institutionContractSendFlagRepository.Update(existingFlag);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// اگر فلگ وجود ندارد، آن را ایجاد کنیم
|
||||||
|
var newFlag = new InstitutionContractSendFlag(
|
||||||
|
request.InstitutionContractId,
|
||||||
|
request.IsSent
|
||||||
|
);
|
||||||
|
|
||||||
|
await _institutionContractSendFlagRepository.Create(newFlag);
|
||||||
|
}
|
||||||
|
|
||||||
|
return operationResult.Succcedded();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return operationResult.Failed($"خطا در تعیین فلگ ارسال: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region CustomViewModels
|
#region CustomViewModels
|
||||||
|
|||||||
@@ -1524,7 +1524,8 @@ public class InsuranceListApplication : IInsuranceListApplication
|
|||||||
var dateOfBirth = employeeData.DateOfBirthGr.ToFarsi();
|
var dateOfBirth = employeeData.DateOfBirthGr.ToFarsi();
|
||||||
var dateOfIssue = employeeData.DateOfIssueGr.ToFarsi();
|
var dateOfIssue = employeeData.DateOfIssueGr.ToFarsi();
|
||||||
var leftDate = employeeData.LeftWorkDateGr != null ? employeeData.LeftWorkDateGr.Value.AddDays(-1) : new DateTime();
|
var leftDate = employeeData.LeftWorkDateGr != null ? employeeData.LeftWorkDateGr.Value.AddDays(-1) : new DateTime();
|
||||||
var workingDays = Tools.GetEmployeeInsuranceWorkingDays(employeeData.StartWorkDateGr, leftDate, startDateGr, endDateGr, employeeData.EmployeeId);
|
|
||||||
|
var workingDays = Tools.GetEmployeeInsuranceWorkingDays(employeeData.StartWorkDateGr, leftDate, startDateGr, endDateGr, employeeData.EmployeeId);
|
||||||
var leftWorkFa = workingDays.hasLeftWorkInMonth ? employeeData.LeftWorkDateGr.ToFarsi() : "";
|
var leftWorkFa = workingDays.hasLeftWorkInMonth ? employeeData.LeftWorkDateGr.ToFarsi() : "";
|
||||||
var startWorkFa = employeeData.StartWorkDateGr.ToFarsi();
|
var startWorkFa = employeeData.StartWorkDateGr.ToFarsi();
|
||||||
var workshop = _workShopRepository.GetDetails(workshopId);
|
var workshop = _workShopRepository.GetDetails(workshopId);
|
||||||
@@ -1606,7 +1607,7 @@ public class InsuranceListApplication : IInsuranceListApplication
|
|||||||
MaritalStatus = employeeData.MaritalStatus,
|
MaritalStatus = employeeData.MaritalStatus,
|
||||||
|
|
||||||
StartMonthCurrent = startMonthFa,
|
StartMonthCurrent = startMonthFa,
|
||||||
WorkingDays = workingDays.countWorkingDays,
|
WorkingDays = employeeData.WorkingDays,
|
||||||
StartWorkDate = startWorkFa,
|
StartWorkDate = startWorkFa,
|
||||||
StartWorkDateGr = employeeData.StartWorkDateGr,
|
StartWorkDateGr = employeeData.StartWorkDateGr,
|
||||||
LeftWorkDate = leftWorkFa,
|
LeftWorkDate = leftWorkFa,
|
||||||
|
|||||||
239
CompanyManagment.Application/PaymentCallbackHandler.cs
Normal file
239
CompanyManagment.Application/PaymentCallbackHandler.cs
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
using _0_Framework.Application;
|
||||||
|
using Company.Domain.PaymentTransactionAgg;
|
||||||
|
using CompanyManagment.App.Contracts.FinancialInvoice;
|
||||||
|
using CompanyManagment.App.Contracts.FinancialStatment;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
|
using CompanyManagment.App.Contracts.PaymentCallback;
|
||||||
|
using CompanyManagment.App.Contracts.PaymentTransaction;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Transactions;
|
||||||
|
using _0_Framework.Application.PaymentGateway;
|
||||||
|
using Company.Domain.FinancialStatmentAgg;
|
||||||
|
using Company.Domain.FinancialTransactionAgg;
|
||||||
|
using Company.Domain.InstitutionContractAgg;
|
||||||
|
using CompanyManagment.EFCore.Migrations;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace CompanyManagment.Application;
|
||||||
|
|
||||||
|
public class PaymentCallbackHandler : IPaymentCallbackHandler
|
||||||
|
{
|
||||||
|
private readonly IPaymentTransactionApplication _paymentTransactionApplication;
|
||||||
|
private readonly IFinancialStatmentApplication _financialStatmentApplication;
|
||||||
|
private readonly IFinancialStatmentRepository _financialStatmentRepository;
|
||||||
|
private readonly IFinancialInvoiceApplication _financialInvoiceApplication;
|
||||||
|
private readonly IInstitutionContractApplication _institutionContractApplication;
|
||||||
|
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||||
|
private readonly IPaymentGateway _paymentGateway;
|
||||||
|
|
||||||
|
public PaymentCallbackHandler(
|
||||||
|
IPaymentTransactionApplication paymentTransactionApplication,
|
||||||
|
IFinancialStatmentApplication financialStatmentApplication,
|
||||||
|
IFinancialInvoiceApplication financialInvoiceApplication,
|
||||||
|
IInstitutionContractApplication institutionContractApplication,
|
||||||
|
IHttpClientFactory httpClientFactory, IInstitutionContractRepository institutionContractRepository,
|
||||||
|
IFinancialStatmentRepository financialStatmentRepository,
|
||||||
|
ILogger<SepehrPaymentGateway> sepehrGatewayLogger)
|
||||||
|
{
|
||||||
|
_paymentTransactionApplication = paymentTransactionApplication;
|
||||||
|
_financialStatmentApplication = financialStatmentApplication;
|
||||||
|
_financialInvoiceApplication = financialInvoiceApplication;
|
||||||
|
_institutionContractApplication = institutionContractApplication;
|
||||||
|
_institutionContractRepository = institutionContractRepository;
|
||||||
|
_financialStatmentRepository = financialStatmentRepository;
|
||||||
|
_paymentGateway = new SepehrPaymentGateway(httpClientFactory, sepehrGatewayLogger);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تأیید و پردازش callback درگاه پرداخت سپهر
|
||||||
|
/// </summary>
|
||||||
|
public async Task<OperationResult> VerifySepehrPaymentCallback(VerifyPaymentCallbackCommand command,
|
||||||
|
CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var operation = new OperationResult();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await using var transactionScope =await _financialStatmentRepository.BeginTransactionAsync();
|
||||||
|
|
||||||
|
// گام 1: دریافت اطلاعات تراکنش
|
||||||
|
var transaction = await _paymentTransactionApplication.GetDetails(command.InvoiceId);
|
||||||
|
|
||||||
|
if (transaction == null)
|
||||||
|
return operation.Failed("تراکنش مورد نظر یافت نشد");
|
||||||
|
|
||||||
|
// گام 2: بررسی وضعیت قبلی تراکنش
|
||||||
|
if (transaction.Status != PaymentTransactionStatus.Pending)
|
||||||
|
return operation.Failed("این تراکنش قبلا پرداخت شده است");
|
||||||
|
|
||||||
|
// گام 3: بررسی کد پاسخ درگاه
|
||||||
|
if (command.ResponseCode != 0)
|
||||||
|
{
|
||||||
|
var failResult = _paymentTransactionApplication.SetFailed(command.InvoiceId);
|
||||||
|
return failResult.IsSuccedded
|
||||||
|
? operation.Failed("تراکنش توسط درگاه رد شد")
|
||||||
|
: operation.Failed("خطا در بهروزرسانی وضعیت تراکنش");
|
||||||
|
}
|
||||||
|
|
||||||
|
// گام 4: استخراج اطلاعات فاکتور مالی
|
||||||
|
var extraData = JsonConvert.DeserializeObject<IDictionary<string, object>>(command.Payload ?? "{}");
|
||||||
|
|
||||||
|
extraData.TryGetValue("financialInvoiceId", out var financialInvoiceIdObj);
|
||||||
|
|
||||||
|
if (financialInvoiceIdObj == null ||
|
||||||
|
!long.TryParse(financialInvoiceIdObj.ToString(), out var financialInvoiceId))
|
||||||
|
return operation.Failed("فاکتور مالی نامعتبر است");
|
||||||
|
|
||||||
|
// گام 5: دریافت اطلاعات فاکتور مالی
|
||||||
|
var financialInvoice = _financialInvoiceApplication.GetDetails(financialInvoiceId);
|
||||||
|
|
||||||
|
if (financialInvoice == null)
|
||||||
|
return operation.Failed("فاکتور مالی نامعتبر است");
|
||||||
|
|
||||||
|
if (financialInvoice.Status != FinancialInvoiceStatus.Unpaid)
|
||||||
|
return operation.Failed("فاکتور مالی نامعتبر است");
|
||||||
|
|
||||||
|
// گام 6: بررسی تطابق مبلغ
|
||||||
|
if ((long)financialInvoice.Amount != command.Amount)
|
||||||
|
{
|
||||||
|
var failResult = _paymentTransactionApplication.SetFailed(command.InvoiceId);
|
||||||
|
return operation.Failed("مبلغ تراکنش با مبلغ فاکتور مطابقت ندارد");
|
||||||
|
}
|
||||||
|
|
||||||
|
// گام 7: بهروزرسانی فاکتور مالی
|
||||||
|
var setPaidResult = _financialInvoiceApplication.SetPaid(financialInvoiceId, DateTime.Now);
|
||||||
|
if (!setPaidResult.IsSuccedded)
|
||||||
|
{
|
||||||
|
var failResult = _paymentTransactionApplication.SetFailed(command.InvoiceId);
|
||||||
|
return operation.Failed("خطا در بهروزرسانی فاکتور مالی");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// گام 8: بهروزرسانی وضعیت تراکنش
|
||||||
|
var setSuccessResult = _paymentTransactionApplication.SetSuccess(
|
||||||
|
command.InvoiceId,
|
||||||
|
command.CardNumber,
|
||||||
|
command.IssuerBank,
|
||||||
|
command.Rrn.ToString(),
|
||||||
|
command.DigitalReceipt);
|
||||||
|
|
||||||
|
if (!setSuccessResult.IsSuccedded)
|
||||||
|
{
|
||||||
|
return operation.Failed("خطا در بهروزرسانی وضعیت تراکنش");
|
||||||
|
}
|
||||||
|
|
||||||
|
// گام 9: بهروزرسانی وضعیت قراردادهای نهادی (اگر وجود داشته باشند)
|
||||||
|
var institutionContractItems = financialInvoice.Items.Where(x =>
|
||||||
|
x.Type is FinancialInvoiceItemType.BuyInstitutionContract
|
||||||
|
or FinancialInvoiceItemType.BuyInstitutionContractInstallment).ToList();
|
||||||
|
|
||||||
|
if (institutionContractItems.Any())
|
||||||
|
{
|
||||||
|
await HandleInstitutionContractItems(financialInvoice);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// گام 10: ایجاد سند مالی (Financial Statement)
|
||||||
|
var createCreditStatementCommand = new CreateFinancialStatment()
|
||||||
|
{
|
||||||
|
ContractingPartyId = transaction.ContractingPartyId,
|
||||||
|
Deptor = 0,
|
||||||
|
Creditor = command.Amount,
|
||||||
|
DeptorString = "0",
|
||||||
|
TypeOfTransaction = "credit",
|
||||||
|
DescriptionOption = (financialInvoice.Description ?? "") + " شماره فاکتور: " +
|
||||||
|
(financialInvoice.InvoiceNumber ?? ""),
|
||||||
|
Description = "درگاه بانکی",
|
||||||
|
};
|
||||||
|
|
||||||
|
var statementResult = _financialStatmentApplication.CreateFromBankGateway(createCreditStatementCommand);
|
||||||
|
if (!statementResult.IsSuccedded)
|
||||||
|
{
|
||||||
|
_paymentTransactionApplication.SetFailed(command.InvoiceId);
|
||||||
|
return operation.Failed("خطا در ایجاد سند مالی");
|
||||||
|
}
|
||||||
|
// گام 11: تأیید نهایی با درگاه پرداخت
|
||||||
|
var verifyCommand = new VerifyPaymentGateWayRequest()
|
||||||
|
{
|
||||||
|
Amount = transaction.Amount,
|
||||||
|
TransactionId = command.InvoiceId.ToString(),
|
||||||
|
DigitalReceipt = command.DigitalReceipt
|
||||||
|
};
|
||||||
|
|
||||||
|
var verifyRes = await _paymentGateway.Verify(verifyCommand, cancellationToken);
|
||||||
|
#if DEBUG
|
||||||
|
verifyRes.IsSuccess = true;
|
||||||
|
#endif
|
||||||
|
if (!verifyRes.IsSuccess)
|
||||||
|
{
|
||||||
|
return operation.Failed("خطا در تایید پرداخت از درگاه");
|
||||||
|
}
|
||||||
|
|
||||||
|
// تمام عملیات موفق - تایید transaction
|
||||||
|
await transactionScope.CommitAsync(cancellationToken);
|
||||||
|
return operation.Succcedded();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// در صورت بروز هرگونه خطا، transaction خودکار rollback میشود
|
||||||
|
return operation.Failed($"خطا در پردازش callback: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مدیریت آپدیت قراردادهای نهادی
|
||||||
|
/// </summary>
|
||||||
|
private async Task HandleInstitutionContractItems(EditFinancialInvoice financialInvoice)
|
||||||
|
{
|
||||||
|
// قراردادهای خریداری مستقیم
|
||||||
|
var directContractItems = financialInvoice.Items
|
||||||
|
.Where(x => x.Type == FinancialInvoiceItemType.BuyInstitutionContract);
|
||||||
|
var financialStatement =
|
||||||
|
await _financialStatmentRepository.GetByContractingPartyId(financialInvoice.ContractingPartyId);
|
||||||
|
|
||||||
|
var today = DateTime.Now;
|
||||||
|
foreach (var item in directContractItems)
|
||||||
|
{
|
||||||
|
var institutionContract = _institutionContractRepository.Get(item.EntityId);
|
||||||
|
|
||||||
|
await _institutionContractApplication.SetPendingWorkflow(item.EntityId,
|
||||||
|
InstitutionContractSigningType.OtpBased);
|
||||||
|
|
||||||
|
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
||||||
|
"پرداخت کل سرویس", "debt", "بابت خدمات", institutionContract.TotalAmount, 0, 0);
|
||||||
|
|
||||||
|
financialStatement.AddFinancialTransaction(financialTransaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
// قراردادهای خریداری با اقساط
|
||||||
|
var installmentItems = financialInvoice.Items
|
||||||
|
.Where(x => x.Type == FinancialInvoiceItemType.BuyInstitutionContractInstallment);
|
||||||
|
|
||||||
|
foreach (var item in installmentItems)
|
||||||
|
{
|
||||||
|
var institutionContractId =await _institutionContractRepository.GetIdByInstallmentId(item.EntityId);
|
||||||
|
var institutionContract = _institutionContractRepository.Get(institutionContractId);
|
||||||
|
|
||||||
|
|
||||||
|
await _institutionContractApplication.SetPendingWorkflow(institutionContractId,
|
||||||
|
InstitutionContractSigningType.OtpBased);
|
||||||
|
|
||||||
|
var firstInstallment = institutionContract.Installments.First();
|
||||||
|
|
||||||
|
var firstInstallmentAmount = firstInstallment.Amount;
|
||||||
|
|
||||||
|
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
||||||
|
"قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0);
|
||||||
|
|
||||||
|
financialStatement.AddFinancialTransaction(financialTransaction);
|
||||||
|
}
|
||||||
|
await _financialStatmentRepository.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -447,8 +447,7 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date && x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -458,6 +457,9 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
||||||
x.StartDate!.Value,x.EndDate.Value);
|
x.StartDate!.Value,x.EndDate.Value);
|
||||||
});
|
});
|
||||||
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date && x.ShiftDate.Date <= y.EndDateGr.Date)))
|
||||||
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
|
|
||||||
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
||||||
{
|
{
|
||||||
@@ -487,8 +489,8 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date
|
||||||
&& x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
&& x.ShiftDate.Date <= y.EndDateGr.Date)))
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
|
|
||||||
@@ -632,9 +634,6 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
return operation.Failed("کارمند در بازه انتخاب شده مرخصی ساعتی دارد");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date && x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
|
||||||
|
|
||||||
|
|
||||||
newRollCallDates.ForEach(x =>
|
newRollCallDates.ForEach(x =>
|
||||||
{
|
{
|
||||||
@@ -642,6 +641,11 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
_rollCallDomainService.GetEmployeeShiftDateByRollCallStartDate(command.WorkshopId, command.EmployeeId,
|
||||||
x.StartDate!.Value,x.EndDate.Value);
|
x.StartDate!.Value,x.EndDate.Value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date && x.ShiftDate.Date <= y.EndDateGr.Date)))
|
||||||
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
|
|
||||||
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
if (newRollCallDates.Any(x => x.ShiftDate.Date != date.Date))
|
||||||
{
|
{
|
||||||
return operation.Failed("حضور غیاب در حال ویرایش را نمیتوانید از تاریخ شیفت عقب تر یا جلو تر ببرید");
|
return operation.Failed("حضور غیاب در حال ویرایش را نمیتوانید از تاریخ شیفت عقب تر یا جلو تر ببرید");
|
||||||
@@ -664,7 +668,7 @@ public class RollCallApplication : IRollCallApplication
|
|||||||
&& (y.StartDate.Value.Date <= x.ContractEndGr.Date))))
|
&& (y.StartDate.Value.Date <= x.ContractEndGr.Date))))
|
||||||
return operation.Failed("برای بازه های وارد شده فیش حقوقی ثبت شده است");
|
return operation.Failed("برای بازه های وارد شده فیش حقوقی ثبت شده است");
|
||||||
|
|
||||||
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.StartDate.Value.Date >= y.StartDateGr.Date && x.EndDate.Value.Date <= y.EndDateGr.Date)))
|
if (newRollCallDates == null || !newRollCallDates.All(x => employeeStatuses.Any(y => x.ShiftDate.Date >= y.StartDateGr.Date && x.ShiftDate.Date <= y.EndDateGr.Date)))
|
||||||
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
return operation.Failed("کارمند در بازه وارد شده غیر فعال است");
|
||||||
|
|
||||||
var currentDayRollCall = employeeRollCalls.FirstOrDefault(x => x.EndDate == null);
|
var currentDayRollCall = employeeRollCalls.FirstOrDefault(x => x.EndDate == null);
|
||||||
|
|||||||
119
CompanyManagment.Application/SepehrPaymentGatewayService.cs
Normal file
119
CompanyManagment.Application/SepehrPaymentGatewayService.cs
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Application;
|
||||||
|
using _0_Framework.Application.PaymentGateway;
|
||||||
|
using CompanyManagment.App.Contracts.PaymentTransaction;
|
||||||
|
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace CompanyManagment.Application;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// سرویس مشترک برای ایجاد درگاه پرداخت سپهر
|
||||||
|
/// </summary>
|
||||||
|
public class SepehrPaymentGatewayService : ISepehrPaymentGatewayService
|
||||||
|
{
|
||||||
|
private readonly IPaymentGateway _paymentGateway;
|
||||||
|
private readonly IPaymentTransactionApplication _paymentTransactionApplication;
|
||||||
|
|
||||||
|
public SepehrPaymentGatewayService(
|
||||||
|
IPaymentTransactionApplication paymentTransactionApplication,
|
||||||
|
IHttpClientFactory httpClientFactory,
|
||||||
|
ILogger<SepehrPaymentGateway> sepehrGatewayLogger)
|
||||||
|
{
|
||||||
|
_paymentGateway = new SepehrPaymentGateway(httpClientFactory, sepehrGatewayLogger);
|
||||||
|
_paymentTransactionApplication = paymentTransactionApplication;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد درگاه پرداخت سپهر برای یک تراکنش
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="amount">مبلغ</param>
|
||||||
|
/// <param name="contractingPartyId">شناسه طرف قرارداد</param>
|
||||||
|
/// <param name="frontCallbackUrl">آدرس بازگشتی به فرانت برای نمایش نتیجه</param>
|
||||||
|
/// <param name="gatewayCallbackUrl">آدرس بازگشتی درگاه پرداخت</param>
|
||||||
|
/// <param name="financialInvoiceId">شناسه فاکتور مالی (اختیاری)</param>
|
||||||
|
/// <param name="extraData">دادههای اضافی (اختیاری)</param>
|
||||||
|
/// <param name="cancellationToken">توکن لغو</param>
|
||||||
|
/// <returns>شامل Token درگاه یا OperationResult با خطا</returns>
|
||||||
|
public async Task<OperationResult<CreateSepehrPaymentGatewayResponse>> CreateSepehrPaymentGateway(
|
||||||
|
double amount,
|
||||||
|
long contractingPartyId,
|
||||||
|
long financialInvoiceId,
|
||||||
|
string gatewayCallbackUrl,
|
||||||
|
string frontCallbackUrl="https://client.gozareshgir.ir",
|
||||||
|
Dictionary<string, object> extraData = null,
|
||||||
|
CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var op = new OperationResult<CreateSepehrPaymentGatewayResponse>();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// گام 1: ایجاد تراکنش پرداخت
|
||||||
|
var transactionCommand = new CreatePaymentTransaction()
|
||||||
|
{
|
||||||
|
Amount = amount,
|
||||||
|
ContractingPartyId = contractingPartyId,
|
||||||
|
CallBackUrl = frontCallbackUrl,
|
||||||
|
Gateway = PaymentTransactionGateWay.SepehrPay
|
||||||
|
};
|
||||||
|
|
||||||
|
var transactionResult = await _paymentTransactionApplication.Create(transactionCommand);
|
||||||
|
|
||||||
|
if (!transactionResult.IsSuccedded)
|
||||||
|
{
|
||||||
|
return op.Failed(transactionResult.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// گام 2: ایجاد درخواست درگاه پرداخت
|
||||||
|
extraData ??= new Dictionary<string, object>();
|
||||||
|
|
||||||
|
var createPaymentCommand = new CreatePaymentGatewayRequest()
|
||||||
|
{
|
||||||
|
Amount = amount,
|
||||||
|
TransactionId = transactionResult.SendId.ToString(),
|
||||||
|
CallBackUrl = gatewayCallbackUrl,
|
||||||
|
FinancialInvoiceId = financialInvoiceId,
|
||||||
|
ExtraData = extraData
|
||||||
|
};
|
||||||
|
|
||||||
|
// گام 3: ارسال درخواست به درگاه سپهر
|
||||||
|
var gatewayResponse = await _paymentGateway.Create(createPaymentCommand, cancellationToken);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
gatewayResponse.IsSuccess = true;
|
||||||
|
#endif
|
||||||
|
if (!gatewayResponse.IsSuccess)
|
||||||
|
{
|
||||||
|
return op.Failed($"خطا در ایجاد درگاه پرداخت: {gatewayResponse.Message ?? gatewayResponse.ErrorCode?.ToString()}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// گام 4: ذخیره Token در تراکنش
|
||||||
|
var setTokenResult = await _paymentTransactionApplication.SetTransactionId(
|
||||||
|
transactionResult.SendId,
|
||||||
|
gatewayResponse.Token);
|
||||||
|
|
||||||
|
if (!setTokenResult.IsSuccedded)
|
||||||
|
{
|
||||||
|
return op.Failed("خطا در ذخیره Token درگاه");
|
||||||
|
}
|
||||||
|
|
||||||
|
// گام 5: بازگشت اطلاعات درگاه پرداخت
|
||||||
|
var response = new CreateSepehrPaymentGatewayResponse
|
||||||
|
{
|
||||||
|
Token = gatewayResponse.Token,
|
||||||
|
TransactionId = transactionResult.SendId,
|
||||||
|
PaymentUrl = _paymentGateway.GetStartPayUrl(gatewayResponse.Token)
|
||||||
|
};
|
||||||
|
|
||||||
|
return op.Succcedded(response);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return op.Failed($"خطا در ایجاد درگاه پرداخت: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using Company.Domain.SmsResultAgg;
|
using Company.Domain.SmsResultAgg;
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
|
|
||||||
namespace CompanyManagment.Application;
|
namespace CompanyManagment.Application;
|
||||||
|
|
||||||
@@ -15,6 +17,23 @@ public class SmsResultApplication : ISmsResultApplication
|
|||||||
_smsResultRepository = smsResultRepository;
|
_smsResultRepository = smsResultRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
public async Task<List<SmsReportDto>> GetSmsReportList(SmsReportSearchModel searchModel)
|
||||||
|
{
|
||||||
|
return await _smsResultRepository.GetSmsReportList(searchModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date)
|
||||||
|
{
|
||||||
|
return await _smsResultRepository.GetSmsReportExpandList(searchModel, date);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public OperationResult Create(CreateSmsResult command)
|
public OperationResult Create(CreateSmsResult command)
|
||||||
{
|
{
|
||||||
var op = new OperationResult();
|
var op = new OperationResult();
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
using System;
|
using _0_Framework.Application;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Application;
|
|
||||||
using _0_Framework.Application.Enums;
|
using _0_Framework.Application.Enums;
|
||||||
using Company.Domain.InstitutionContractAgg;
|
using Company.Domain.InstitutionContractAgg;
|
||||||
using Company.Domain.SmsResultAgg;
|
using Company.Domain.SmsResultAgg;
|
||||||
using CompanyManagment.App.Contracts.InstitutionContract;
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
|
using CompanyManagment.EFCore.Repository;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CompanyManagment.Application;
|
namespace CompanyManagment.Application;
|
||||||
|
|
||||||
@@ -15,11 +16,13 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
{
|
{
|
||||||
private readonly ISmsSettingsRepository _smsSettingsRepository;
|
private readonly ISmsSettingsRepository _smsSettingsRepository;
|
||||||
private readonly IInstitutionContractRepository _institutionContractRepository;
|
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||||
|
private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository;
|
||||||
|
|
||||||
public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository)
|
public SmsSettingApplication(ISmsSettingsRepository smsSettingsRepository, IInstitutionContractRepository institutionContractRepository, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository)
|
||||||
{
|
{
|
||||||
_smsSettingsRepository = smsSettingsRepository;
|
_smsSettingsRepository = smsSettingsRepository;
|
||||||
_institutionContractRepository = institutionContractRepository;
|
_institutionContractRepository = institutionContractRepository;
|
||||||
|
_institutionContractSmsServiceRepository = institutionContractSmsServiceRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -116,12 +119,12 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
|
|
||||||
public async Task<List<SmsListData>> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting)
|
public async Task<List<SmsListData>> GetSmsListData(TypeOfSmsSetting typeOfSmsSetting)
|
||||||
{
|
{
|
||||||
return await _institutionContractRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting);
|
return await _institutionContractSmsServiceRepository.GetSmsListData(DateTime.Now, typeOfSmsSetting);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<BlockSmsListData>> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting)
|
public async Task<List<BlockSmsListData>> GetBlockSmsListData(TypeOfSmsSetting typeOfSmsSetting)
|
||||||
{
|
{
|
||||||
return await _institutionContractRepository.GetBlockListData(DateTime.Now);
|
return await _institutionContractSmsServiceRepository.GetBlockListData(DateTime.Now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -134,7 +137,7 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
|
|
||||||
if (command.Any())
|
if (command.Any())
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd);
|
await _institutionContractSmsServiceRepository.SendReminderSmsToContractingParties(command, typeOfSms, sendMessStart, sendMessEnd);
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -153,7 +156,7 @@ public class SmsSettingApplication : ISmsSettingApplication
|
|||||||
string sendMessEnd = "پایان مسدودی آنی ";
|
string sendMessEnd = "پایان مسدودی آنی ";
|
||||||
if (command.Any())
|
if (command.Any())
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendBlockSmsToContractingParties(command, typeOfSms, sendMessStart,
|
await _institutionContractSmsServiceRepository.SendBlockSmsToContractingParties(command, typeOfSms, sendMessStart,
|
||||||
sendMessEnd);
|
sendMessEnd);
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -407,6 +407,10 @@ public class WorkshopAppliction : IWorkshopApplication
|
|||||||
public EditWorkshop GetDetails(long id)
|
public EditWorkshop GetDetails(long id)
|
||||||
{
|
{
|
||||||
var workshop = _workshopRepository.GetDetails(id);
|
var workshop = _workshopRepository.GetDetails(id);
|
||||||
|
if (workshop == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
if (workshop.IsClassified)
|
if (workshop.IsClassified)
|
||||||
{
|
{
|
||||||
workshop.CreatePlan = _workshopPlanApplication.GetWorkshopPlanByWorkshopId(id);
|
workshop.CreatePlan = _workshopPlanApplication.GetWorkshopPlanByWorkshopId(id);
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class CheckoutMapping : IEntityTypeConfiguration<Checkout>
|
|||||||
builder.Property(x => x.FamilyAllowance);
|
builder.Property(x => x.FamilyAllowance);
|
||||||
builder.Property(x => x.HousingAllowance);
|
builder.Property(x => x.HousingAllowance);
|
||||||
builder.Property(x => x.ConsumableItems);
|
builder.Property(x => x.ConsumableItems);
|
||||||
builder.Property(x => x.RewardPay).HasColumnType("float").IsRequired(false);
|
builder.Property(x => x.RewardPay);
|
||||||
|
|
||||||
builder.Property(x => x.LeaveCheckout);
|
builder.Property(x => x.LeaveCheckout);
|
||||||
builder.Property(x => x.CreditLeaves);
|
builder.Property(x => x.CreditLeaves);
|
||||||
@@ -82,6 +82,15 @@ class CheckoutMapping : IEntityTypeConfiguration<Checkout>
|
|||||||
salaryAid.Property(x => x.CalculationDateTimeFa).HasMaxLength(15);
|
salaryAid.Property(x => x.CalculationDateTimeFa).HasMaxLength(15);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
builder.OwnsMany(x => x.Rewards, reward =>
|
||||||
|
{
|
||||||
|
reward.Property(x => x.Description).HasColumnType("ntext");
|
||||||
|
reward.Property(x => x.Title).HasMaxLength(255);
|
||||||
|
reward.Property(x=> x.Amount).HasMaxLength(25);
|
||||||
|
reward.Property(x => x.GrantDateFa).HasMaxLength(10);
|
||||||
|
});
|
||||||
|
|
||||||
builder.OwnsOne(x => x.CheckoutRollCall, rollCall =>
|
builder.OwnsOne(x => x.CheckoutRollCall, rollCall =>
|
||||||
{
|
{
|
||||||
rollCall.Property(x => x.TotalPresentTimeSpan).HasTimeSpanConversion();
|
rollCall.Property(x => x.TotalPresentTimeSpan).HasTimeSpanConversion();
|
||||||
|
|||||||
11566
CompanyManagment.EFCore/Migrations/20260124132444_Add Reward to checkout.Designer.cs
generated
Normal file
11566
CompanyManagment.EFCore/Migrations/20260124132444_Add Reward to checkout.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace CompanyManagment.EFCore.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class AddRewardtocheckout : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AlterColumn<double>(
|
||||||
|
name: "RewardPay",
|
||||||
|
table: "Checkouts",
|
||||||
|
type: "float",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: 0.0,
|
||||||
|
oldClrType: typeof(double),
|
||||||
|
oldType: "float",
|
||||||
|
oldNullable: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "CheckoutReward",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Checkoutid = table.Column<long>(type: "bigint", nullable: false),
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
Amount = table.Column<string>(type: "nvarchar(25)", maxLength: 25, nullable: true),
|
||||||
|
AmountDouble = table.Column<double>(type: "float", nullable: false),
|
||||||
|
GrantDateFa = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: true),
|
||||||
|
GrantDateGr = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Description = table.Column<string>(type: "ntext", nullable: true),
|
||||||
|
Title = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true),
|
||||||
|
EntityId = table.Column<long>(type: "bigint", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_CheckoutReward", x => new { x.Checkoutid, x.Id });
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_CheckoutReward_Checkouts_Checkoutid",
|
||||||
|
column: x => x.Checkoutid,
|
||||||
|
principalTable: "Checkouts",
|
||||||
|
principalColumn: "id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "CheckoutReward");
|
||||||
|
|
||||||
|
migrationBuilder.AlterColumn<double>(
|
||||||
|
name: "RewardPay",
|
||||||
|
table: "Checkouts",
|
||||||
|
type: "float",
|
||||||
|
nullable: true,
|
||||||
|
oldClrType: typeof(double),
|
||||||
|
oldType: "float");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -635,7 +635,7 @@ namespace CompanyManagment.EFCore.Migrations
|
|||||||
.HasMaxLength(10)
|
.HasMaxLength(10)
|
||||||
.HasColumnType("nvarchar(10)");
|
.HasColumnType("nvarchar(10)");
|
||||||
|
|
||||||
b.Property<double?>("RewardPay")
|
b.Property<double>("RewardPay")
|
||||||
.HasColumnType("float");
|
.HasColumnType("float");
|
||||||
|
|
||||||
b.Property<string>("RotatingShiftValue")
|
b.Property<string>("RotatingShiftValue")
|
||||||
@@ -7501,6 +7501,49 @@ namespace CompanyManagment.EFCore.Migrations
|
|||||||
.HasForeignKey("Checkoutid");
|
.HasForeignKey("Checkoutid");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
b.OwnsMany("Company.Domain.CheckoutAgg.ValueObjects.CheckoutReward", "Rewards", b1 =>
|
||||||
|
{
|
||||||
|
b1.Property<long>("Checkoutid")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b1.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property<int>("Id"));
|
||||||
|
|
||||||
|
b1.Property<string>("Amount")
|
||||||
|
.HasMaxLength(25)
|
||||||
|
.HasColumnType("nvarchar(25)");
|
||||||
|
|
||||||
|
b1.Property<double>("AmountDouble")
|
||||||
|
.HasColumnType("float");
|
||||||
|
|
||||||
|
b1.Property<string>("Description")
|
||||||
|
.HasColumnType("ntext");
|
||||||
|
|
||||||
|
b1.Property<long>("EntityId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b1.Property<string>("GrantDateFa")
|
||||||
|
.HasMaxLength(10)
|
||||||
|
.HasColumnType("nvarchar(10)");
|
||||||
|
|
||||||
|
b1.Property<DateTime>("GrantDateGr")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b1.Property<string>("Title")
|
||||||
|
.HasMaxLength(255)
|
||||||
|
.HasColumnType("nvarchar(255)");
|
||||||
|
|
||||||
|
b1.HasKey("Checkoutid", "Id");
|
||||||
|
|
||||||
|
b1.ToTable("CheckoutReward");
|
||||||
|
|
||||||
|
b1.WithOwner()
|
||||||
|
.HasForeignKey("Checkoutid");
|
||||||
|
});
|
||||||
|
|
||||||
b.OwnsMany("Company.Domain.CheckoutAgg.ValueObjects.CheckoutSalaryAid", "SalaryAids", b1 =>
|
b.OwnsMany("Company.Domain.CheckoutAgg.ValueObjects.CheckoutSalaryAid", "SalaryAids", b1 =>
|
||||||
{
|
{
|
||||||
b1.Property<long>("Checkoutid")
|
b1.Property<long>("Checkoutid")
|
||||||
@@ -7545,6 +7588,8 @@ namespace CompanyManagment.EFCore.Migrations
|
|||||||
|
|
||||||
b.Navigation("LoanInstallments");
|
b.Navigation("LoanInstallments");
|
||||||
|
|
||||||
|
b.Navigation("Rewards");
|
||||||
|
|
||||||
b.Navigation("SalaryAids");
|
b.Navigation("SalaryAids");
|
||||||
|
|
||||||
b.Navigation("Workshop");
|
b.Navigation("Workshop");
|
||||||
|
|||||||
@@ -531,6 +531,7 @@ public class CheckoutRepository : RepositoryBase<long, Checkout>, ICheckoutRepos
|
|||||||
|
|
||||||
entity.SetSalaryAid(command.SalaryAids, command.SalaryAidDeduction);
|
entity.SetSalaryAid(command.SalaryAids, command.SalaryAidDeduction);
|
||||||
entity.SetLoanInstallment(command.LoanInstallments, command.InstallmentDeduction);
|
entity.SetLoanInstallment(command.LoanInstallments, command.InstallmentDeduction);
|
||||||
|
entity.SetReward(command.Rewards,command.RewardPay);
|
||||||
entity.SetCheckoutRollCall(command.CheckoutRollCall);
|
entity.SetCheckoutRollCall(command.CheckoutRollCall);
|
||||||
entity.SetEmployeeMandatoryHours(command.EmployeeMandatoryHours);
|
entity.SetEmployeeMandatoryHours(command.EmployeeMandatoryHours);
|
||||||
if(command.HasInsuranceShareTheSameAsList)
|
if(command.HasInsuranceShareTheSameAsList)
|
||||||
@@ -934,7 +935,7 @@ public class CheckoutRepository : RepositoryBase<long, Checkout>, ICheckoutRepos
|
|||||||
TotalClaims = item.TotalClaims,
|
TotalClaims = item.TotalClaims,
|
||||||
TotalDeductions = item.TotalDeductions,
|
TotalDeductions = item.TotalDeductions,
|
||||||
TotalPayment = item.TotalPayment.ToMoney(),
|
TotalPayment = item.TotalPayment.ToMoney(),
|
||||||
RewardPay = item.RewardPay.ToMoneyNullable(),
|
RewardPay = item.RewardPay.ToMoney(),
|
||||||
ContractStartGr = item.ContractStart,
|
ContractStartGr = item.ContractStart,
|
||||||
ContractEndGr = item.ContractEnd,
|
ContractEndGr = item.ContractEnd,
|
||||||
IsLeft = false,
|
IsLeft = false,
|
||||||
@@ -1335,7 +1336,7 @@ public class CheckoutRepository : RepositoryBase<long, Checkout>, ICheckoutRepos
|
|||||||
TotalClaims = x.TotalClaims,
|
TotalClaims = x.TotalClaims,
|
||||||
TotalDeductions = x.TotalDeductions,
|
TotalDeductions = x.TotalDeductions,
|
||||||
TotalPayment = x.TotalPayment.ToMoney(),
|
TotalPayment = x.TotalPayment.ToMoney(),
|
||||||
RewardPay = x.RewardPay.ToMoneyNullable(),
|
RewardPay = x.RewardPay.ToMoney(),
|
||||||
ContractStartGr = x.ContractStart,
|
ContractStartGr = x.ContractStart,
|
||||||
ContractEndGr = x.ContractEnd,
|
ContractEndGr = x.ContractEnd,
|
||||||
IsLeft = false,
|
IsLeft = false,
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public class FinancialInvoiceRepository : RepositoryBase<long, FinancialInvoice>
|
|||||||
Amount = financialInvoice.Amount,
|
Amount = financialInvoice.Amount,
|
||||||
Status = financialInvoice.Status,
|
Status = financialInvoice.Status,
|
||||||
InvoiceNumber = financialInvoice.InvoiceNumber,
|
InvoiceNumber = financialInvoice.InvoiceNumber,
|
||||||
|
ContractingPartyId = financialInvoice.ContractingPartyId,
|
||||||
Items = financialInvoice.Items?.Select(x => new EditFinancialInvoiceItem
|
Items = financialInvoice.Items?.Select(x => new EditFinancialInvoiceItem
|
||||||
{
|
{
|
||||||
Id = x.id,
|
Id = x.id,
|
||||||
@@ -100,4 +101,12 @@ public class FinancialInvoiceRepository : RepositoryBase<long, FinancialInvoice>
|
|||||||
.Where(x => x.Status == FinancialInvoiceStatus.Unpaid).FirstOrDefaultAsync(x => x.Items
|
.Where(x => x.Status == FinancialInvoiceStatus.Unpaid).FirstOrDefaultAsync(x => x.Items
|
||||||
.Any(y => y.Type == financialInvoiceItemType && y.EntityId == entityId));
|
.Any(y => y.Type == financialInvoiceItemType && y.EntityId == entityId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<FinancialInvoice> GetUnPaidFinancialInvoiceByContractingPartyIdAndAmount(long contractingPartyId,
|
||||||
|
double amount)
|
||||||
|
{
|
||||||
|
return await _context.FinancialInvoices.FirstOrDefaultAsync(x=>x.ContractingPartyId == contractingPartyId &&
|
||||||
|
x.Amount == amount &&
|
||||||
|
x.Status == FinancialInvoiceStatus.Unpaid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -210,6 +210,7 @@ public class FinancialStatmentRepository : RepositoryBase<long, FinancialStatmen
|
|||||||
}
|
}
|
||||||
return new FinancialTransactionDetailViewModel()
|
return new FinancialTransactionDetailViewModel()
|
||||||
{
|
{
|
||||||
|
Id = t.id,
|
||||||
DateTimeGr = t.TdateGr,
|
DateTimeGr = t.TdateGr,
|
||||||
DateFa = t.TdateGr.ToFarsi(),
|
DateFa = t.TdateGr.ToFarsi(),
|
||||||
TimeFa = $"{t.TdateGr:HH:mm}",
|
TimeFa = $"{t.TdateGr:HH:mm}",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -245,7 +245,7 @@ public class PersonalContractingPartyRepository : RepositoryBase<long, PersonalC
|
|||||||
return new();
|
return new();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _accountContext.Accounts.Where(x => x.id == accId && x.IsActiveString == "true").Select(x =>
|
return _accountContext.Accounts.Where(x => x.id == accId).Select(x =>
|
||||||
new AccountViewModel()
|
new AccountViewModel()
|
||||||
{
|
{
|
||||||
Id = x.id,
|
Id = x.id,
|
||||||
@@ -773,6 +773,133 @@ public class PersonalContractingPartyRepository : RepositoryBase<long, PersonalC
|
|||||||
return await _context.PersonalContractingParties.FirstOrDefaultAsync(x => x.NationalId == nationalId);
|
return await _context.PersonalContractingParties.FirstOrDefaultAsync(x => x.NationalId == nationalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> DeActiveAllAsync(long id)
|
||||||
|
{
|
||||||
|
OperationResult result = new OperationResult();
|
||||||
|
await using var transaction = await _context.Database.BeginTransactionAsync();
|
||||||
|
await using var accountTransaction = await _accountContext.Database.BeginTransactionAsync();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var contractingParty = _context.PersonalContractingParties
|
||||||
|
.FirstOrDefault(x => x.id == id);
|
||||||
|
|
||||||
|
if (contractingParty == null)
|
||||||
|
return result.Failed("طرف حساب یافت نشد");
|
||||||
|
|
||||||
|
contractingParty.DeActive();
|
||||||
|
|
||||||
|
var employers = _context.Employers
|
||||||
|
.Where(x => x.ContractingPartyId == id).ToList();
|
||||||
|
employers.ForEach(x => x.DeActive());
|
||||||
|
|
||||||
|
var employerIds = employers.Select(x => x.id).ToList();
|
||||||
|
var workshopIds = _context.WorkshopEmployers
|
||||||
|
.Where(x => employerIds.Contains(x.EmployerId))
|
||||||
|
.Select(x => x.WorkshopId).ToList();
|
||||||
|
|
||||||
|
var workshops = _context.Workshops
|
||||||
|
.Where(x => workshopIds.Contains(x.id)).ToList();
|
||||||
|
workshops.ForEach(x => x.DeActive(x.ArchiveCode));
|
||||||
|
|
||||||
|
var contracts = _context.Contracts
|
||||||
|
.Where(x => workshopIds.Contains(x.WorkshopIds)).ToList();
|
||||||
|
contracts.ForEach(x => x.DeActive());
|
||||||
|
|
||||||
|
var contractIds = contracts.Select(x => x.id).ToList();
|
||||||
|
var checkouts = _context.CheckoutSet
|
||||||
|
.Where(x => contractIds.Contains(x.ContractId)).ToList();
|
||||||
|
checkouts.ForEach(x => x.DeActive());
|
||||||
|
|
||||||
|
var contractingPartyAccount =await _context.ContractingPartyAccounts
|
||||||
|
.FirstOrDefaultAsync(x => x.PersonalContractingPartyId == id);
|
||||||
|
if (contractingPartyAccount != null)
|
||||||
|
{
|
||||||
|
var account = await _accountContext.Accounts
|
||||||
|
.FirstOrDefaultAsync(x => x.id == contractingPartyAccount.AccountId);
|
||||||
|
|
||||||
|
account?.DeActive();
|
||||||
|
|
||||||
|
var cameraAccount =await _accountContext.CameraAccounts
|
||||||
|
.FirstOrDefaultAsync(x=>x.AccountId==account.id);
|
||||||
|
|
||||||
|
cameraAccount?.DeActive();
|
||||||
|
|
||||||
|
await _accountContext.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
await transaction.CommitAsync();
|
||||||
|
await accountTransaction.CommitAsync();
|
||||||
|
result.Succcedded();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
result.Failed("غیرفعال کردن طرف حساب با خطا مواجه شد");
|
||||||
|
await transaction.RollbackAsync();
|
||||||
|
await accountTransaction.RollbackAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> ActiveAllAsync(long id)
|
||||||
|
{
|
||||||
|
OperationResult result = new OperationResult();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var personel = _context.PersonalContractingParties
|
||||||
|
.FirstOrDefault(x => x.id == id);
|
||||||
|
if (personel == null)
|
||||||
|
return result.Failed("طرف حساب یافت نشد");
|
||||||
|
|
||||||
|
personel.Active();
|
||||||
|
|
||||||
|
var employers = _context.Employers.Where(x => x.ContractingPartyId == id).ToList();
|
||||||
|
employers.ForEach(x => x.Active());
|
||||||
|
|
||||||
|
var employerIds = employers.Select(x => x.id).ToList();
|
||||||
|
var workshopIds = _context.WorkshopEmployers.Where(x => employerIds.Contains(x.EmployerId))
|
||||||
|
.Select(x => x.WorkshopId).ToList();
|
||||||
|
var workshops = _context.Workshops.Where(x => workshopIds.Contains(x.id)).ToList();
|
||||||
|
workshops.ForEach(x => x.Active(x.ArchiveCode));
|
||||||
|
|
||||||
|
var contracts = _context.Contracts.Where(x => workshopIds.Contains(x.WorkshopIds)).ToList();
|
||||||
|
contracts.ForEach(x => x.Active());
|
||||||
|
|
||||||
|
var contractIds = contracts.Select(x => x.id).ToList();
|
||||||
|
var checkouts = _context.CheckoutSet.Where(x => contractIds.Contains(x.ContractId)).ToList();
|
||||||
|
checkouts.ForEach(x => x.Active());
|
||||||
|
|
||||||
|
var contractingPartyAccount =await _context.ContractingPartyAccounts
|
||||||
|
.FirstOrDefaultAsync(x => x.PersonalContractingPartyId == id);
|
||||||
|
if (contractingPartyAccount != null)
|
||||||
|
{
|
||||||
|
var account = await _accountContext.Accounts
|
||||||
|
.FirstOrDefaultAsync(x => x.id == contractingPartyAccount.AccountId);
|
||||||
|
|
||||||
|
account?.Active();
|
||||||
|
|
||||||
|
var cameraAccount =await _accountContext.CameraAccounts
|
||||||
|
.FirstOrDefaultAsync(x=>x.AccountId==account.id);
|
||||||
|
|
||||||
|
cameraAccount?.Active();
|
||||||
|
|
||||||
|
await _accountContext.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
|
result.Succcedded();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
result.Failed("فعال کردن طرف حساب با خطا مواجه شد");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public class ReportClientRepository : IReportClientRepository
|
|||||||
TotalClaims = x.TotalClaims,
|
TotalClaims = x.TotalClaims,
|
||||||
TotalDeductions = x.TotalDeductions,
|
TotalDeductions = x.TotalDeductions,
|
||||||
TotalPayment = x.TotalPayment.ToMoney(),
|
TotalPayment = x.TotalPayment.ToMoney(),
|
||||||
RewardPay = x.RewardPay.ToMoneyNullable(),
|
RewardPay = x.RewardPay.ToMoney(),
|
||||||
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
||||||
}).Where(x => x.WorkshopId == workshopId);
|
}).Where(x => x.WorkshopId == workshopId);
|
||||||
|
|
||||||
@@ -448,7 +448,7 @@ public class ReportClientRepository : IReportClientRepository
|
|||||||
TotalClaims = x.TotalClaims,
|
TotalClaims = x.TotalClaims,
|
||||||
TotalDeductions = x.TotalDeductions,
|
TotalDeductions = x.TotalDeductions,
|
||||||
TotalPayment = x.TotalPayment.ToMoney(),
|
TotalPayment = x.TotalPayment.ToMoney(),
|
||||||
RewardPay = x.RewardPay.ToMoneyNullable(),
|
RewardPay = x.RewardPay.ToMoney(),
|
||||||
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
MarriedAllowance = x.MarriedAllowance.ToMoney(),
|
||||||
}).Where(x => x.WorkshopId == workshopId);
|
}).Where(x => x.WorkshopId == workshopId);
|
||||||
|
|
||||||
|
|||||||
@@ -5199,10 +5199,10 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<RewardViewModel> RewardForCheckout(long employeeId, long workshopId, DateTime checkoutEnd,
|
public List<RewardViewModel> RewardForCheckout(long employeeId, long workshopId, DateTime checkoutEnd,
|
||||||
DateTime checkoutStart)
|
DateTime checkoutStart)
|
||||||
{
|
{
|
||||||
return _context.Rewards.Where(x =>
|
var result = _context.Rewards.Where(x =>
|
||||||
x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= checkoutEnd &&
|
x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= checkoutEnd &&
|
||||||
x.GrantDate >= checkoutStart).Select(x => new RewardViewModel
|
x.GrantDate >= checkoutStart).Select(x => new RewardViewModel
|
||||||
{
|
{
|
||||||
@@ -5215,6 +5215,8 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
|
|||||||
IsActive = x.IsActive,
|
IsActive = x.IsActive,
|
||||||
Id = x.id
|
Id = x.id
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FineViewModel> FinesForCheckout(long employeeId, long workshopId, DateTime contractStart,
|
private List<FineViewModel> FinesForCheckout(long employeeId, long workshopId, DateTime contractStart,
|
||||||
|
|||||||
@@ -1,13 +1,20 @@
|
|||||||
using System.Collections.Generic;
|
using _0_Framework.Application;
|
||||||
using System.Linq;
|
|
||||||
using _0_Framework.Application;
|
|
||||||
using _0_Framework.InfraStructure;
|
using _0_Framework.InfraStructure;
|
||||||
using Company.Domain.SmsResultAgg;
|
using Company.Domain.SmsResultAgg;
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
using CompanyManagment.App.Contracts.SmsResult;
|
||||||
|
using CompanyManagment.App.Contracts.SmsResult.Dto;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
||||||
|
|
||||||
namespace CompanyManagment.EFCore.Repository;
|
namespace CompanyManagment.EFCore.Repository;
|
||||||
|
|
||||||
public class SmsResultRepository : RepositoryBase<long, SmsResult> , ISmsResultRepository
|
public class SmsResultRepository : RepositoryBase<long, SmsResult>, ISmsResultRepository
|
||||||
{
|
{
|
||||||
private readonly CompanyContext _context;
|
private readonly CompanyContext _context;
|
||||||
public SmsResultRepository(CompanyContext context) : base(context)
|
public SmsResultRepository(CompanyContext context) : base(context)
|
||||||
@@ -15,6 +22,260 @@ public class SmsResultRepository : RepositoryBase<long, SmsResult> , ISmsResultR
|
|||||||
_context = context;
|
_context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<List<SmsReportDto>> GetSmsReportList(SmsReportSearchModel searchModel)
|
||||||
|
{
|
||||||
|
|
||||||
|
// مرحله 1: همه رکوردها را با projection ساده بگیرید
|
||||||
|
var rawQuery = await _context.SmsResults
|
||||||
|
.Select(x => new
|
||||||
|
{
|
||||||
|
x.id,
|
||||||
|
x.ContractingPatyId,
|
||||||
|
x.Mobile,
|
||||||
|
x.Status,
|
||||||
|
x.TypeOfSms,
|
||||||
|
x.CreationDate,
|
||||||
|
DateOnly = x.CreationDate.Date // فقط تاریخ بدون ساعت
|
||||||
|
})
|
||||||
|
.AsNoTracking()
|
||||||
|
.ToListAsync(); // اینجا SQL اجرا میشود و همه دادهها به client میآیند
|
||||||
|
|
||||||
|
if (searchModel.ContractingPatyId > 0)
|
||||||
|
{
|
||||||
|
rawQuery = rawQuery.Where(x => x.ContractingPatyId == searchModel.ContractingPatyId).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(searchModel.Mobile))
|
||||||
|
{
|
||||||
|
rawQuery = rawQuery.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning)
|
||||||
|
{
|
||||||
|
var typeOfSms = "All";
|
||||||
|
switch (searchModel.TypeOfSms)
|
||||||
|
{
|
||||||
|
case TypeOfSmsSetting.InstitutionContractDebtReminder:
|
||||||
|
typeOfSms = "یادآور بدهی ماهانه";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.MonthlyInstitutionContract:
|
||||||
|
typeOfSms = "صورت حساب ماهانه";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.BlockContractingParty:
|
||||||
|
typeOfSms = "اعلام مسدودی طرف حساب";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.LegalAction:
|
||||||
|
typeOfSms = "اقدام قضایی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.InstitutionContractConfirm:
|
||||||
|
typeOfSms = "یادآور تایید قرارداد مالی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.SendInstitutionContractConfirmationCode:
|
||||||
|
typeOfSms = "کد تاییدیه قرارداد مالی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.TaskReminder:
|
||||||
|
typeOfSms = "یادآور وظایف";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rawQuery = rawQuery.Where(x => x.TypeOfSms == typeOfSms).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning)
|
||||||
|
{
|
||||||
|
rawQuery = rawQuery.Where(x => x.TypeOfSms.Contains("هشدار")).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchModel.SendStatus != SendStatus.All)
|
||||||
|
{
|
||||||
|
var status = "All";
|
||||||
|
|
||||||
|
switch (searchModel.SendStatus)
|
||||||
|
{
|
||||||
|
case SendStatus.Success: status = "موفق";
|
||||||
|
break;
|
||||||
|
case SendStatus.Failed: status = "ناموفق";
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
rawQuery = rawQuery.Where(x => x.Status == status).ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
#region searchByDate
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(searchModel.StartDateFa) &&
|
||||||
|
!string.IsNullOrWhiteSpace(searchModel.EndDateFa))
|
||||||
|
{
|
||||||
|
if (searchModel.StartDateFa.TryToGeorgianDateTime(out var startGr) == false ||
|
||||||
|
searchModel.EndDateFa.TryToGeorgianDateTime(out var endGr) == false)
|
||||||
|
return new List<SmsReportDto>();
|
||||||
|
|
||||||
|
rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrWhiteSpace(searchModel.Year) && !string.IsNullOrWhiteSpace(searchModel.Month))
|
||||||
|
{
|
||||||
|
var start = searchModel.Year + "/" + searchModel.Month + "/01";
|
||||||
|
var end = start.FindeEndOfMonth();
|
||||||
|
var startGr = start.ToGeorgianDateTime();
|
||||||
|
var endGr = end.ToGeorgianDateTime();
|
||||||
|
rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrWhiteSpace(searchModel.Year) && string.IsNullOrWhiteSpace(searchModel.Month))
|
||||||
|
{
|
||||||
|
var start = searchModel.Year + "/01/01";
|
||||||
|
var findEndOfYear = searchModel.Year + "/12/01";
|
||||||
|
var end = findEndOfYear.FindeEndOfMonth();
|
||||||
|
var startGr = start.ToGeorgianDateTime();
|
||||||
|
var endGr = end.ToGeorgianDateTime();
|
||||||
|
rawQuery = rawQuery.Where(x => x.CreationDate.Date >= startGr.Date && x.CreationDate.Date <= endGr.Date).ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
// مرحله 2: گروهبندی و انتخاب آخرین رکورد هر روز روی Client
|
||||||
|
var grouped = rawQuery
|
||||||
|
.GroupBy(x => x.DateOnly)
|
||||||
|
.Select(g => g.OrderByDescending(x => x.CreationDate).First())
|
||||||
|
.OrderByDescending(x => x.CreationDate)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// مرحله 3: تبدیل به DTO و ToFarsi
|
||||||
|
var result = grouped.Select(x => new SmsReportDto
|
||||||
|
{
|
||||||
|
SentDate = x.CreationDate.ToFarsi()
|
||||||
|
}).ToList();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<List<SmsReportListDto>> GetSmsReportExpandList(SmsReportSearchModel searchModel, string date)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(date))
|
||||||
|
return new List<SmsReportListDto>();
|
||||||
|
|
||||||
|
if (date.TryToGeorgianDateTime(out var searchDate) == false)
|
||||||
|
return new List<SmsReportListDto>();
|
||||||
|
|
||||||
|
var query = await _context.SmsResults.Where(x => x.CreationDate.Date == searchDate.Date)
|
||||||
|
.Select(x =>
|
||||||
|
new
|
||||||
|
{
|
||||||
|
x.id,
|
||||||
|
x.MessageId,
|
||||||
|
x.Status,
|
||||||
|
x.TypeOfSms,
|
||||||
|
x.ContractingPartyName,
|
||||||
|
x.Mobile,
|
||||||
|
x.ContractingPatyId,
|
||||||
|
x.InstitutionContractId,
|
||||||
|
x.CreationDate,
|
||||||
|
x.CreationDate.Hour,
|
||||||
|
x.CreationDate.Minute
|
||||||
|
|
||||||
|
}).AsNoTracking()
|
||||||
|
.ToListAsync(); ;
|
||||||
|
|
||||||
|
if (searchModel.ContractingPatyId > 0)
|
||||||
|
{
|
||||||
|
query = query.Where(x => x.ContractingPatyId == searchModel.ContractingPatyId).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(searchModel.Mobile))
|
||||||
|
{
|
||||||
|
query = query.Where(x => x.Mobile.Contains(searchModel.Mobile)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchModel.TypeOfSms != TypeOfSmsSetting.All && searchModel.TypeOfSms != TypeOfSmsSetting.Warning)
|
||||||
|
{
|
||||||
|
var typeOfSms = "All";
|
||||||
|
switch (searchModel.TypeOfSms)
|
||||||
|
{
|
||||||
|
case TypeOfSmsSetting.InstitutionContractDebtReminder:
|
||||||
|
typeOfSms = "یادآور بدهی ماهانه";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.MonthlyInstitutionContract:
|
||||||
|
typeOfSms = "صورت حساب ماهانه";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.BlockContractingParty:
|
||||||
|
typeOfSms = "اعلام مسدودی طرف حساب";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.LegalAction:
|
||||||
|
typeOfSms = "اقدام قضایی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.InstitutionContractConfirm:
|
||||||
|
typeOfSms = "یادآور تایید قرارداد مالی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.SendInstitutionContractConfirmationCode:
|
||||||
|
typeOfSms = "کد تاییدیه قرارداد مالی";
|
||||||
|
break;
|
||||||
|
case TypeOfSmsSetting.TaskReminder:
|
||||||
|
typeOfSms = "یادآور وظایف";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
query = query.Where(x => x.TypeOfSms == typeOfSms).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchModel.TypeOfSms == TypeOfSmsSetting.Warning)
|
||||||
|
{
|
||||||
|
query = query.Where(x => x.TypeOfSms.Contains("هشدار")).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchModel.SendStatus != SendStatus.All)
|
||||||
|
{
|
||||||
|
var status = "All";
|
||||||
|
|
||||||
|
switch (searchModel.SendStatus)
|
||||||
|
{
|
||||||
|
case SendStatus.Success:
|
||||||
|
status = "موفق";
|
||||||
|
break;
|
||||||
|
case SendStatus.Failed:
|
||||||
|
status = "ناموفق";
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
query = query.Where(x => x.Status == status).ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.Count == 0)
|
||||||
|
return new List<SmsReportListDto>();
|
||||||
|
|
||||||
|
var result = query.OrderByDescending(x => x.CreationDate.Hour)
|
||||||
|
.ThenByDescending(x => x.CreationDate.Minute).Select(x =>
|
||||||
|
new SmsReportListDto()
|
||||||
|
{
|
||||||
|
Id = x.id,
|
||||||
|
MessageId = x.MessageId,
|
||||||
|
Status = x.Status,
|
||||||
|
TypeOfSms = x.TypeOfSms,
|
||||||
|
ContractingPartyName = x.ContractingPartyName,
|
||||||
|
Mobile = x.Mobile,
|
||||||
|
HourAndMinute = x.CreationDate.TimeOfDay.ToString(@"hh\:mm"),
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public List<App.Contracts.SmsResult.SmsResultViewModel> Search(SmsResultSearchModel searchModel)
|
public List<App.Contracts.SmsResult.SmsResultViewModel> Search(SmsResultSearchModel searchModel)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -82,7 +343,7 @@ public class SmsResultRepository : RepositoryBase<long, SmsResult> , ISmsResultR
|
|||||||
|
|
||||||
|
|
||||||
query = query.OrderByDescending(x => x.CreationDate)
|
query = query.OrderByDescending(x => x.CreationDate)
|
||||||
.ThenByDescending(x=>x.CreationDate.Hour).ThenByDescending(x=>x.CreationDate.Minute);
|
.ThenByDescending(x => x.CreationDate.Hour).ThenByDescending(x => x.CreationDate.Minute);
|
||||||
|
|
||||||
return query.Skip(searchModel.PageIndex).Take(30).ToList();
|
return query.Skip(searchModel.PageIndex).Take(30).ToList();
|
||||||
|
|
||||||
|
|||||||
@@ -160,7 +160,9 @@ public class WorkshopRepository : RepositoryBase<long, Company.Domain.WorkshopAg
|
|||||||
public EditWorkshop GetDetails(long id)
|
public EditWorkshop GetDetails(long id)
|
||||||
{
|
{
|
||||||
var emp = _context.WorkshopEmployers.Where(x => x.WorkshopId == id)
|
var emp = _context.WorkshopEmployers.Where(x => x.WorkshopId == id)
|
||||||
.Select(x => x.EmployerId).ToList();
|
.Select(x => x.Employer).ToList();
|
||||||
|
var contractingPart = emp.Select(x => x.ContractingPartyId).ToList();
|
||||||
|
bool rewardCompute = contractingPart.Any(x=>x == 30804);
|
||||||
return _context.Workshops.Select(x => new EditWorkshop
|
return _context.Workshops.Select(x => new EditWorkshop
|
||||||
{
|
{
|
||||||
Id = x.id,
|
Id = x.id,
|
||||||
@@ -193,7 +195,7 @@ public class WorkshopRepository : RepositoryBase<long, Company.Domain.WorkshopAg
|
|||||||
BonusesOptions = string.IsNullOrWhiteSpace(x.BonusesOptions) ? "EndOfContract1402leftWork1403" : x.BonusesOptions,
|
BonusesOptions = string.IsNullOrWhiteSpace(x.BonusesOptions) ? "EndOfContract1402leftWork1403" : x.BonusesOptions,
|
||||||
YearsOptions = x.YearsOptions,
|
YearsOptions = x.YearsOptions,
|
||||||
IsOldContract = x.IsOldContract,
|
IsOldContract = x.IsOldContract,
|
||||||
EmployerIdList = emp,
|
EmployerIdList = emp.Select(e=>e.id).ToList(),
|
||||||
HasRollCallFreeVip = x.HasRollCallFreeVip,
|
HasRollCallFreeVip = x.HasRollCallFreeVip,
|
||||||
WorkshopHolidayWorking = x.WorkshopHolidayWorking,
|
WorkshopHolidayWorking = x.WorkshopHolidayWorking,
|
||||||
InsuranceCheckoutOvertime = x.InsuranceCheckoutOvertime,
|
InsuranceCheckoutOvertime = x.InsuranceCheckoutOvertime,
|
||||||
@@ -205,6 +207,7 @@ public class WorkshopRepository : RepositoryBase<long, Company.Domain.WorkshopAg
|
|||||||
SignCheckout = x.SignCheckout,
|
SignCheckout = x.SignCheckout,
|
||||||
RotatingShiftCompute = x.RotatingShiftCompute,
|
RotatingShiftCompute = x.RotatingShiftCompute,
|
||||||
IsStaticCheckout = x.IsStaticCheckout,
|
IsStaticCheckout = x.IsStaticCheckout,
|
||||||
|
RewardComputeOnCheckout = rewardCompute
|
||||||
|
|
||||||
}).FirstOrDefault(x => x.Id == id);
|
}).FirstOrDefault(x => x.Id == id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,16 +207,11 @@ public class SmsService : ISmsService
|
|||||||
}
|
}
|
||||||
public async Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate)
|
public async Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate)
|
||||||
{
|
{
|
||||||
var st = new DateTime(2024, 6, 2);
|
|
||||||
var ed = new DateTime(2024, 7, 1);
|
|
||||||
if (!string.IsNullOrWhiteSpace(startDate) && startDate.Length == 10)
|
if(startDate.TryToGeorgianDateTime(out var st) == false || endDate.TryToGeorgianDateTime(out var ed) == false)
|
||||||
{
|
return new List<ApiResultViewModel>();
|
||||||
st = startDate.ToGeorgianDateTime();
|
|
||||||
}
|
|
||||||
if (!string.IsNullOrWhiteSpace(endDate) && endDate.Length == 10)
|
|
||||||
{
|
|
||||||
ed = endDate.ToGeorgianDateTime();
|
|
||||||
}
|
|
||||||
var res = new List<ApiResultViewModel>();
|
var res = new List<ApiResultViewModel>();
|
||||||
Int32 unixTimestamp = (int)st.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
|
Int32 unixTimestamp = (int)st.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
|
||||||
Int32 unixTimestamp2 = (int)ed.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
|
Int32 unixTimestamp2 = (int)ed.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
|
||||||
@@ -248,6 +243,44 @@ public class SmsService : ISmsService
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<ApiReportDto>> GetApiReport(string startDate, string endDate)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if (startDate.TryToGeorgianDateTime(out var st) == false || endDate.TryToGeorgianDateTime(out var ed) == false)
|
||||||
|
return new List<ApiReportDto>();
|
||||||
|
|
||||||
|
var res = new List<ApiReportDto>();
|
||||||
|
Int32 unixTimestamp = (int)st.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
|
||||||
|
Int32 unixTimestamp2 = (int)ed.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
|
||||||
|
// int? fromDateUnixTime = null; // unix time - for instance: 1700598600
|
||||||
|
//int? toDateUnixTime = null; // unix time - for instance: 1703190600
|
||||||
|
int pageNumber = 2;
|
||||||
|
int pageSize = 100; // max: 100
|
||||||
|
SmsIr smsIr = new SmsIr("Og5M562igmzJRhQPnq0GdtieYdLgtfikjzxOmeQBPxJjZtyge5Klc046Lfw1mxSa");
|
||||||
|
var response = await smsIr.GetArchivedReportAsync(pageNumber, pageSize, unixTimestamp, unixTimestamp2);
|
||||||
|
|
||||||
|
MessageReportResult[] messages = response.Data;
|
||||||
|
foreach (var message in messages)
|
||||||
|
{
|
||||||
|
var appendData = new ApiReportDto()
|
||||||
|
{
|
||||||
|
MessageId = message.MessageId,
|
||||||
|
|
||||||
|
Mobile = message.Mobile,
|
||||||
|
|
||||||
|
SendUnixTime = UnixTimeStampToDateTime(message.SendDateTime),
|
||||||
|
DeliveryState = DeliveryStatus(message.DeliveryState),
|
||||||
|
DeliveryUnixTime = UnixTimeStampToDateTime(message.DeliveryDateTime),
|
||||||
|
DeliveryColor = DeliveryColorStatus(message.DeliveryState),
|
||||||
|
};
|
||||||
|
res.Add(appendData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
public string DeliveryStatus(byte? dv)
|
public string DeliveryStatus(byte? dv)
|
||||||
{
|
{
|
||||||
string mess = "";
|
string mess = "";
|
||||||
@@ -518,6 +551,31 @@ public class SmsService : ISmsService
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessageForElectronicContract(string number, string fullname, string amount,string code1, string code2)
|
||||||
|
{
|
||||||
|
var tamplateId = 117685;
|
||||||
|
var result = new ValueTuple<byte, string, int, bool>();
|
||||||
|
var smsIr = new SmsIr("Og5M562igmzJRhQPnq0GdtieYdLgtfikjzxOmeQBPxJjZtyge5Klc046Lfw1mxSa");
|
||||||
|
|
||||||
|
var sendResult = await smsIr.VerifySendAsync(number, tamplateId,
|
||||||
|
new VerifySendParameter[]
|
||||||
|
{
|
||||||
|
new("FULLNAME", fullname), new("AMOUNT", amount), new("CODE1", code1), new("CODE2", code2)
|
||||||
|
});
|
||||||
|
Thread.Sleep(500);
|
||||||
|
|
||||||
|
|
||||||
|
if (sendResult.Message == "موفق")
|
||||||
|
{
|
||||||
|
|
||||||
|
result = (sendResult.Status, sendResult.Message, sendResult.Data.MessageId, true);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = (sendResult.Status, sendResult.Message, sendResult.Data.MessageId, false);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using CompanyManagment.App.Contracts.AuthorizedPerson;
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using _0_Framework.Application.UID;
|
using _0_Framework.Application.UID;
|
||||||
using Company.Application.Contracts.AuthorizedBankDetails;
|
using Company.Application.Contracts.AuthorizedBankDetails;
|
||||||
|
using CompanyManagment.App.Contracts.AuthorizedBankDetails;
|
||||||
|
|
||||||
namespace CompanyManagment.EFCore.Services;
|
namespace CompanyManagment.EFCore.Services;
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,9 @@ EndProject
|
|||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BackgroundInstitutionContract.Task", "BackgroundInstitutionContract\BackgroundInstitutionContract.Task\BackgroundInstitutionContract.Task.csproj", "{F78FBB92-294B-88BA-168D-F0C578B0D7D6}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BackgroundInstitutionContract.Task", "BackgroundInstitutionContract\BackgroundInstitutionContract.Task\BackgroundInstitutionContract.Task.csproj", "{F78FBB92-294B-88BA-168D-F0C578B0D7D6}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgramManager", "ProgramManager", "{67AFF7B6-4C4F-464C-A90D-9BDB644D83A9}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgramManager", "ProgramManager", "{67AFF7B6-4C4F-464C-A90D-9BDB644D83A9}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
ProgramManager\appsettings.FileStorage.json = ProgramManager\appsettings.FileStorage.json
|
||||||
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{48F6F6A5-7340-42F8-9216-BEB7A4B7D5A1}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{48F6F6A5-7340-42F8-9216-BEB7A4B7D5A1}"
|
||||||
EndProject
|
EndProject
|
||||||
|
|||||||
5
Directory.Build.props
Normal file
5
Directory.Build.props
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<NuGetAudit>false</NuGetAudit>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -61,6 +61,7 @@ using Company.Domain.HolidayItemAgg;
|
|||||||
using Company.Domain.InstitutionContractAgg;
|
using Company.Domain.InstitutionContractAgg;
|
||||||
using Company.Domain.InstitutionContractContactInfoAgg;
|
using Company.Domain.InstitutionContractContactInfoAgg;
|
||||||
using Company.Domain.InstitutionContractExtensionTempAgg;
|
using Company.Domain.InstitutionContractExtensionTempAgg;
|
||||||
|
using Company.Domain.InstitutionContractSendFlagAgg;
|
||||||
using Company.Domain.InstitutionPlanAgg;
|
using Company.Domain.InstitutionPlanAgg;
|
||||||
using Company.Domain.InsuranceAgg;
|
using Company.Domain.InsuranceAgg;
|
||||||
using Company.Domain.InsuranceEmployeeInfoAgg;
|
using Company.Domain.InsuranceEmployeeInfoAgg;
|
||||||
@@ -123,6 +124,7 @@ using Company.Domain.ZoneAgg;
|
|||||||
using CompanyManagement.Infrastructure.Excel.SalaryAid;
|
using CompanyManagement.Infrastructure.Excel.SalaryAid;
|
||||||
using CompanyManagement.Infrastructure.Mongo.EmployeeFaceEmbeddingRepo;
|
using CompanyManagement.Infrastructure.Mongo.EmployeeFaceEmbeddingRepo;
|
||||||
using CompanyManagement.Infrastructure.Mongo.InstitutionContractInsertTempRepo;
|
using CompanyManagement.Infrastructure.Mongo.InstitutionContractInsertTempRepo;
|
||||||
|
using CompanyManagement.Infrastructure.Mongo.InstitutionContractSendFlagRepo;
|
||||||
using CompanyManagment.App.Contracts.AdminMonthlyOverview;
|
using CompanyManagment.App.Contracts.AdminMonthlyOverview;
|
||||||
using CompanyManagment.App.Contracts.AndroidApkVersion;
|
using CompanyManagment.App.Contracts.AndroidApkVersion;
|
||||||
using CompanyManagment.App.Contracts.AuthorizedPerson;
|
using CompanyManagment.App.Contracts.AuthorizedPerson;
|
||||||
@@ -229,153 +231,16 @@ using CompanyManagment.Application;
|
|||||||
using CompanyManagment.EFCore;
|
using CompanyManagment.EFCore;
|
||||||
using CompanyManagment.EFCore._common;
|
using CompanyManagment.EFCore._common;
|
||||||
using CompanyManagment.EFCore.Repository;
|
using CompanyManagment.EFCore.Repository;
|
||||||
using CompanyManagment.EFCore.Repository;
|
|
||||||
using File.EfCore.Repository;
|
using File.EfCore.Repository;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using P_TextManager.Domin.TextManagerAgg;
|
using P_TextManager.Domin.TextManagerAgg;
|
||||||
using CompanyManagment.App.Contracts.CrossJobItems;
|
using CompanyManagment.App.Contracts.PaymentCallback;
|
||||||
using Company.Domain.CrossJobItemsAgg;
|
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||||
using Company.Domain.DateSalaryAgg;
|
|
||||||
using Company.Domain.DateSalaryItemAgg;
|
|
||||||
using Company.Domain.FinancialStatmentAgg;
|
|
||||||
using Company.Domain.FinancialTransactionAgg;
|
|
||||||
using Company.Domain.GroupPlanAgg;
|
|
||||||
using Company.Domain.GroupPlanJobItemAgg;
|
|
||||||
using Company.Domain.InstitutionContractAgg;
|
|
||||||
using Company.Domain.InstitutionContractContactInfoAgg;
|
|
||||||
using CompanyManagment.App.Contracts.Insurance;
|
|
||||||
using Company.Domain.InsuranceAgg;
|
|
||||||
using Company.Domain.InsuranceEmployeeInfoAgg;
|
|
||||||
using Company.Domain.InsuranceJobItemAgg;
|
|
||||||
using Company.Domain.InsuranceListAgg;
|
|
||||||
using Company.Domain.InsurancJobAgg;
|
|
||||||
using Company.Domain.InsurancWorkshopInfoAgg;
|
|
||||||
using Company.Domain.LeftWorkInsuranceAgg;
|
|
||||||
using Company.Domain.PaymentToEmployeeAgg;
|
|
||||||
using Company.Domain.PaymentToEmployeeItemAgg;
|
|
||||||
using Company.Domain.PercentageAgg;
|
|
||||||
using Company.Domain.PersonnelCodeAgg;
|
|
||||||
using Company.Domain.SmsResultAgg;
|
|
||||||
using Company.Domain.WorkingHoursTempAgg;
|
|
||||||
using Company.Domain.WorkingHoursTempItemAgg;
|
|
||||||
using Company.Domain.WorkshopPlanAgg;
|
|
||||||
using Company.Domain.WorkshopPlanEmployeeAgg;
|
|
||||||
using Company.Domain.ZoneAgg;
|
|
||||||
using CompanyManagment.App.Contracts.ClassifiedSalary;
|
|
||||||
using CompanyManagment.App.Contracts.DateSalary;
|
|
||||||
using CompanyManagment.App.Contracts.DateSalaryItem;
|
|
||||||
using CompanyManagment.App.Contracts.EmployeeInsurancListData;
|
|
||||||
using CompanyManagment.App.Contracts.FinancialStatment;
|
|
||||||
using CompanyManagment.App.Contracts.FinancilTransaction;
|
|
||||||
using CompanyManagment.App.Contracts.InstitutionContract;
|
|
||||||
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
|
|
||||||
using CompanyManagment.App.Contracts.InsuranceEmployeeInfo;
|
|
||||||
using CompanyManagment.App.Contracts.InsuranceJob;
|
|
||||||
using CompanyManagment.App.Contracts.InsuranceList;
|
|
||||||
using CompanyManagment.App.Contracts.InsuranceWorkshopInfo;
|
|
||||||
using CompanyManagment.App.Contracts.LeftWorkInsurance;
|
|
||||||
using CompanyManagment.App.Contracts.PaymentToEmployee;
|
|
||||||
using CompanyManagment.App.Contracts.Percentage;
|
|
||||||
using CompanyManagment.App.Contracts.PersonnleCode;
|
|
||||||
using CompanyManagment.App.Contracts.SmsResult;
|
|
||||||
using CompanyManagment.App.Contracts.WorkingHoursTemp;
|
|
||||||
using CompanyManagment.App.Contracts.WorkingHoursTempItem;
|
|
||||||
using CompanyManagment.App.Contracts.WorkshopPlan;
|
|
||||||
using CompanyManagment.App.Contracts.Zone;
|
|
||||||
using CompanyManagment.App.Contracts.EmployeeComputeOptions;
|
|
||||||
using Company.Domain.EmployeeComputeOptionsAgg;
|
|
||||||
using Company.Domain.InsuranceYearlySalaryAgg;
|
|
||||||
using Company.Domain.ReportAgg;
|
|
||||||
using Company.Domain.RollCallAgg;
|
|
||||||
using Company.Domain.RollCallEmployeeAgg;
|
|
||||||
using Company.Domain.RollCallPlanAgg;
|
|
||||||
using Company.Domain.RollCallServiceAgg;
|
|
||||||
using CompanyManagment.App.Contracts.InsuranceYearlySalary;
|
|
||||||
using CompanyManagment.App.Contracts.Report;
|
|
||||||
using CompanyManagment.App.Contracts.RollCall;
|
|
||||||
using CompanyManagment.App.Contracts.RollCallEmployee;
|
|
||||||
using CompanyManagment.App.Contracts.RollCallService;
|
|
||||||
using CompanyManagment.App.Contracts.RollCallPlan;
|
|
||||||
using Company.Domain.ReportClientAgg;
|
|
||||||
using Company.Domain.TaxJobCategoryAgg;
|
|
||||||
using Company.Domain.WorkshopAccountAgg;
|
|
||||||
using CompanyManagment.App.Contracts.ReportClient;
|
|
||||||
using CompanyManagment.App.Contracts.TaxJobCategory;
|
|
||||||
using Company.Domain.RollCallEmployeeStatusAgg;
|
|
||||||
using CompanyManagment.App.Contracts.RollCallEmployeeStatus;
|
|
||||||
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg;
|
|
||||||
using Company.Domain.CustomizeWorkshopGroupSettingsAgg;
|
|
||||||
using Company.Domain.CustomizeWorkshopSettingsAgg;
|
|
||||||
using Company.Domain.FineAgg;
|
|
||||||
using Company.Domain.LoanAgg;
|
|
||||||
using Company.Domain.RewardAgg;
|
|
||||||
using Company.Domain.SalaryAidAgg;
|
|
||||||
using CompanyManagment.App.Contracts.CustomizeWorkshopSettings;
|
|
||||||
using CompanyManagment.App.Contracts.Fine;
|
|
||||||
using CompanyManagment.App.Contracts.Loan;
|
|
||||||
using CompanyManagment.App.Contracts.Reward;
|
|
||||||
using CompanyManagment.App.Contracts.SalaryAid;
|
|
||||||
using Company.Domain.AndroidApkVersionAgg;
|
|
||||||
using Company.Domain.BankAgg;
|
|
||||||
using CompanyManagment.App.Contracts.AndroidApkVersion;
|
|
||||||
using Company.Domain.FineSubjectAgg;
|
|
||||||
using CompanyManagment.App.Contracts.FineSubject;
|
|
||||||
using Company.Domain.CustomizeCheckoutAgg;
|
|
||||||
using CompanyManagment.App.Contracts.CustomizeCheckout;
|
|
||||||
using Company.Domain.WorkshopSubAccountAgg;
|
|
||||||
using Company.Domain.CustomizeCheckoutTempAgg;
|
|
||||||
using Company.Domain.EmployeeBankInformationAgg;
|
|
||||||
using Company.Domain.RollCallAgg.DomainService;
|
|
||||||
using CompanyManagment.App.Contracts.Bank;
|
|
||||||
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
|
||||||
using Company.Domain.EmployeeDocumentItemAgg;
|
|
||||||
using Company.Domain.EmployeeDocumentsAdminSelectionAgg;
|
|
||||||
using Company.Domain.EmployeeDocumentsAgg;
|
|
||||||
using CompanyManagement.Infrastructure.Excel.SalaryAid;
|
|
||||||
using CompanyManagment.App.Contracts.EmployeeDocuments;
|
|
||||||
using CompanyManagment.App.Contracts.EmployeeDocumentsAdminSelection;
|
|
||||||
using Company.Domain.EmployeeClientTempAgg;
|
|
||||||
using Company.Domain.InstitutionPlanAgg;
|
|
||||||
using Company.Domain.LeftWorkTempAgg;
|
|
||||||
using Company.Domain.TemporaryClientRegistrationAgg;
|
|
||||||
using CompanyManagment.App.Contracts.EmployeeClientTemp;
|
|
||||||
using CompanyManagment.App.Contracts.InstitutionPlan;
|
|
||||||
using CompanyManagment.App.Contracts.LeftWorkTemp;
|
|
||||||
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
|
||||||
using Company.Domain.ContactUsAgg;
|
|
||||||
using CompanyManagment.App.Contracts.ContactUs;
|
|
||||||
using Company.Domain.EmployeeAuthorizeTempAgg;
|
|
||||||
using Company.Domain.AdminMonthlyOverviewAgg;
|
|
||||||
using Company.Domain.AuthorizedBankDetailsAgg;
|
|
||||||
using Company.Domain.ContractingPartyBankAccountsAgg;
|
|
||||||
using Company.Domain.PaymentInstrumentAgg;
|
|
||||||
using Company.Domain.PaymentTransactionAgg;
|
|
||||||
using Company.Domain.FinancialInvoiceAgg;
|
|
||||||
using CompanyManagment.App.Contracts.AdminMonthlyOverview;
|
|
||||||
using CompanyManagment.App.Contracts.ContractingPartyBankAccounts;
|
|
||||||
using CompanyManagment.App.Contracts.PaymentInstrument;
|
|
||||||
using CompanyManagment.App.Contracts.PaymentTransaction;
|
|
||||||
using CompanyManagment.App.Contracts.AuthorizedPerson;
|
|
||||||
using Company.Domain.AuthorizedPersonAgg;
|
|
||||||
using Company.Domain.EmployeeFaceEmbeddingAgg;
|
|
||||||
using Company.Domain.InstitutionContractExtensionTempAgg;
|
|
||||||
using Company.Domain.LawAgg;
|
|
||||||
using CompanyManagement.Infrastructure.Mongo.EmployeeFaceEmbeddingRepo;
|
|
||||||
using CompanyManagement.Infrastructure.Mongo.InstitutionContractInsertTempRepo;
|
|
||||||
using CompanyManagment.App.Contracts.EmployeeFaceEmbedding;
|
|
||||||
using CompanyManagment.App.Contracts.Law;
|
|
||||||
using CompanyManagment.EFCore.Repository;
|
|
||||||
using CompanyManagment.App.Contracts.FinancialInvoice;
|
|
||||||
using _0_Framework.Application.FaceEmbedding;
|
|
||||||
using _0_Framework.Infrastructure;
|
|
||||||
using _0_Framework.InfraStructure;
|
|
||||||
using Company.Domain.CameraBugReportAgg;
|
using Company.Domain.CameraBugReportAgg;
|
||||||
|
using CompanyManagment.App.Contracts.AuthorizedBankDetails;
|
||||||
using CompanyManagment.App.Contracts.CameraBugReport;
|
using CompanyManagment.App.Contracts.CameraBugReport;
|
||||||
using CompanyManagement.Infrastructure.Mongo.CameraBugReportRepo;
|
|
||||||
using CameraBugReportRepository = CompanyManagement.Infrastructure.Mongo.CameraBugReportRepo.CameraBugReportRepository;
|
using CameraBugReportRepository = CompanyManagement.Infrastructure.Mongo.CameraBugReportRepo.CameraBugReportRepository;
|
||||||
using Company.Domain._common;
|
|
||||||
using CompanyManagment.EFCore._common;
|
|
||||||
using CompanyManagment.EFCore.Services;
|
using CompanyManagment.EFCore.Services;
|
||||||
using Shared.Contracts.Holidays;
|
using Shared.Contracts.Holidays;
|
||||||
|
|
||||||
@@ -622,6 +487,8 @@ public class PersonalBootstrapper
|
|||||||
|
|
||||||
services.AddTransient<IPaymentTransactionRepository, PaymentTransactionRepository>();
|
services.AddTransient<IPaymentTransactionRepository, PaymentTransactionRepository>();
|
||||||
services.AddTransient<IPaymentTransactionApplication, PaymentTransactionApplication>();
|
services.AddTransient<IPaymentTransactionApplication, PaymentTransactionApplication>();
|
||||||
|
services.AddTransient<IPaymentCallbackHandler, PaymentCallbackHandler>();
|
||||||
|
services.AddTransient<ISepehrPaymentGatewayService, SepehrPaymentGatewayService>();
|
||||||
|
|
||||||
services.AddTransient<IContractingPartyBankAccountsApplication, ContractingPartyBankAccountsApplication>();
|
services.AddTransient<IContractingPartyBankAccountsApplication, ContractingPartyBankAccountsApplication>();
|
||||||
services.AddTransient<IContractingPartyBankAccountsRepository, ContractingPartyBankAccountsRepository>();
|
services.AddTransient<IContractingPartyBankAccountsRepository, ContractingPartyBankAccountsRepository>();
|
||||||
@@ -696,6 +563,7 @@ public class PersonalBootstrapper
|
|||||||
services.AddTransient<ISmsSettingsRepository, SmsSettingsRepository>();
|
services.AddTransient<ISmsSettingsRepository, SmsSettingsRepository>();
|
||||||
services.AddTransient<ISmsSettingApplication, SmsSettingApplication>();
|
services.AddTransient<ISmsSettingApplication, SmsSettingApplication>();
|
||||||
|
|
||||||
|
services.AddTransient<IInstitutionContractSmsServiceRepository, InstitutionContractSmsServiceRepository>();
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
@@ -793,6 +661,9 @@ public class PersonalBootstrapper
|
|||||||
services.AddTransient<ICameraBugReportApplication, CameraBugReportApplication>();
|
services.AddTransient<ICameraBugReportApplication, CameraBugReportApplication>();
|
||||||
services.AddTransient<ICameraBugReportRepository, CameraBugReportRepository>(); // MongoDB Implementation
|
services.AddTransient<ICameraBugReportRepository, CameraBugReportRepository>(); // MongoDB Implementation
|
||||||
|
|
||||||
|
// InstitutionContractSendFlag - MongoDB
|
||||||
|
services.AddTransient<IInstitutionContractSendFlagRepository, InstitutionContractSendFlagRepository>();
|
||||||
|
|
||||||
services.AddDbContext<CompanyContext>(x => x.UseSqlServer(connectionString));
|
services.AddDbContext<CompanyContext>(x => x.UseSqlServer(connectionString));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FluentValidation" Version="12.1.1" />
|
<PackageReference Include="FluentValidation" Version="12.1.1" />
|
||||||
<PackageReference Include="MediatR" Version="14.0.0" />
|
<PackageReference Include="MediatR" Version="14.0.0" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -18,4 +19,10 @@
|
|||||||
<ProjectReference Include="..\..\Domain\GozareshgirProgramManager.Domain\GozareshgirProgramManager.Domain.csproj" />
|
<ProjectReference Include="..\..\Domain\GozareshgirProgramManager.Domain\GozareshgirProgramManager.Domain.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Http.Features">
|
||||||
|
<HintPath>C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\10.0.1\Microsoft.AspNetCore.Http.Features.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -209,22 +209,38 @@ public class CreateOrEditCheckoutCommandHandler : IBaseCommandHandler<CreateOrEd
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//حقوق نهایی
|
////حقوق نهایی
|
||||||
var monthlySalaryPay = (totalHoursWorked * monthlySalaryDefined) / mandatoryHours;
|
//var monthlySalaryPay = (totalHoursWorked * monthlySalaryDefined) / mandatoryHours;
|
||||||
// اگر اضافه کار داشت حقوق تعین شده به عنوان حقوق نهایی در نظر گرفته میشود
|
//// اگر اضافه کار داشت حقوق تعین شده به عنوان حقوق نهایی در نظر گرفته میشود
|
||||||
monthlySalaryPay = monthlySalaryPay > monthlySalaryDefined ? monthlySalaryDefined : monthlySalaryPay;
|
//monthlySalaryPay = monthlySalaryPay > monthlySalaryDefined ? monthlySalaryDefined : monthlySalaryPay;
|
||||||
|
|
||||||
//حقوق کسر شده
|
////حقوق کسر شده
|
||||||
var deductionFromSalary = monthlySalaryDefined - monthlySalaryPay;
|
//var deductionFromSalary = monthlySalaryDefined - monthlySalaryPay;
|
||||||
|
|
||||||
|
//new chang salary compute
|
||||||
|
var monthlySalaryPay = totalHoursWorked * monthlySalaryDefined;
|
||||||
|
|
||||||
//زمان باقی مانده
|
//زمان باقی مانده
|
||||||
var remainingTime = totalHoursWorked - mandatoryHours;
|
var remainingTime = totalHoursWorked - mandatoryHours;
|
||||||
|
|
||||||
|
|
||||||
|
//تناسب به دقیقه
|
||||||
|
#region MyRegion
|
||||||
|
|
||||||
|
//var monthlySalaryDefinedTest = monthlySalaryDefined * mandatoryHours;
|
||||||
|
//var monthlySalaryPayTest = totalHoursWorked * monthlySalaryDefined;
|
||||||
|
////// اگر اضافه کار داشت حقوق تعین شده به عنوان حقوق نهایی در نظر گرفته میشود
|
||||||
|
//monthlySalaryPayTest = monthlySalaryPayTest > monthlySalaryDefinedTest ? monthlySalaryDefinedTest : monthlySalaryPayTest;
|
||||||
|
//////حقوق کسر شده
|
||||||
|
//var deductionFromSalaryTest = monthlySalaryDefinedTest - monthlySalaryPayTest;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
var computeResult = new ComputeResultDto
|
var computeResult = new ComputeResultDto
|
||||||
{
|
{
|
||||||
MandatoryHours = mandatoryHours,
|
MandatoryHours = mandatoryHours,
|
||||||
MonthlySalaryPay = monthlySalaryPay,
|
MonthlySalaryPay = monthlySalaryPay,
|
||||||
DeductionFromSalary = deductionFromSalary,
|
DeductionFromSalary = 0 /*deductionFromSalary*/,
|
||||||
RemainingHours = remainingTime
|
RemainingHours = remainingTime
|
||||||
};
|
};
|
||||||
Console.WriteLine(mandatoryHours);
|
Console.WriteLine(mandatoryHours);
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
using GozareshgirProgramManager.Application._Common.Interfaces;
|
using DNTPersianUtils.Core;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
using GozareshgirProgramManager.Application._Common.Models;
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetUserListWhoHaveSettings;
|
using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetUserListWhoHaveSettings;
|
||||||
using GozareshgirProgramManager.Domain._Common;
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
using GozareshgirProgramManager.Domain.CheckoutAgg.Enums;
|
using GozareshgirProgramManager.Domain.CheckoutAgg.Enums;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using PersianTools.Core;
|
using PersianDateTime = PersianTools.Core.PersianDateTime;
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Checkouts.Queries.GetUserToGropCreate;
|
namespace GozareshgirProgramManager.Application.Modules.Checkouts.Queries.GetUserToGropCreate;
|
||||||
|
|
||||||
@@ -45,8 +46,8 @@ public class GetUserToGroupCreatingQueryHandler : IBaseQueryHandler<GetUserToGro
|
|||||||
"ایجاد فیش فقط برای ماه های گذشته امکان پذیر است");
|
"ایجاد فیش فقط برای ماه های گذشته امکان پذیر است");
|
||||||
|
|
||||||
|
|
||||||
var lastMonthStart = lastMonth;
|
//var lastMonthStart = lastMonth;
|
||||||
var lastMonthEnd = lastMonth;
|
var lastMonthEnd = ((selectedDate.ToFarsi().FindeEndOfMonth())).ToGeorgianDateTime();
|
||||||
|
|
||||||
var query =
|
var query =
|
||||||
await (from u in _context.Users
|
await (from u in _context.Users
|
||||||
@@ -60,8 +61,8 @@ public class GetUserToGroupCreatingQueryHandler : IBaseQueryHandler<GetUserToGro
|
|||||||
// LEFT JOIN
|
// LEFT JOIN
|
||||||
//فیش
|
//فیش
|
||||||
join ch in _context.Checkouts
|
join ch in _context.Checkouts
|
||||||
.Where(x => x.CheckoutStartDate < lastMonthStart
|
.Where(x => x.CheckoutStartDate < lastMonthEnd
|
||||||
&& x.CheckoutEndDate >= lastMonthStart)
|
&& x.CheckoutEndDate > selectedDate)
|
||||||
on u.Id equals ch.UserId into chJoin
|
on u.Id equals ch.UserId into chJoin
|
||||||
from ch in chJoin.DefaultIfEmpty()
|
from ch in chJoin.DefaultIfEmpty()
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
using GozareshgirProgramManager.Application._Common.Interfaces;
|
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AddTaskToPhase;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Command to add a task to an existing phase
|
|
||||||
/// </summary>
|
|
||||||
public record AddTaskToPhaseCommand(
|
|
||||||
Guid PhaseId,
|
|
||||||
string Name,
|
|
||||||
string? Description = null,
|
|
||||||
TaskPriority Priority = TaskPriority.Medium,
|
|
||||||
int OrderIndex = 0,
|
|
||||||
DateTime? DueDate = null
|
|
||||||
) : IBaseCommand;
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
using GozareshgirProgramManager.Application._Common.Interfaces;
|
|
||||||
using GozareshgirProgramManager.Application._Common.Models;
|
|
||||||
using GozareshgirProgramManager.Domain._Common;
|
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
|
||||||
using MediatR;
|
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AddTaskToPhase;
|
|
||||||
|
|
||||||
public class AddTaskToPhaseCommandHandler : IRequestHandler<AddTaskToPhaseCommand, OperationResult>
|
|
||||||
{
|
|
||||||
private readonly IProjectPhaseRepository _phaseRepository;
|
|
||||||
private readonly IUnitOfWork _unitOfWork;
|
|
||||||
|
|
||||||
public AddTaskToPhaseCommandHandler(
|
|
||||||
IProjectPhaseRepository phaseRepository,
|
|
||||||
IUnitOfWork unitOfWork)
|
|
||||||
{
|
|
||||||
_phaseRepository = phaseRepository;
|
|
||||||
_unitOfWork = unitOfWork;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<OperationResult> Handle(AddTaskToPhaseCommand request, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Get phase
|
|
||||||
var phase = await _phaseRepository.GetByIdAsync(request.PhaseId);
|
|
||||||
if (phase == null)
|
|
||||||
{
|
|
||||||
return OperationResult.NotFound("فاز یافت نشد");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add task
|
|
||||||
var task = phase.AddTask(request.Name, request.Description);
|
|
||||||
task.SetPriority(request.Priority);
|
|
||||||
task.SetOrderIndex(request.OrderIndex);
|
|
||||||
|
|
||||||
if (request.DueDate.HasValue)
|
|
||||||
{
|
|
||||||
task.SetDates(dueDate: request.DueDate);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save changes
|
|
||||||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
|
||||||
|
|
||||||
return OperationResult.Success();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return OperationResult.Failure($"خطا در افزودن تسک: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
|
using GozareshgirProgramManager.Domain._Common.Exceptions;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.ApproveTaskSectionCompletion;
|
||||||
|
|
||||||
|
public record ApproveTaskSectionCompletionCommand(Guid TaskSectionId, bool IsApproved) : IBaseCommand;
|
||||||
|
|
||||||
|
public class ApproveTaskSectionCompletionCommandHandler : IBaseCommandHandler<ApproveTaskSectionCompletionCommand>
|
||||||
|
{
|
||||||
|
private readonly ITaskSectionRepository _taskSectionRepository;
|
||||||
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
private readonly IAuthHelper _authHelper;
|
||||||
|
|
||||||
|
public ApproveTaskSectionCompletionCommandHandler(
|
||||||
|
ITaskSectionRepository taskSectionRepository,
|
||||||
|
IUnitOfWork unitOfWork,
|
||||||
|
IAuthHelper authHelper)
|
||||||
|
{
|
||||||
|
_taskSectionRepository = taskSectionRepository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
_authHelper = authHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> Handle(ApproveTaskSectionCompletionCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var currentUserId = _authHelper.GetCurrentUserId()
|
||||||
|
?? throw new UnAuthorizedException("˜ÇÑÈÑ ÇÍÑÇÒ åæ?Ê äÔÏå ÇÓÊ");
|
||||||
|
|
||||||
|
var section = await _taskSectionRepository.GetByIdAsync(request.TaskSectionId, cancellationToken);
|
||||||
|
if (section == null)
|
||||||
|
{
|
||||||
|
return OperationResult.NotFound("ÈÎÔ ãæÑÏ äÙÑ ?ÇÝÊ äÔÏ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (section.Status != TaskSectionStatus.PendingForCompletion)
|
||||||
|
{
|
||||||
|
return OperationResult.Failure("ÝÞØ ÈÎÔ<C38E>åÇ?? ˜å ÏÑ ÇäÊÙÇÑ Ê˜ã?á åÓÊäÏ ÞÇÈá ÊÇ??Ï ?Ç ÑÏ åÓÊäÏ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.IsApproved)
|
||||||
|
{
|
||||||
|
section.UpdateStatus(TaskSectionStatus.Completed);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
section.UpdateStatus(TaskSectionStatus.Incomplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.ApproveTaskSectionCompletion;
|
||||||
|
|
||||||
|
public class ApproveTaskSectionCompletionCommandValidator : AbstractValidator<ApproveTaskSectionCompletionCommand>
|
||||||
|
{
|
||||||
|
public ApproveTaskSectionCompletionCommandValidator()
|
||||||
|
{
|
||||||
|
RuleFor(c => c.TaskSectionId)
|
||||||
|
.NotEmpty()
|
||||||
|
.NotNull()
|
||||||
|
.WithMessage("ÔäÇÓå ÈÎÔ äã?<3F>ÊæÇäÏ ÎÇá? ÈÇÔÏ");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,9 @@ using GozareshgirProgramManager.Application._Common.Interfaces;
|
|||||||
using GozareshgirProgramManager.Application._Common.Models;
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
using GozareshgirProgramManager.Domain._Common;
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
using GozareshgirProgramManager.Domain.SkillAgg.Repositories;
|
using GozareshgirProgramManager.Domain.SkillAgg.Repositories;
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoPendingFullTimeTaskSections;
|
||||||
|
|
||||||
|
public record AutoPendingFullTimeTaskSectionsCommand : IBaseCommand;
|
||||||
|
|
||||||
|
public class AutoPendingFullTimeTaskSectionsCommandHandler : IBaseCommandHandler<AutoPendingFullTimeTaskSectionsCommand>
|
||||||
|
{
|
||||||
|
private readonly ITaskSectionRepository _taskSectionRepository;
|
||||||
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
public AutoPendingFullTimeTaskSectionsCommandHandler(
|
||||||
|
ITaskSectionRepository taskSectionRepository,
|
||||||
|
IUnitOfWork unitOfWork)
|
||||||
|
{
|
||||||
|
_taskSectionRepository = taskSectionRepository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> Handle(AutoPendingFullTimeTaskSectionsCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// تمام سکشنهایی که هنوز Pending یا Completed نشدهاند را دریافت کن
|
||||||
|
var taskSections = await _taskSectionRepository.GetAllNotCompletedOrPendingIncludeAllAsync(cancellationToken);
|
||||||
|
|
||||||
|
foreach (var section in taskSections)
|
||||||
|
{
|
||||||
|
var totalSpent = section.GetTotalTimeSpent();
|
||||||
|
var estimate = section.FinalEstimatedHours;
|
||||||
|
|
||||||
|
if (estimate.TotalMinutes <= 0)
|
||||||
|
continue; // تسک بدون تخمین را نادیده بگیر
|
||||||
|
|
||||||
|
if (totalSpent >= estimate)
|
||||||
|
{
|
||||||
|
// مهم: وضعیت را مستقل از فعال/غیرفعال بودن فعالیتها PendingForCompletion کنیم
|
||||||
|
if (section.IsInProgress())
|
||||||
|
{
|
||||||
|
// اگر فعالیت فعال دارد، با وضعیت جدید متوقف شود
|
||||||
|
section.StopWork(TaskSectionStatus.PendingForCompletion, "اتمام خودکار - رسیدن به ۱۰۰٪ زمان تخمینی");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
section.UpdateStatus(TaskSectionStatus.PendingForCompletion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return OperationResult.Failure($"خطا در در انتظار تکمیل قرار دادن خودکار تسکها: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.AutoUpdateDeployStatus;
|
||||||
|
|
||||||
|
public record AutoUpdateDeployStatusCommand : IBaseCommand;
|
||||||
|
|
||||||
|
public class AutoUpdateDeployStatusCommandHandler : IBaseCommandHandler<AutoUpdateDeployStatusCommand>
|
||||||
|
{
|
||||||
|
private readonly IProgramManagerDbContext _dbContext;
|
||||||
|
|
||||||
|
public AutoUpdateDeployStatusCommandHandler(IProgramManagerDbContext dbContext)
|
||||||
|
{
|
||||||
|
_dbContext = dbContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> Handle(AutoUpdateDeployStatusCommand request,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
// Fetch all sections whose phase is still marked as not completed
|
||||||
|
var sections = await _dbContext.TaskSections
|
||||||
|
.Include(ts => ts.Task)
|
||||||
|
.ThenInclude(t => t.Phase)
|
||||||
|
.Where(ts => ts.Task.Phase.DeployStatus == ProjectDeployStatus.NotCompleted)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
if (sections.Count == 0)
|
||||||
|
return OperationResult.Success();
|
||||||
|
|
||||||
|
var phasesToUpdate = sections
|
||||||
|
.GroupBy(ts => ts.Task.PhaseId)
|
||||||
|
.Where(g => g.All(s => s.Status == TaskSectionStatus.Completed))
|
||||||
|
.Select(g => g.First().Task.Phase)
|
||||||
|
.Distinct()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (phasesToUpdate.Count == 0)
|
||||||
|
return OperationResult.Success();
|
||||||
|
|
||||||
|
foreach (var phase in phasesToUpdate)
|
||||||
|
{
|
||||||
|
phase.UpdateDeployStatus(ProjectDeployStatus.PendingDevDeploy);
|
||||||
|
}
|
||||||
|
|
||||||
|
await _dbContext.SaveChangesAsync(cancellationToken);
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.ChangeDeployStatusProject;
|
||||||
|
|
||||||
|
public record ChangeDeployStatusProjectCommand(Guid PhaseId, ProjectDeployStatus Status):IBaseCommand;
|
||||||
|
|
||||||
|
public class ChangeDeployStatusProjectCommandHandler : IBaseCommandHandler<ChangeDeployStatusProjectCommand>
|
||||||
|
{
|
||||||
|
private readonly IProjectRepository _projectRepository;
|
||||||
|
private readonly IProjectPhaseRepository _projectPhaseRepository;
|
||||||
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
public ChangeDeployStatusProjectCommandHandler(IProjectRepository projectRepository, IUnitOfWork unitOfWork, IProjectPhaseRepository projectPhaseRepository)
|
||||||
|
{
|
||||||
|
_projectRepository = projectRepository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
_projectPhaseRepository = projectPhaseRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> Handle(ChangeDeployStatusProjectCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var project = await _projectPhaseRepository.GetByIdAsync(request.PhaseId, cancellationToken);
|
||||||
|
if (project == null)
|
||||||
|
return OperationResult.NotFound("بخش مورد نظر یافت نشد");
|
||||||
|
|
||||||
|
if (project.DeployStatus == ProjectDeployStatus.NotCompleted)
|
||||||
|
{
|
||||||
|
return OperationResult.Failure("وضعیت استقرار نمیتواند از حالت 'تایید نشده' تغییر کند.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.Status == ProjectDeployStatus.NotCompleted)
|
||||||
|
{
|
||||||
|
return OperationResult.Failure("وضعیت استقرار نمیتواند به حالت 'تایید نشده' تغییر کند.");
|
||||||
|
}
|
||||||
|
project.UpdateDeployStatus(request.Status);
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -52,7 +52,10 @@ public class ChangeStatusSectionCommandHandler : IBaseCommandHandler<ChangeStatu
|
|||||||
// Going TO InProgress: Check if section has remaining time, then start work
|
// Going TO InProgress: Check if section has remaining time, then start work
|
||||||
if (!section.HasRemainingTime())
|
if (!section.HasRemainingTime())
|
||||||
return OperationResult.ValidationError("زمان این بخش به پایان رسیده است");
|
return OperationResult.ValidationError("زمان این بخش به پایان رسیده است");
|
||||||
|
if (await _taskSectionRepository.HasUserAnyInProgressSectionAsync(section.CurrentAssignedUserId, cancellationToken))
|
||||||
|
{
|
||||||
|
return OperationResult.ValidationError("کاربر مورد نظر در حال حاضر بخش دیگری را در وضعیت 'درحال انجام' دارد");
|
||||||
|
}
|
||||||
section.StartWork();
|
section.StartWork();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -86,9 +89,9 @@ public class ChangeStatusSectionCommandHandler : IBaseCommandHandler<ChangeStatu
|
|||||||
var validTransitions = new Dictionary<TaskSectionStatus, List<TaskSectionStatus>>
|
var validTransitions = new Dictionary<TaskSectionStatus, List<TaskSectionStatus>>
|
||||||
{
|
{
|
||||||
{ TaskSectionStatus.ReadyToStart, [TaskSectionStatus.InProgress] },
|
{ TaskSectionStatus.ReadyToStart, [TaskSectionStatus.InProgress] },
|
||||||
{ TaskSectionStatus.InProgress, [TaskSectionStatus.Incomplete, TaskSectionStatus.Completed] },
|
{ TaskSectionStatus.InProgress, [TaskSectionStatus.Incomplete, TaskSectionStatus.PendingForCompletion] },
|
||||||
{ TaskSectionStatus.Incomplete, [TaskSectionStatus.InProgress, TaskSectionStatus.Completed] },
|
{ TaskSectionStatus.Incomplete, [TaskSectionStatus.InProgress, TaskSectionStatus.PendingForCompletion] },
|
||||||
{ TaskSectionStatus.Completed, [TaskSectionStatus.InProgress, TaskSectionStatus.Incomplete] }, // Can return to InProgress or Incomplete
|
{ TaskSectionStatus.PendingForCompletion, [TaskSectionStatus.InProgress, TaskSectionStatus.Incomplete] }, // Can return to InProgress or Incomplete
|
||||||
{ TaskSectionStatus.NotAssigned, [TaskSectionStatus.InProgress, TaskSectionStatus.ReadyToStart] }
|
{ TaskSectionStatus.NotAssigned, [TaskSectionStatus.InProgress, TaskSectionStatus.ReadyToStart] }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.ChangeTaskPriority;
|
||||||
|
|
||||||
|
public record ChangeTaskPriorityCommand(
|
||||||
|
Guid Id,
|
||||||
|
ProjectHierarchyLevel Level,
|
||||||
|
ProjectTaskPriority Priority
|
||||||
|
) : IBaseCommand;
|
||||||
|
|
||||||
|
public class ChangeTaskPriorityCommandHandler : IBaseCommandHandler<ChangeTaskPriorityCommand>
|
||||||
|
{
|
||||||
|
private readonly IProjectTaskRepository _taskRepository;
|
||||||
|
private readonly IProjectPhaseRepository _phaseRepository;
|
||||||
|
private readonly IProjectRepository _projectRepository;
|
||||||
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
public ChangeTaskPriorityCommandHandler(
|
||||||
|
IProjectTaskRepository taskRepository,
|
||||||
|
IProjectPhaseRepository phaseRepository,
|
||||||
|
IProjectRepository projectRepository,
|
||||||
|
IUnitOfWork unitOfWork)
|
||||||
|
{
|
||||||
|
_taskRepository = taskRepository;
|
||||||
|
_phaseRepository = phaseRepository;
|
||||||
|
_projectRepository = projectRepository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> Handle(ChangeTaskPriorityCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
switch (request.Level)
|
||||||
|
{
|
||||||
|
case ProjectHierarchyLevel.Task:
|
||||||
|
return await HandleTaskLevelAsync(request.Id, request.Priority, cancellationToken);
|
||||||
|
case ProjectHierarchyLevel.Phase:
|
||||||
|
return await HandlePhaseLevelAsync(request.Id, request.Priority, cancellationToken);
|
||||||
|
case ProjectHierarchyLevel.Project:
|
||||||
|
return await HandleProjectLevelAsync(request.Id, request.Priority, cancellationToken);
|
||||||
|
default:
|
||||||
|
return OperationResult.Failure("سطح نامعتبر است");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Task-level priority update
|
||||||
|
private async Task<OperationResult> HandleTaskLevelAsync(Guid taskId, ProjectTaskPriority priority, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var task = await _taskRepository.GetByIdAsync(taskId, ct);
|
||||||
|
if (task is null)
|
||||||
|
return OperationResult.NotFound("تسک یافت نشد");
|
||||||
|
|
||||||
|
if (task.Priority != priority)
|
||||||
|
{
|
||||||
|
task.SetPriority(priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(ct);
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Phase-level bulk priority update
|
||||||
|
private async Task<OperationResult> HandlePhaseLevelAsync(Guid phaseId, ProjectTaskPriority priority, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var phase = await _phaseRepository.GetWithTasksAsync(phaseId);
|
||||||
|
if (phase is null)
|
||||||
|
return OperationResult.NotFound("فاز یافت نشد");
|
||||||
|
|
||||||
|
var tasks = phase.Tasks?.ToList() ?? new List<ProjectTask>();
|
||||||
|
foreach (var t in tasks)
|
||||||
|
{
|
||||||
|
if (t.Priority != priority)
|
||||||
|
{
|
||||||
|
t.SetPriority(priority);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(ct);
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Project-level bulk priority update across all phases
|
||||||
|
private async Task<OperationResult> HandleProjectLevelAsync(Guid projectId, ProjectTaskPriority priority, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var project = await _projectRepository.GetWithFullHierarchyAsync(projectId);
|
||||||
|
if (project is null)
|
||||||
|
return OperationResult.NotFound("پروژه یافت نشد");
|
||||||
|
|
||||||
|
var phases = project.Phases?.ToList() ?? new List<ProjectPhase>();
|
||||||
|
foreach (var phase in phases)
|
||||||
|
{
|
||||||
|
var tasks = phase.Tasks?.ToList() ?? new List<ProjectTask>();
|
||||||
|
foreach (var t in tasks)
|
||||||
|
{
|
||||||
|
if (t.Priority != priority)
|
||||||
|
{
|
||||||
|
t.SetPriority(priority);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(ct);
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Application.Modules.TaskChat.DTOs;
|
||||||
|
using GozareshgirProgramManager.Application.Services.FileManagement;
|
||||||
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
|
using GozareshgirProgramManager.Domain._Common.Exceptions;
|
||||||
|
using GozareshgirProgramManager.Domain.FileManagementAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.FileManagementAgg.Enums;
|
||||||
|
using GozareshgirProgramManager.Domain.FileManagementAgg.Repositories;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateBugSection;
|
||||||
|
|
||||||
|
public class CreateBugSectionCommandHandler : IBaseCommandHandler<CreateBugSectionCommand>
|
||||||
|
{
|
||||||
|
readonly IUnitOfWork _unitOfWork;
|
||||||
|
readonly IBugSectionRepository _bugSectionRepository;
|
||||||
|
readonly IFileUploadService _fileUploadService;
|
||||||
|
private readonly IAuthHelper _authHelper;
|
||||||
|
|
||||||
|
public CreateBugSectionCommandHandler(IUnitOfWork unitOfWork, IBugSectionRepository bugSectionRepository,
|
||||||
|
IAuthHelper authHelper, IFileUploadService fileUploadService)
|
||||||
|
{
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
_bugSectionRepository = bugSectionRepository;
|
||||||
|
|
||||||
|
_authHelper = authHelper;
|
||||||
|
_fileUploadService = fileUploadService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> Handle(CreateBugSectionCommand request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var currentUserId = _authHelper.GetCurrentUserId()
|
||||||
|
?? throw new UnAuthorizedException("کاربر احراز هویت نشده است");
|
||||||
|
|
||||||
|
#region Validation
|
||||||
|
if (_bugSectionRepository.Exists(x => x.TaskId == request.TaskId))
|
||||||
|
return OperationResult.Failure("برای این بخش قبلا تسک باگ ایجاد شده است");
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(request.InitialDescription))
|
||||||
|
return OperationResult.Failure("توضیحات باگ خالی است");
|
||||||
|
|
||||||
|
if (request.OriginalAssignedUserId == 0)
|
||||||
|
return OperationResult.Failure("کاربر انتخاب نشده است");
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
var bug = new BugSection(request.TaskId, request.InitialDescription, request.OriginalAssignedUserId,
|
||||||
|
request.Priority);
|
||||||
|
await _bugSectionRepository.CreateAsync(bug);
|
||||||
|
|
||||||
|
if (request.Files.Any())
|
||||||
|
{
|
||||||
|
foreach (var file in request.Files)
|
||||||
|
{
|
||||||
|
var uploadedFile = await _fileUploadService.UploadFileAsync
|
||||||
|
(
|
||||||
|
file,
|
||||||
|
FileCategory.BugSection,
|
||||||
|
currentUserId
|
||||||
|
);
|
||||||
|
if (!uploadedFile.IsSuccess)
|
||||||
|
{
|
||||||
|
return OperationResult.Failure(uploadedFile.ErrorMessage ?? "خطا در آپلود فایل");
|
||||||
|
}
|
||||||
|
bug.AddDocument(new BugDocument(uploadedFile.FileId!.Value));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
|
return OperationResult.Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public record CreateBugSectionCommand(Guid TaskId, string InitialDescription, long OriginalAssignedUserId, ProjectTaskPriority Priority, List<IFormFile> Files) : IBaseCommand;
|
||||||
|
|
||||||
@@ -4,4 +4,5 @@ using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
|||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject;
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.CreateProject;
|
||||||
|
|
||||||
public record CreateProjectCommand(string Name,ProjectHierarchyLevel Level,
|
public record CreateProjectCommand(string Name,ProjectHierarchyLevel Level,
|
||||||
|
ProjectTaskPriority? Priority,
|
||||||
Guid? ParentId):IBaseCommand;
|
Guid? ParentId):IBaseCommand;
|
||||||
@@ -3,6 +3,9 @@ using GozareshgirProgramManager.Application._Common.Models;
|
|||||||
using GozareshgirProgramManager.Domain._Common;
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
using GozareshgirProgramManager.Domain._Common.Exceptions;
|
using GozareshgirProgramManager.Domain._Common.Exceptions;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
|
||||||
@@ -16,7 +19,8 @@ public class CreateProjectCommandHandler : IBaseCommandHandler<CreateProjectComm
|
|||||||
private readonly IUnitOfWork _unitOfWork;
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
|
||||||
public CreateProjectCommandHandler(IProjectRepository projectRepository, IUnitOfWork unitOfWork, IProjectTaskRepository projectTaskRepository, IProjectPhaseRepository projectPhaseRepository)
|
public CreateProjectCommandHandler(IProjectRepository projectRepository, IUnitOfWork unitOfWork,
|
||||||
|
IProjectTaskRepository projectTaskRepository, IProjectPhaseRepository projectPhaseRepository)
|
||||||
{
|
{
|
||||||
_projectRepository = projectRepository;
|
_projectRepository = projectRepository;
|
||||||
_unitOfWork = unitOfWork;
|
_unitOfWork = unitOfWork;
|
||||||
@@ -56,7 +60,7 @@ public class CreateProjectCommandHandler : IBaseCommandHandler<CreateProjectComm
|
|||||||
if (!request.ParentId.HasValue)
|
if (!request.ParentId.HasValue)
|
||||||
throw new BadRequestException("برای ایجاد فاز، شناسه پروژه الزامی است");
|
throw new BadRequestException("برای ایجاد فاز، شناسه پروژه الزامی است");
|
||||||
|
|
||||||
if(!_projectRepository.Exists(x=>x.Id == request.ParentId.Value))
|
if (!_projectRepository.Exists(x => x.Id == request.ParentId.Value))
|
||||||
{
|
{
|
||||||
throw new BadRequestException("والد پروژه یافت نشد");
|
throw new BadRequestException("والد پروژه یافت نشد");
|
||||||
}
|
}
|
||||||
@@ -70,13 +74,14 @@ public class CreateProjectCommandHandler : IBaseCommandHandler<CreateProjectComm
|
|||||||
if (!request.ParentId.HasValue)
|
if (!request.ParentId.HasValue)
|
||||||
throw new BadRequestException("برای ایجاد تسک، شناسه فاز الزامی است");
|
throw new BadRequestException("برای ایجاد تسک، شناسه فاز الزامی است");
|
||||||
|
|
||||||
if(!_projectPhaseRepository.Exists(x=>x.Id == request.ParentId.Value))
|
if (!_projectPhaseRepository.Exists(x => x.Id == request.ParentId.Value))
|
||||||
{
|
{
|
||||||
throw new BadRequestException("والد پروژه یافت نشد");
|
throw new BadRequestException("والد پروژه یافت نشد");
|
||||||
}
|
}
|
||||||
|
|
||||||
var projectTask = new ProjectTask(request.Name, request.ParentId.Value);
|
var priority = request.Priority ?? ProjectTaskPriority.Low;
|
||||||
|
|
||||||
|
var projectTask = new ProjectTask(request.Name, request.ParentId.Value, priority);
|
||||||
await _projectTaskRepository.CreateAsync(projectTask);
|
await _projectTaskRepository.CreateAsync(projectTask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2,6 +2,7 @@ using GozareshgirProgramManager.Application._Common.Interfaces;
|
|||||||
using GozareshgirProgramManager.Application._Common.Models;
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
using GozareshgirProgramManager.Domain._Common;
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
using MediatR;
|
using MediatR;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
using GozareshgirProgramManager.Application._Common.Interfaces;
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
using GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
using GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.SetTimeProject;
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.SetTimeProject;
|
||||||
|
|
||||||
public record SetTimeProjectCommand(List<SetTimeProjectSectionItem> SectionItems, Guid Id, ProjectHierarchyLevel Level):IBaseCommand;
|
public record SetTimeProjectCommand(
|
||||||
|
List<SetTimeProjectSkillItem> SkillItems,
|
||||||
|
Guid Id,
|
||||||
|
ProjectHierarchyLevel Level,
|
||||||
|
bool CascadeToChildren) : IBaseCommand;
|
||||||
|
|
||||||
public class SetTimeSectionTime
|
public class SetTimeSectionTime
|
||||||
{
|
{
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public int Hours { get; set; }
|
public int Hours { get; set; }
|
||||||
|
public int Minutes { get; set; }
|
||||||
|
public TaskSectionAdditionalTimeType Type { get; set; }
|
||||||
}
|
}
|
||||||
@@ -4,8 +4,13 @@ using GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
|||||||
using GozareshgirProgramManager.Domain._Common;
|
using GozareshgirProgramManager.Domain._Common;
|
||||||
using GozareshgirProgramManager.Domain._Common.Exceptions;
|
using GozareshgirProgramManager.Domain._Common.Exceptions;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||||||
|
using GozareshgirProgramManager.Domain.SkillAgg.Repositories;
|
||||||
|
using GozareshgirProgramManager.Domain.UserAgg.Repositories;
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.SetTimeProject;
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.SetTimeProject;
|
||||||
|
|
||||||
@@ -15,21 +20,33 @@ public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCo
|
|||||||
private readonly IProjectPhaseRepository _projectPhaseRepository;
|
private readonly IProjectPhaseRepository _projectPhaseRepository;
|
||||||
private readonly IProjectTaskRepository _projectTaskRepository;
|
private readonly IProjectTaskRepository _projectTaskRepository;
|
||||||
private readonly IUnitOfWork _unitOfWork;
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
private readonly IAuthHelper _authHelper;
|
private readonly IUserRepository _userRepository;
|
||||||
|
private readonly ISkillRepository _skillRepository;
|
||||||
|
private readonly IPhaseSectionRepository _phaseSectionRepository;
|
||||||
|
private readonly IProjectSectionRepository _projectSectionRepository;
|
||||||
private long? _userId;
|
private long? _userId;
|
||||||
|
private readonly ITaskSectionRepository _taskSectionRepository;
|
||||||
|
|
||||||
|
|
||||||
public SetTimeProjectCommandHandler(
|
public SetTimeProjectCommandHandler(
|
||||||
IProjectRepository projectRepository,
|
IProjectRepository projectRepository,
|
||||||
IProjectPhaseRepository projectPhaseRepository,
|
IProjectPhaseRepository projectPhaseRepository,
|
||||||
IProjectTaskRepository projectTaskRepository,
|
IProjectTaskRepository projectTaskRepository,
|
||||||
IUnitOfWork unitOfWork, IAuthHelper authHelper)
|
IUnitOfWork unitOfWork, IAuthHelper authHelper,
|
||||||
|
IUserRepository userRepository, ISkillRepository skillRepository,
|
||||||
|
IPhaseSectionRepository phaseSectionRepository,
|
||||||
|
IProjectSectionRepository projectSectionRepository,
|
||||||
|
ITaskSectionRepository taskSectionRepository)
|
||||||
{
|
{
|
||||||
_projectRepository = projectRepository;
|
_projectRepository = projectRepository;
|
||||||
_projectPhaseRepository = projectPhaseRepository;
|
_projectPhaseRepository = projectPhaseRepository;
|
||||||
_projectTaskRepository = projectTaskRepository;
|
_projectTaskRepository = projectTaskRepository;
|
||||||
_unitOfWork = unitOfWork;
|
_unitOfWork = unitOfWork;
|
||||||
_authHelper = authHelper;
|
_userRepository = userRepository;
|
||||||
|
_skillRepository = skillRepository;
|
||||||
|
_phaseSectionRepository = phaseSectionRepository;
|
||||||
|
_projectSectionRepository = projectSectionRepository;
|
||||||
|
_taskSectionRepository = taskSectionRepository;
|
||||||
_userId = authHelper.GetCurrentUserId();
|
_userId = authHelper.GetCurrentUserId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +54,10 @@ public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCo
|
|||||||
{
|
{
|
||||||
switch (request.Level)
|
switch (request.Level)
|
||||||
{
|
{
|
||||||
|
case ProjectHierarchyLevel.Project:
|
||||||
|
return await AssignProject(request);
|
||||||
|
case ProjectHierarchyLevel.Phase:
|
||||||
|
return await AssignProjectPhase(request);
|
||||||
case ProjectHierarchyLevel.Task:
|
case ProjectHierarchyLevel.Task:
|
||||||
return await SetTimeForProjectTask(request, cancellationToken);
|
return await SetTimeForProjectTask(request, cancellationToken);
|
||||||
default:
|
default:
|
||||||
@@ -44,67 +65,229 @@ public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<OperationResult> SetTimeForProject(SetTimeProjectCommand request,
|
private async Task<OperationResult> AssignProject(SetTimeProjectCommand request)
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var project = await _projectRepository.GetWithFullHierarchyAsync(request.Id);
|
var project = await _projectRepository.GetWithFullHierarchyAsync(request.Id);
|
||||||
if (project == null)
|
if (project is null)
|
||||||
{
|
{
|
||||||
return OperationResult.NotFound("پروژه یافت نشد");
|
return OperationResult.NotFound("پروژه یافت نشد");
|
||||||
return OperationResult.NotFound("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long? addedByUserId = _userId;
|
var skillItems = request.SkillItems.Where(x=>x.UserId is > 0).ToList();
|
||||||
|
|
||||||
// تنظیم زمان برای تمام sections در تمام فازها و تسکهای پروژه
|
// حذف ProjectSections که در validSkills نیستند
|
||||||
|
var validSkillIds = skillItems.Select(x => x.SkillId).ToList();
|
||||||
|
var sectionsToRemove = project.ProjectSections
|
||||||
|
.Where(s => !validSkillIds.Contains(s.SkillId))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var section in sectionsToRemove)
|
||||||
|
{
|
||||||
|
project.RemoveProjectSection(section.SkillId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// تخصیص در سطح پروژه
|
||||||
|
foreach (var item in skillItems)
|
||||||
|
{
|
||||||
|
var skill = await _skillRepository.GetByIdAsync(item.SkillId);
|
||||||
|
if (skill is null)
|
||||||
|
{
|
||||||
|
return OperationResult.NotFound($"مهارت با شناسه {item.SkillId} یافت نشد");
|
||||||
|
}
|
||||||
|
|
||||||
|
// بررسی و بهروزرسانی یا اضافه کردن ProjectSection
|
||||||
|
var existingSection = project.ProjectSections.FirstOrDefault(s => s.SkillId == item.SkillId);
|
||||||
|
if (existingSection != null)
|
||||||
|
{
|
||||||
|
// اگر وجود داشت، فقط userId را بهروزرسانی کن
|
||||||
|
existingSection.UpdateUser(item.UserId.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// اگر وجود نداشت، اضافه کن
|
||||||
|
var newSection = new ProjectSection(project.Id, item.UserId.Value, item.SkillId);
|
||||||
|
await _projectSectionRepository.CreateAsync(newSection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// حالا برای تمام فازها و تسکها cascade کن
|
||||||
foreach (var phase in project.Phases)
|
foreach (var phase in project.Phases)
|
||||||
{
|
{
|
||||||
foreach (var task in phase.Tasks)
|
// اگر CascadeToChildren true است یا فاز override ندارد
|
||||||
|
if (request.CascadeToChildren || !phase.HasAssignmentOverride)
|
||||||
{
|
{
|
||||||
foreach (var section in task.Sections)
|
// حذف PhaseSections که در validSkills نیستند
|
||||||
|
var phaseSectionsToRemove = phase.PhaseSections
|
||||||
|
.Where(s => !validSkillIds.Contains(s.SkillId))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var section in phaseSectionsToRemove)
|
||||||
{
|
{
|
||||||
var sectionItem = request.SectionItems.FirstOrDefault(si => si.SectionId == section.Id);
|
phase.RemovePhaseSection(section.SkillId);
|
||||||
if (sectionItem != null)
|
}
|
||||||
|
|
||||||
|
// برای phase هم باید sectionها را بهروزرسانی کنیم
|
||||||
|
foreach (var item in skillItems )
|
||||||
|
{
|
||||||
|
var existingSection = phase.PhaseSections.FirstOrDefault(s => s.SkillId == item.SkillId);
|
||||||
|
if (existingSection != null)
|
||||||
{
|
{
|
||||||
SetSectionTime(section, sectionItem, addedByUserId);
|
existingSection.Update(item.UserId.Value, item.SkillId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var newPhaseSection = new PhaseSection(phase.Id, item.UserId.Value, item.SkillId);
|
||||||
|
await _phaseSectionRepository.CreateAsync(newPhaseSection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var task in phase.Tasks)
|
||||||
|
{
|
||||||
|
// اگر CascadeToChildren true است یا تسک override ندارد
|
||||||
|
if (request.CascadeToChildren || !task.HasAssignmentOverride)
|
||||||
|
{
|
||||||
|
// حذف TaskSections که در validSkills نیستند
|
||||||
|
var taskSectionsToRemove = task.Sections
|
||||||
|
.Where(s => !validSkillIds.Contains(s.SkillId))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var section in taskSectionsToRemove)
|
||||||
|
{
|
||||||
|
task.RemoveSection(section.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in skillItems)
|
||||||
|
{
|
||||||
|
var section = task.Sections.FirstOrDefault(s => s.SkillId == item.SkillId);
|
||||||
|
if (section != null)
|
||||||
|
{
|
||||||
|
// استفاده از TransferToUser
|
||||||
|
if (section.CurrentAssignedUserId != item.UserId)
|
||||||
|
{
|
||||||
|
if (section.CurrentAssignedUserId > 0)
|
||||||
|
{
|
||||||
|
section.TransferToUser(section.CurrentAssignedUserId, item.UserId.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
section.AssignToUser(item.UserId.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var newTaskSection = new TaskSection(task.Id, item.SkillId, item.UserId.Value);
|
||||||
|
await _taskSectionRepository.CreateAsync(newTaskSection);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
await _unitOfWork.SaveChangesAsync();
|
||||||
return OperationResult.Success();
|
return OperationResult.Success();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<OperationResult> SetTimeForProjectPhase(SetTimeProjectCommand request,
|
private async Task<OperationResult> AssignProjectPhase(SetTimeProjectCommand request)
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var phase = await _projectPhaseRepository.GetWithTasksAsync(request.Id);
|
var phase = await _projectPhaseRepository.GetWithTasksAsync(request.Id);
|
||||||
if (phase == null)
|
if (phase is null)
|
||||||
{
|
{
|
||||||
return OperationResult.NotFound("فاز پروژه یافت نشد");
|
return OperationResult.NotFound("فاز پروژه یافت نشد");
|
||||||
return OperationResult.NotFound("<22><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long? addedByUserId = _userId;
|
// تخصیص در سطح فاز
|
||||||
|
foreach (var item in request.SkillItems)
|
||||||
|
{
|
||||||
|
var skill = await _skillRepository.GetByIdAsync(item.SkillId);
|
||||||
|
if (skill is null)
|
||||||
|
{
|
||||||
|
return OperationResult.NotFound($"مهارت با شناسه {item.SkillId} یافت نشد");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// تنظیم زمان برای تمام sections در تمام تسکهای این فاز
|
// علامتگذاری که این فاز نسبت به parent متمایز است
|
||||||
|
phase.MarkAsOverridden();
|
||||||
|
|
||||||
|
var skillItems = request.SkillItems.Where(x=>x.UserId is > 0).ToList();
|
||||||
|
|
||||||
|
// حذف PhaseSections که در validSkills نیستند
|
||||||
|
var validSkillIds = skillItems.Select(x => x.SkillId).ToList();
|
||||||
|
var sectionsToRemove = phase.PhaseSections
|
||||||
|
.Where(s => !validSkillIds.Contains(s.SkillId))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var section in sectionsToRemove)
|
||||||
|
{
|
||||||
|
phase.RemovePhaseSection(section.SkillId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// بهروزرسانی یا اضافه کردن PhaseSection
|
||||||
|
foreach (var item in skillItems)
|
||||||
|
{
|
||||||
|
var existingSection = phase.PhaseSections.FirstOrDefault(s => s.SkillId == item.SkillId);
|
||||||
|
if (existingSection != null)
|
||||||
|
{
|
||||||
|
// اگر وجود داشت، فقط userId را بهروزرسانی کن
|
||||||
|
existingSection.Update(item.UserId!.Value, item.SkillId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// اگر وجود نداشت، اضافه کن
|
||||||
|
var newPhaseSection = new PhaseSection(phase.Id, item.UserId!.Value, item.SkillId);
|
||||||
|
await _phaseSectionRepository.CreateAsync(newPhaseSection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cascade به تمام تسکها
|
||||||
foreach (var task in phase.Tasks)
|
foreach (var task in phase.Tasks)
|
||||||
{
|
{
|
||||||
foreach (var section in task.Sections)
|
// اگر CascadeToChildren true است یا تسک override ندارد
|
||||||
|
if (request.CascadeToChildren || !task.HasAssignmentOverride)
|
||||||
{
|
{
|
||||||
var sectionItem = request.SectionItems.FirstOrDefault(si => si.SectionId == section.Id);
|
// حذف TaskSections که در validSkills نیستند
|
||||||
if (sectionItem != null)
|
var taskSectionsToRemove = task.Sections
|
||||||
|
.Where(s => !validSkillIds.Contains(s.SkillId))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var section in taskSectionsToRemove)
|
||||||
{
|
{
|
||||||
SetSectionTime(section, sectionItem, addedByUserId);
|
task.RemoveSection(section.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in skillItems)
|
||||||
|
{
|
||||||
|
var section = task.Sections.FirstOrDefault(s => s.SkillId == item.SkillId);
|
||||||
|
if (section != null)
|
||||||
|
{
|
||||||
|
// استفاده از TransferToUser
|
||||||
|
if (section.CurrentAssignedUserId != item.UserId)
|
||||||
|
{
|
||||||
|
if (section.CurrentAssignedUserId > 0)
|
||||||
|
{
|
||||||
|
section.TransferToUser(section.CurrentAssignedUserId, item.UserId!.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
section.AssignToUser(item.UserId!.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var newTaskSection = new TaskSection(task.Id, item.SkillId, item.UserId!.Value);
|
||||||
|
await _taskSectionRepository.CreateAsync(newTaskSection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
await _unitOfWork.SaveChangesAsync();
|
||||||
return OperationResult.Success();
|
return OperationResult.Success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private async Task<OperationResult> SetTimeForProjectTask(SetTimeProjectCommand request,
|
private async Task<OperationResult> SetTimeForProjectTask(SetTimeProjectCommand request,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@@ -116,24 +299,64 @@ public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCo
|
|||||||
|
|
||||||
long? addedByUserId = _userId;
|
long? addedByUserId = _userId;
|
||||||
|
|
||||||
// تنظیم زمان مستقیماً برای sections این تسک
|
var validSkills = request.SkillItems
|
||||||
foreach (var section in task.Sections)
|
.Where(x=>x.UserId is > 0).ToList();
|
||||||
|
|
||||||
|
// حذف سکشنهایی که در validSkills نیستند
|
||||||
|
var validSkillIds = validSkills.Select(x => x.SkillId).ToList();
|
||||||
|
var sectionsToRemove = task.Sections
|
||||||
|
.Where(s => !validSkillIds.Contains(s.SkillId))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var sectionToRemove in sectionsToRemove)
|
||||||
{
|
{
|
||||||
var sectionItem = request.SectionItems.FirstOrDefault(si => si.SectionId == section.Id);
|
task.RemoveSection(sectionToRemove.Id);
|
||||||
if (sectionItem != null)
|
|
||||||
{
|
|
||||||
SetSectionTime(section, sectionItem, addedByUserId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var skillItem in validSkills)
|
||||||
|
{
|
||||||
|
var section = task.Sections.FirstOrDefault(s => s.SkillId == skillItem.SkillId);
|
||||||
|
|
||||||
|
if (!_userRepository.Exists(x=>x.Id == skillItem.UserId!.Value))
|
||||||
|
{
|
||||||
|
throw new BadRequestException("کاربر با شناسه یافت نشد.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (section == null)
|
||||||
|
{
|
||||||
|
var taskSection = new TaskSection(task.Id,
|
||||||
|
skillItem.SkillId, skillItem.UserId!.Value);
|
||||||
|
|
||||||
|
task.AddSection(taskSection);
|
||||||
|
section = taskSection;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (section.CurrentAssignedUserId != skillItem.UserId)
|
||||||
|
{
|
||||||
|
if (section.CurrentAssignedUserId > 0)
|
||||||
|
{
|
||||||
|
section.TransferToUser(section.CurrentAssignedUserId, skillItem.UserId!.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
section.AssignToUser(skillItem.UserId!.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetSectionTime(section, skillItem, addedByUserId);
|
||||||
|
|
||||||
|
}
|
||||||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||||
return OperationResult.Success();
|
return OperationResult.Success();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetSectionTime(TaskSection section, SetTimeProjectSectionItem sectionItem, long? addedByUserId)
|
private void SetSectionTime(TaskSection section, SetTimeProjectSkillItem sectionItem, long? addedByUserId)
|
||||||
{
|
{
|
||||||
var initData = sectionItem.InitData;
|
var initData = sectionItem.InitData;
|
||||||
var initialTime = TimeSpan.FromHours(initData.Hours);
|
var initialTime = TimeSpan.FromHours(initData.Hours)
|
||||||
|
.Add(TimeSpan.FromMinutes(initData.Minutes));
|
||||||
|
|
||||||
if (initialTime <= TimeSpan.Zero)
|
if (initialTime <= TimeSpan.Zero)
|
||||||
{
|
{
|
||||||
@@ -145,10 +368,26 @@ public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCo
|
|||||||
|
|
||||||
section.ClearAdditionalTimes();
|
section.ClearAdditionalTimes();
|
||||||
// افزودن زمانهای اضافی
|
// افزودن زمانهای اضافی
|
||||||
|
bool hasAdditionalTime = false;
|
||||||
foreach (var additionalTime in sectionItem.AdditionalTime)
|
foreach (var additionalTime in sectionItem.AdditionalTime)
|
||||||
{
|
{
|
||||||
var additionalTimeSpan = TimeSpan.FromHours(additionalTime.Hours);
|
var additionalTimeSpan = TimeSpan.FromHours(additionalTime.Hours).Add(TimeSpan.FromMinutes(additionalTime.Minutes));
|
||||||
section.AddAdditionalTime(additionalTimeSpan, additionalTime.Description, addedByUserId);
|
section.AddAdditionalTime(additionalTimeSpan, additionalTime.Type, additionalTime.Description, addedByUserId);
|
||||||
|
hasAdditionalTime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// تغییر status به Incomplete فقط اگر زمان اضافی اضافه شده باشد و در وضعیتی غیر از ReadyToStart باشد
|
||||||
|
if (hasAdditionalTime && section.Status != TaskSectionStatus.ReadyToStart)
|
||||||
|
{
|
||||||
|
// اگر سکشن درحال انجام است، باید متوقف شود قبل از تغییر status
|
||||||
|
if (section.Status == TaskSectionStatus.InProgress)
|
||||||
|
{
|
||||||
|
section.StopWork(TaskSectionStatus.Incomplete);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
section.UpdateStatus(TaskSectionStatus.Incomplete);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,19 +13,15 @@ public class SetTimeProjectCommandValidator:AbstractValidator<SetTimeProjectComm
|
|||||||
.NotNull()
|
.NotNull()
|
||||||
.WithMessage("شناسه پروژه نمیتواند خالی باشد.");
|
.WithMessage("شناسه پروژه نمیتواند خالی باشد.");
|
||||||
|
|
||||||
RuleForEach(x => x.SectionItems)
|
RuleForEach(x => x.SkillItems)
|
||||||
.SetValidator(command => new SetTimeProjectSectionItemValidator());
|
.SetValidator(command => new SetTimeProjectSkillItemValidator());
|
||||||
|
|
||||||
RuleFor(x => x.SectionItems)
|
|
||||||
.Must(sectionItems => sectionItems.Any(si => si.InitData?.Hours > 0))
|
|
||||||
.WithMessage("حداقل یکی از بخشها باید مقدار ساعت معتبری داشته باشد.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class SetTimeProjectSectionItemValidator:AbstractValidator<SetTimeProjectSectionItem>
|
public class SetTimeProjectSkillItemValidator:AbstractValidator<SetTimeProjectSkillItem>
|
||||||
{
|
{
|
||||||
public SetTimeProjectSectionItemValidator()
|
public SetTimeProjectSkillItemValidator()
|
||||||
{
|
{
|
||||||
RuleFor(x=>x.SectionId)
|
RuleFor(x=>x.SkillId)
|
||||||
.NotEmpty()
|
.NotEmpty()
|
||||||
.NotNull()
|
.NotNull()
|
||||||
.WithMessage("شناسه بخش نمیتواند خالی باشد.");
|
.WithMessage("شناسه بخش نمیتواند خالی باشد.");
|
||||||
@@ -47,6 +43,18 @@ public class AdditionalTimeDataValidator: AbstractValidator<SetTimeSectionTime>
|
|||||||
.GreaterThanOrEqualTo(0)
|
.GreaterThanOrEqualTo(0)
|
||||||
.WithMessage("ساعت نمیتواند منفی باشد.");
|
.WithMessage("ساعت نمیتواند منفی باشد.");
|
||||||
|
|
||||||
|
RuleFor(x => x.Hours)
|
||||||
|
.LessThan(1_000)
|
||||||
|
.WithMessage("ساعت باید کمتر از 1000 باشد.");
|
||||||
|
|
||||||
|
RuleFor(x => x.Minutes)
|
||||||
|
.GreaterThanOrEqualTo(0)
|
||||||
|
.WithMessage("دقیقه نمیتواند منفی باشد.");
|
||||||
|
|
||||||
|
RuleFor(x => x.Minutes)
|
||||||
|
.LessThan(60)
|
||||||
|
.WithMessage("دقیقه باید بین 0 تا 59 باشد.");
|
||||||
|
|
||||||
RuleFor(x=>x.Description)
|
RuleFor(x=>x.Description)
|
||||||
.MaximumLength(500)
|
.MaximumLength(500)
|
||||||
.WithMessage("توضیحات نمیتواند بیشتر از 500 کاراکتر باشد.");
|
.WithMessage("توضیحات نمیتواند بیشتر از 500 کاراکتر باشد.");
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ public class ProjectSectionDto
|
|||||||
|
|
||||||
public TimeSpan FinalEstimatedHours { get; set; }
|
public TimeSpan FinalEstimatedHours { get; set; }
|
||||||
public TimeSpan TotalTimeSpent { get; set; }
|
public TimeSpan TotalTimeSpent { get; set; }
|
||||||
|
public double ProgressPercentage { get; set; }
|
||||||
public bool IsCompleted { get; set; }
|
public bool IsCompleted { get; set; }
|
||||||
public bool IsInProgress { get; set; }
|
public bool IsInProgress { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ using GozareshgirProgramManager.Application.Modules.Projects.Commands.SetTimePro
|
|||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
namespace GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
||||||
|
|
||||||
public class SetTimeProjectSectionItem
|
public class SetTimeProjectSkillItem
|
||||||
{
|
{
|
||||||
public Guid SectionId { get; set; }
|
public Guid SkillId { get; set; }
|
||||||
|
public long? UserId { get; set; }
|
||||||
public SetTimeSectionTime InitData { get; set; }
|
public SetTimeSectionTime InitData { get; set; }
|
||||||
public List<SetTimeSectionTime> AdditionalTime { get; set; } = [];
|
public List<SetTimeSectionTime> AdditionalTime { get; set; } = [];
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
using GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
using GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
|
||||||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
|
||||||
namespace GozareshgirProgramManager.Application.Modules.Projects.Extensions;
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Extensions;
|
||||||
@@ -166,6 +170,7 @@ public static class ProjectMappingExtensions
|
|||||||
CreationDate = section.CreationDate,
|
CreationDate = section.CreationDate,
|
||||||
FinalEstimatedHours = section.FinalEstimatedHours,
|
FinalEstimatedHours = section.FinalEstimatedHours,
|
||||||
TotalTimeSpent = section.GetTotalTimeSpent(),
|
TotalTimeSpent = section.GetTotalTimeSpent(),
|
||||||
|
ProgressPercentage = section.GetProgressPercentage(),
|
||||||
IsCompleted = section.IsCompleted(),
|
IsCompleted = section.IsCompleted(),
|
||||||
IsInProgress = section.IsInProgress(),
|
IsInProgress = section.IsInProgress(),
|
||||||
Activities = section.Activities.Select(a => a.ToDto()).ToList(),
|
Activities = section.Activities.Select(a => a.ToDto()).ToList(),
|
||||||
@@ -188,6 +193,7 @@ public static class ProjectMappingExtensions
|
|||||||
CreationDate = section.CreationDate,
|
CreationDate = section.CreationDate,
|
||||||
FinalEstimatedHours = section.FinalEstimatedHours,
|
FinalEstimatedHours = section.FinalEstimatedHours,
|
||||||
TotalTimeSpent = section.GetTotalTimeSpent(),
|
TotalTimeSpent = section.GetTotalTimeSpent(),
|
||||||
|
ProgressPercentage = section.GetProgressPercentage(),
|
||||||
IsCompleted = section.IsCompleted(),
|
IsCompleted = section.IsCompleted(),
|
||||||
IsInProgress = section.IsInProgress()
|
IsInProgress = section.IsInProgress()
|
||||||
// No activities or additional times for summary
|
// No activities or additional times for summary
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.GetBugModalDetails;
|
||||||
|
|
||||||
|
public class GetBugModalDetailsQueryHandler : IBaseQueryHandler<GetBugModalDetailsQuery, GetBugModalDetailsResponse>
|
||||||
|
{
|
||||||
|
private readonly IProgramManagerDbContext _context;
|
||||||
|
|
||||||
|
public GetBugModalDetailsQueryHandler(IProgramManagerDbContext context)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult<GetBugModalDetailsResponse>> Handle(GetBugModalDetailsQuery request, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var projectTask =await _context.ProjectTasks.Include(ph=>ph.Phase).ThenInclude(p=>p.Project).FirstOrDefaultAsync(x=>x.Id == request.TaskId);
|
||||||
|
if(projectTask == null)
|
||||||
|
return OperationResult<GetBugModalDetailsResponse>.NotFound("بخش یافت نشد");
|
||||||
|
|
||||||
|
var response = new GetBugModalDetailsResponse(projectTask.Name,projectTask.Phase.Name, projectTask.Phase.Project.Name);
|
||||||
|
return OperationResult<GetBugModalDetailsResponse>.Success(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public record GetBugModalDetailsQuery(Guid TaskId) : IBaseQuery<GetBugModalDetailsResponse>;
|
||||||
|
|
||||||
|
public record GetBugModalDetailsResponse(string TaskName, string PhaseName, string ProjectName);
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.GetProjectHierarchySearch;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// درخواست جستجو در سراسر سلسلهمراتب پروژه (پروژه، فاز، تسک).
|
||||||
|
/// نتایج با اطلاعات مسیر سلسلهمراتب برای پشتیبانی از ناوبری درخت در رابط کاربری بازگردانده میشود.
|
||||||
|
/// </summary>
|
||||||
|
public record GetProjectSearchQuery(
|
||||||
|
string SearchQuery) : IBaseQuery<GetProjectSearchResponse>;
|
||||||
|
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application._Common.Models;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.GetProjectHierarchySearch;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handler برای درخواست جستجوی سراسری در سلسلهمراتب پروژه.
|
||||||
|
/// این handler در تمام سطحهای پروژه، فاز و تسک جستجو میکند و از تمام فیلدهای متنی (نام، توضیحات) استفاده میکند.
|
||||||
|
/// همچنین در زیرمجموعههای هر سطح (ProjectSections، PhaseSections، TaskSections) جستجو میکند.
|
||||||
|
/// </summary>
|
||||||
|
public class GetProjectSearchQueryHandler : IBaseQueryHandler<GetProjectSearchQuery, GetProjectSearchResponse>
|
||||||
|
{
|
||||||
|
private readonly IProgramManagerDbContext _context;
|
||||||
|
private const int MaxResults = 50;
|
||||||
|
|
||||||
|
public GetProjectSearchQueryHandler(IProgramManagerDbContext context)
|
||||||
|
{
|
||||||
|
_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult<GetProjectSearchResponse>> Handle(
|
||||||
|
GetProjectSearchQuery request,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var searchQuery = request.SearchQuery.ToLower();
|
||||||
|
var results = new List<ProjectHierarchySearchResultDto>();
|
||||||
|
|
||||||
|
// جستجو در پروژهها و ProjectSections
|
||||||
|
var projects = await SearchProjects(searchQuery, cancellationToken);
|
||||||
|
results.AddRange(projects);
|
||||||
|
|
||||||
|
// جستجو در فازها و PhaseSections
|
||||||
|
var phases = await SearchPhases(searchQuery, cancellationToken);
|
||||||
|
results.AddRange(phases);
|
||||||
|
|
||||||
|
// جستجو در تسکها و TaskSections
|
||||||
|
var tasks = await SearchTasks(searchQuery, cancellationToken);
|
||||||
|
results.AddRange(tasks);
|
||||||
|
|
||||||
|
// مرتبسازی نتایج: ابتدا بر اساس سطح سلسلهمراتب (پروژه → فاز → تسک)، سپس بر اساس نام
|
||||||
|
var sortedResults = results
|
||||||
|
.OrderBy(r => r.Level)
|
||||||
|
.ThenBy(r => r.Title)
|
||||||
|
.Take(MaxResults)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var response = new GetProjectSearchResponse(sortedResults);
|
||||||
|
return OperationResult<GetProjectSearchResponse>.Success(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جستجو در جدول پروژهها (نام، توضیحات) و ProjectSections (نام مهارت، توضیحات اولیه)
|
||||||
|
/// </summary>
|
||||||
|
private async Task<List<ProjectHierarchySearchResultDto>> SearchProjects(
|
||||||
|
string searchQuery,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var projects = await _context.Projects
|
||||||
|
.Where(p =>
|
||||||
|
p.Name.ToLower().Contains(searchQuery) ||
|
||||||
|
(p.Description != null && p.Description.ToLower().Contains(searchQuery)))
|
||||||
|
.Select(p => new ProjectHierarchySearchResultDto
|
||||||
|
{
|
||||||
|
Id = p.Id,
|
||||||
|
Title = p.Name,
|
||||||
|
Level = ProjectHierarchyLevel.Project,
|
||||||
|
ProjectId = null,
|
||||||
|
PhaseId = null
|
||||||
|
})
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
return projects;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جستجو در جدول فازهای پروژه (نام، توضیحات) و PhaseSections
|
||||||
|
/// </summary>
|
||||||
|
private async Task<List<ProjectHierarchySearchResultDto>> SearchPhases(
|
||||||
|
string searchQuery,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var phases = await _context.ProjectPhases
|
||||||
|
.Where(ph =>
|
||||||
|
ph.Name.ToLower().Contains(searchQuery) ||
|
||||||
|
(ph.Description != null && ph.Description.ToLower().Contains(searchQuery)))
|
||||||
|
.Select(ph => new ProjectHierarchySearchResultDto
|
||||||
|
{
|
||||||
|
Id = ph.Id,
|
||||||
|
Title = ph.Name,
|
||||||
|
Level = ProjectHierarchyLevel.Phase,
|
||||||
|
ProjectId = ph.ProjectId,
|
||||||
|
PhaseId = null
|
||||||
|
})
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
return phases;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جستجو در جدول تسکهای پروژه (نام، توضیحات) و TaskSections (نام مهارت، توضیح اولیه، اطلاعات اضافی)
|
||||||
|
/// </summary>
|
||||||
|
private async Task<List<ProjectHierarchySearchResultDto>> SearchTasks(
|
||||||
|
string searchQuery,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var tasks = await _context.ProjectTasks
|
||||||
|
.Include(t => t.Sections)
|
||||||
|
.Include(t => t.Phase)
|
||||||
|
.Where(t =>
|
||||||
|
t.Name.ToLower().Contains(searchQuery) ||
|
||||||
|
(t.Description != null && t.Description.ToLower().Contains(searchQuery)) ||
|
||||||
|
t.Sections.Any(s =>
|
||||||
|
(s.InitialDescription != null && s.InitialDescription.ToLower().Contains(searchQuery)) ||
|
||||||
|
s.AdditionalTimes.Any(at => at.Reason != null && at.Reason.ToLower().Contains(searchQuery))))
|
||||||
|
.Select(t => new ProjectHierarchySearchResultDto
|
||||||
|
{
|
||||||
|
Id = t.Id,
|
||||||
|
Title = t.Name,
|
||||||
|
Level = ProjectHierarchyLevel.Task,
|
||||||
|
ProjectId = t.Phase.ProjectId,
|
||||||
|
PhaseId = t.PhaseId
|
||||||
|
})
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
return tasks;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
using FluentValidation;
|
||||||
|
|
||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.GetProjectHierarchySearch;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// اعتبارسنج برای درخواست جستجوی سراسری
|
||||||
|
/// </summary>
|
||||||
|
public class GetProjectSearchQueryValidator : AbstractValidator<GetProjectSearchQuery>
|
||||||
|
{
|
||||||
|
public GetProjectSearchQueryValidator()
|
||||||
|
{
|
||||||
|
RuleFor(x => x.SearchQuery)
|
||||||
|
.NotEmpty().WithMessage("متن جستجو نمیتواند خالی باشد.")
|
||||||
|
.MinimumLength(2).WithMessage("متن جستجو باید حداقل 2 حرف باشد.")
|
||||||
|
.MaximumLength(500).WithMessage("متن جستجو نمیتواند بیش از 500 حرف باشد.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.GetProjectHierarchySearch;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پوستهی پاسخ برای نتایج جستجوی سراسری
|
||||||
|
/// </summary>
|
||||||
|
public record GetProjectSearchResponse(
|
||||||
|
List<ProjectHierarchySearchResultDto> Results);
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user