Compare commits
175 Commits
Feature/In
...
ServiceAmo
| Author | SHA1 | Date | |
|---|---|---|---|
| 223c2bde21 | |||
| f17b566957 | |||
|
|
82bf10c2d5 | ||
|
|
19a72ac78d | ||
|
|
9cb42b7cef | ||
| 12fab5a9a5 | |||
| 20dd8f64f4 | |||
| b827493306 | |||
| 04c65eae93 | |||
| b4526a4338 | |||
| 2d879ce80a | |||
| 56e79d2099 | |||
| 93891f3837 | |||
|
|
5bdfbc572b | ||
| 4385a65cbc | |||
| 722f8dae7c | |||
|
|
07113353c4 | ||
| 8c6336b9bd | |||
| 20e3d454cf | |||
| 2bf31db6b2 | |||
| 7a4a6de84f | |||
| 4f16d7680c | |||
|
|
7a10d5ce59 | ||
|
|
3d88feeee7 | ||
|
|
f408624463 | ||
|
|
8296292e49 | ||
| be8deef167 | |||
| 84fb29c8c8 | |||
| 0969e8a5fd | |||
| 92e2282381 | |||
|
|
3b71b7d707 | ||
| 6123a53f01 | |||
| ec74db17eb | |||
| dc118cf18b | |||
| a11e54c333 | |||
|
|
2383e7a54f | ||
|
|
2ef1ea3d1a | ||
|
|
ebdc9b1e55 | ||
| 9e5a494881 | |||
| 2972807c9f | |||
| f7351454f3 | |||
| b64d0e5ffd | |||
| 35b7a3a3dd | |||
| fe93ef60c9 | |||
| ef865d9c68 | |||
|
|
61e35100f9 | ||
|
|
01d33ff340 | ||
| cd64e1d24d | |||
| d9da2e97ab | |||
|
|
1c1c8816a5 | ||
| a1e85261a6 | |||
| 000af89fd7 | |||
|
|
a4f3feba1c | ||
|
|
a3d286c040 | ||
|
|
902ef34757 | ||
|
|
e67aca37f9 | ||
| 2a31b27f9b | |||
| e05eb1236b | |||
| a7d3b1e96f | |||
| 73bef104fb | |||
|
|
b31559a29a | ||
|
|
e62270a9b7 | ||
|
|
998759e2dc | ||
|
|
49d401856f | ||
|
|
2faf6c1400 | ||
|
|
a01a927f6f | ||
| bca1e66f0f | |||
|
|
097d5a6e86 | ||
| 83a7bbf5f3 | |||
|
|
24501df615 | ||
| da46d45601 | |||
| 14fda440c1 | |||
| 85ce92af2c | |||
|
|
5777a869cf | ||
| ed6301831c | |||
| 2d0eb52211 | |||
| 05d8b738cc | |||
|
|
5936f02421 | ||
|
|
57116b14cc | ||
| a1e52ca48a | |||
| f75d267ef5 | |||
| 5be44432b1 | |||
|
|
c0d2cae82e | ||
|
|
955a6a3d21 | ||
| a52e313984 | |||
| 58816ca383 | |||
| 370feca81e | |||
|
|
a4bf6c952d | ||
|
|
c9d582877b | ||
| 339cea998a | |||
| 32065aec33 | |||
| f2293934d4 | |||
| b12b3b9eb8 | |||
| 91259046f6 | |||
| c9882f0b59 | |||
|
|
e89aae1cc9 | ||
| 9469a5f76e | |||
| c059066b13 | |||
| ba0669bc55 | |||
| b3f42af77c | |||
| f42db3d21c | |||
| eb49bf771d | |||
| f829b8ddd1 | |||
| 5e6033db95 | |||
| 27e8a26ed8 | |||
|
|
0a2815946c | ||
|
|
7776dedd2a | ||
|
|
5da523e9a8 | ||
| b7a7fb01d7 | |||
| 8d49220532 | |||
|
|
def27929d9 | ||
|
|
ea6fcbc773 | ||
| 788d58b413 | |||
| de8181770d | |||
| 3a32d1ca9d | |||
| 951a194961 | |||
| ea896c4c11 | |||
| 167b2bce09 | |||
|
|
32a05398de | ||
|
|
57853e2d1f | ||
|
|
acd96bcdc7 | ||
| 3c0ec01f77 | |||
| 517f2d06ca | |||
|
|
fb97d3453d | ||
|
|
2320185ade | ||
|
|
80fdd1fece | ||
| 343f830d0d | |||
| 323a46a623 | |||
| 87ff7976fb | |||
| a533850f24 | |||
| b5c1a4c29d | |||
| 28607dec66 | |||
| 4a041ca8e2 | |||
|
|
de0de6fde8 | ||
|
|
70447a74ef | ||
| 90aa6058f0 | |||
| 3df296f205 | |||
| 6a2e4405de | |||
| 88c10ac141 | |||
|
|
8de3939675 | ||
| e78c838cab | |||
|
|
5e4b8a3a80 | ||
|
|
a18984fec1 | ||
| a178fcd202 | |||
| 9e92d2215f | |||
| c63eb23b22 | |||
| 238926118f | |||
| c874164ca2 | |||
| d2f0ed46ae | |||
| 40dd90074b | |||
| 452b0b6277 | |||
| 720e998a54 | |||
| 626722e805 | |||
| 5e5910e0fd | |||
| 5d81731512 | |||
| 511932fa58 | |||
| 95891d5bae | |||
|
|
901a4ebd35 | ||
| f3fa76c292 | |||
|
|
16b04fc75c | ||
| ac6bbc3587 | |||
| 947d7590f4 | |||
| 91403a52a3 | |||
| 7e80342f80 | |||
| 5e92207778 | |||
|
|
29484e9565 | ||
|
|
86ac300e00 | ||
| ba640494d2 | |||
| 6974a505b4 | |||
| 6d3d599449 | |||
| 2d28bd1f98 | |||
| 75ae3efb65 | |||
| eb53fd67ef | |||
|
|
90a420c8c5 | ||
|
|
73563b0421 |
@@ -1,21 +1,26 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<RootNamespace>_0_Framework</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="IPE.SmsIR" Version="1.0.5" />
|
||||
<PackageReference Include="EPPlus" Version="7.5.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.1.34" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
|
||||
<PackageReference Include="FluentValidation" Version="12.1.1" />
|
||||
<PackageReference Include="IPE.SmsIR" Version="1.2.7" />
|
||||
<PackageReference Include="EPPlus" Version="8.4.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.3" />
|
||||
<PackageReference Include="PersianTools.Core" Version="2.0.4" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="9.0.0" />
|
||||
<PackageReference Include="MD.PersianDateTime.Standard" Version="2.5.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="7.2.0" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="10.0.1" />
|
||||
<PackageReference Include="MD.PersianDateTime.Standard" Version="2.6.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="10.0.1" />
|
||||
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -56,6 +56,11 @@ public class AuthHelper : IAuthHelper
|
||||
return Tools.DeserializeFromBsonList<int>(permissions); //Mahan
|
||||
}
|
||||
|
||||
public bool HasPermission(int permission)
|
||||
{
|
||||
return GetPermissions().Any(x => x == permission);
|
||||
}
|
||||
|
||||
public long CurrentAccountId()
|
||||
{
|
||||
return IsAuthenticated()
|
||||
@@ -198,7 +203,8 @@ public class AuthHelper : IAuthHelper
|
||||
new("workshopList",workshopBson),
|
||||
new("WorkshopSlug",slug),
|
||||
new("WorkshopId", account.WorkshopId.ToString()),
|
||||
new("WorkshopName",account.WorkshopName??"")
|
||||
new("WorkshopName",account.WorkshopName??""),
|
||||
new("pm.userId", account.PmUserId.ToString()),
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -27,10 +27,12 @@ public class AuthViewModel
|
||||
#endregion
|
||||
|
||||
public long SubAccountId { get; set; }
|
||||
public long? PmUserId { get; set; }
|
||||
|
||||
|
||||
public AuthViewModel(long id, long roleId, string fullname, string username, string mobile,string profilePhoto,
|
||||
List<int> permissions, string roleName, string adminAreaPermission, string clientAriaPermission, int? positionValue, long subAccountId = 0)
|
||||
List<int> permissions, string roleName, string adminAreaPermission, string clientAriaPermission, int? positionValue,
|
||||
long subAccountId = 0,long? pmUserId = null)
|
||||
{
|
||||
Id = id;
|
||||
RoleId = roleId;
|
||||
@@ -44,6 +46,7 @@ public class AuthViewModel
|
||||
ClientAriaPermission = clientAriaPermission;
|
||||
PositionValue = positionValue;
|
||||
SubAccountId = subAccountId;
|
||||
PmUserId = pmUserId;
|
||||
}
|
||||
|
||||
public AuthViewModel()
|
||||
|
||||
@@ -33,4 +33,9 @@ public enum TypeOfSmsSetting
|
||||
/// </summary>
|
||||
LegalAction,
|
||||
|
||||
/// <summary>
|
||||
/// پیامک تایید قراداد
|
||||
/// </summary>
|
||||
InstitutionContractConfirm,
|
||||
|
||||
}
|
||||
@@ -11,6 +11,7 @@ public interface IFaceEmbeddingService
|
||||
Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding, float confidence, Dictionary<string, object> metadata = null);
|
||||
Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId);
|
||||
Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId);
|
||||
Task<OperationResult> UpdateEmbeddingFullNameAsync(long employeeId, long workshopId, string newFullName);
|
||||
}
|
||||
|
||||
public class FaceEmbeddingResponse
|
||||
|
||||
@@ -12,6 +12,7 @@ public interface IAuthHelper
|
||||
string CurrentAccountRole();
|
||||
AuthViewModel CurrentAccountInfo();
|
||||
List<int> GetPermissions();
|
||||
bool HasPermission(int permission);
|
||||
long CurrentAccountId();
|
||||
string CurrentAccountMobile();
|
||||
|
||||
|
||||
13
0_Framework/Application/SecretKeys.cs
Normal file
13
0_Framework/Application/SecretKeys.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace _0_Framework.Application;
|
||||
|
||||
public static class SecretKeys
|
||||
{
|
||||
|
||||
public static string ProgramManagerInternalApi => "JOb09$Ic3NJd0siLCJtYWMiOiI2%dmODJmNDV";
|
||||
}
|
||||
@@ -27,7 +27,7 @@ public interface ISmsService
|
||||
|
||||
Task<double> GetCreditAmount();
|
||||
|
||||
public Task<bool> SendInstitutionCreationVerificationLink(string number, string fullName, Guid institutionId, long contractingPartyId, long institutionContractId);
|
||||
public Task<bool> SendInstitutionCreationVerificationLink(string number, string fullName, Guid institutionId, long contractingPartyId, long institutionContractId, string typeOfSms = null);
|
||||
|
||||
public Task<bool> SendInstitutionVerificationCode(string number, string code, string contractingPartyFullName,
|
||||
long contractingPartyId, long institutionContractId);
|
||||
|
||||
@@ -32,7 +32,7 @@ public static class StaticWorkshopAccounts
|
||||
/// 392 - عمار حسن دوست
|
||||
/// 20 - سمیرا الهی نیا
|
||||
/// </summary>
|
||||
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20];
|
||||
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20, 476];
|
||||
|
||||
/// <summary>
|
||||
/// این تاریخ در جدول اکانت لفت ورک به این معنیست
|
||||
|
||||
@@ -17,7 +17,7 @@ public class ExcelGenerator
|
||||
{
|
||||
public ExcelGenerator()
|
||||
{
|
||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
}
|
||||
public static byte[] GenerateExcel<T>(List<T> obj, string date = "") where T : class
|
||||
{
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
using System;
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using FluentValidation;
|
||||
using Microsoft.AspNetCore.Diagnostics;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
@@ -27,6 +30,14 @@ public class CustomExceptionHandler : IExceptionHandler
|
||||
|
||||
(string Detail, string Title, int StatusCode, Dictionary<string, object>? Extra) details = exception switch
|
||||
{
|
||||
ValidationException validationException =>
|
||||
(
|
||||
validationException.Errors.FirstOrDefault()?.ErrorMessage ?? "One or more validation errors occurred.",
|
||||
"Validation Error",
|
||||
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
||||
null
|
||||
),
|
||||
|
||||
InternalServerException =>
|
||||
(
|
||||
exception.Message,
|
||||
@@ -34,6 +45,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
||||
context.Response.StatusCode = StatusCodes.Status500InternalServerError,
|
||||
null
|
||||
),
|
||||
|
||||
BadRequestException bre =>
|
||||
(
|
||||
exception.Message,
|
||||
@@ -41,6 +53,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
||||
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
||||
bre.Extra
|
||||
),
|
||||
|
||||
NotFoundException =>
|
||||
(
|
||||
exception.Message,
|
||||
@@ -48,6 +61,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
||||
context.Response.StatusCode = StatusCodes.Status404NotFound,
|
||||
null
|
||||
),
|
||||
|
||||
UnAuthorizeException =>
|
||||
(
|
||||
exception.Message,
|
||||
@@ -55,6 +69,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
||||
context.Response.StatusCode = StatusCodes.Status401Unauthorized,
|
||||
null
|
||||
),
|
||||
|
||||
_ =>
|
||||
(
|
||||
exception.Message,
|
||||
@@ -73,8 +88,6 @@ public class CustomExceptionHandler : IExceptionHandler
|
||||
Extensions = details.Extra ?? new Dictionary<string, object>()
|
||||
};
|
||||
|
||||
|
||||
|
||||
problemDetails.Extensions.Add("traceId", context.TraceIdentifier);
|
||||
|
||||
await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken);
|
||||
|
||||
@@ -18,329 +18,387 @@ namespace _0_Framework.Infrastructure;
|
||||
/// </summary>
|
||||
public class FaceEmbeddingService : IFaceEmbeddingService
|
||||
{
|
||||
private readonly IHttpClientFactory _httpClientFactory;
|
||||
private readonly ILogger<FaceEmbeddingService> _logger;
|
||||
private readonly IFaceEmbeddingNotificationService _notificationService;
|
||||
private readonly string _apiBaseUrl;
|
||||
private readonly IHttpClientFactory _httpClientFactory;
|
||||
private readonly ILogger<FaceEmbeddingService> _logger;
|
||||
private readonly IFaceEmbeddingNotificationService _notificationService;
|
||||
private readonly string _apiBaseUrl;
|
||||
|
||||
public FaceEmbeddingService(IHttpClientFactory httpClientFactory, ILogger<FaceEmbeddingService> logger,
|
||||
IFaceEmbeddingNotificationService notificationService = null)
|
||||
{
|
||||
_httpClientFactory = httpClientFactory;
|
||||
_logger = logger;
|
||||
_notificationService = notificationService;
|
||||
_apiBaseUrl = "http://localhost:8000";
|
||||
}
|
||||
public FaceEmbeddingService(IHttpClientFactory httpClientFactory, ILogger<FaceEmbeddingService> logger,
|
||||
IFaceEmbeddingNotificationService notificationService = null)
|
||||
{
|
||||
_httpClientFactory = httpClientFactory;
|
||||
_logger = logger;
|
||||
_notificationService = notificationService;
|
||||
_apiBaseUrl = "http://localhost:8000";
|
||||
}
|
||||
|
||||
public async Task<OperationResult> GenerateEmbeddingsAsync(long employeeId, long workshopId,
|
||||
string employeeFullName, string picture1Path, string picture2Path)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
public async Task<OperationResult> GenerateEmbeddingsAsync(long employeeId, long workshopId,
|
||||
string employeeFullName, string picture1Path, string picture2Path)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
|
||||
using var content = new MultipartFormDataContent();
|
||||
using var content = new MultipartFormDataContent();
|
||||
|
||||
// Add form fields
|
||||
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
||||
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
||||
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
||||
// Add form fields
|
||||
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
||||
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
||||
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
||||
|
||||
// Add picture files
|
||||
if (File.Exists(picture1Path))
|
||||
{
|
||||
var picture1Bytes = await File.ReadAllBytesAsync(picture1Path);
|
||||
var picture1Content = new ByteArrayContent(picture1Bytes);
|
||||
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture1Content, "picture1", "1.jpg");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning("Picture1 not found at path: {Path}", picture1Path);
|
||||
return new OperationResult { IsSuccedded = false, Message = "تصویر اول یافت نشد" };
|
||||
}
|
||||
// Add picture files
|
||||
if (File.Exists(picture1Path))
|
||||
{
|
||||
var picture1Bytes = await File.ReadAllBytesAsync(picture1Path);
|
||||
var picture1Content = new ByteArrayContent(picture1Bytes);
|
||||
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture1Content, "picture1", "1.jpg");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning("Picture1 not found at path: {Path}", picture1Path);
|
||||
return new OperationResult { IsSuccedded = false, Message = "تصویر اول یافت نشد" };
|
||||
}
|
||||
|
||||
if (File.Exists(picture2Path))
|
||||
{
|
||||
var picture2Bytes = await File.ReadAllBytesAsync(picture2Path);
|
||||
var picture2Content = new ByteArrayContent(picture2Bytes);
|
||||
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture2Content, "picture2", "2.jpg");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning("Picture2 not found at path: {Path}", picture2Path);
|
||||
return new OperationResult { IsSuccedded = false, Message = "تصویر دوم یافت نشد" };
|
||||
}
|
||||
if (File.Exists(picture2Path))
|
||||
{
|
||||
var picture2Bytes = await File.ReadAllBytesAsync(picture2Path);
|
||||
var picture2Content = new ByteArrayContent(picture2Bytes);
|
||||
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture2Content, "picture2", "2.jpg");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning("Picture2 not found at path: {Path}", picture2Path);
|
||||
return new OperationResult { IsSuccedded = false, Message = "تصویر دوم یافت نشد" };
|
||||
}
|
||||
|
||||
// Send request to Python API
|
||||
var response = await httpClient.PostAsync("embeddings", content);
|
||||
// Send request to Python API
|
||||
var response = await httpClient.PostAsync("embeddings", content);
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogInformation("Embeddings generated successfully for Employee {EmployeeId}, Workshop {WorkshopId}",
|
||||
employeeId, workshopId);
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogInformation(
|
||||
"Embeddings generated successfully for Employee {EmployeeId}, Workshop {WorkshopId}",
|
||||
employeeId, workshopId);
|
||||
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
||||
}
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
||||
}
|
||||
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = true,
|
||||
Message = "Embedding با موفقیت ایجاد شد"
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to generate embeddings. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = true,
|
||||
Message = "Embedding با موفقیت ایجاد شد"
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to generate embeddings. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_logger.LogError(ex, "HTTP error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در ارتباط با سرور Embedding"
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطای غیرمنتظره در تولید Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_logger.LogError(ex, "HTTP error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در ارتباط با سرور Embedding"
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطای غیرمنتظره در تولید Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<OperationResult> GenerateEmbeddingsFromStreamAsync(long employeeId, long workshopId,
|
||||
string employeeFullName, Stream picture1Stream, Stream picture2Stream)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
public async Task<OperationResult> GenerateEmbeddingsFromStreamAsync(long employeeId, long workshopId,
|
||||
string employeeFullName, Stream picture1Stream, Stream picture2Stream)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
|
||||
using var content = new MultipartFormDataContent();
|
||||
using var content = new MultipartFormDataContent();
|
||||
|
||||
// Add form fields
|
||||
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
||||
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
||||
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
||||
// Add form fields
|
||||
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
||||
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
||||
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
||||
|
||||
// Add picture streams
|
||||
var picture1Content = new StreamContent(picture1Stream);
|
||||
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture1Content, "picture1", "1.jpg");
|
||||
// Add picture streams
|
||||
var picture1Content = new StreamContent(picture1Stream);
|
||||
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture1Content, "picture1", "1.jpg");
|
||||
|
||||
var picture2Content = new StreamContent(picture2Stream);
|
||||
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture2Content, "picture2", "2.jpg");
|
||||
var picture2Content = new StreamContent(picture2Stream);
|
||||
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||
content.Add(picture2Content, "picture2", "2.jpg");
|
||||
|
||||
// Send request to Python API
|
||||
var response = await httpClient.PostAsync("embeddings", content);
|
||||
// Send request to Python API
|
||||
var response = await httpClient.PostAsync("embeddings", content);
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
_logger.LogInformation("Embeddings generated successfully from streams for Employee {EmployeeId}", employeeId);
|
||||
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
||||
}
|
||||
|
||||
return new OperationResult { IsSuccedded = true, Message = "Embedding با موفقیت ایجاد شد" };
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to generate embeddings from streams. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
_logger.LogInformation("Embeddings generated successfully from streams for Employee {EmployeeId}",
|
||||
employeeId);
|
||||
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while generating embeddings from streams for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در تولید Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
||||
}
|
||||
|
||||
public async Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding,
|
||||
float confidence, Dictionary<string, object> metadata = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
return new OperationResult { IsSuccedded = true, Message = "Embedding با موفقیت ایجاد شد" };
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to generate embeddings from streams. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
|
||||
var requestBody = new
|
||||
{
|
||||
employeeId,
|
||||
workshopId,
|
||||
embedding,
|
||||
confidence,
|
||||
metadata = metadata ?? new Dictionary<string, object>()
|
||||
};
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while generating embeddings from streams for Employee {EmployeeId}",
|
||||
employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در تولید Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
var response = await httpClient.PostAsJsonAsync("embeddings/refine", requestBody);
|
||||
public async Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding,
|
||||
float confidence, Dictionary<string, object> metadata = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
_logger.LogInformation("Embedding refined successfully for Employee {EmployeeId}", employeeId);
|
||||
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingRefinedAsync(workshopId, employeeId);
|
||||
}
|
||||
|
||||
return new OperationResult { IsSuccedded = true, Message = "Embedding بهبود یافت" };
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to refine embedding. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
var requestBody = new
|
||||
{
|
||||
employeeId,
|
||||
workshopId,
|
||||
embedding,
|
||||
confidence,
|
||||
metadata = metadata ?? new Dictionary<string, object>()
|
||||
};
|
||||
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در بهبود Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while refining embedding for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در بهبود Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
var response = await httpClient.PostAsJsonAsync("embeddings/refine", requestBody);
|
||||
|
||||
public async Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
_logger.LogInformation("Embedding refined successfully for Employee {EmployeeId}", employeeId);
|
||||
|
||||
var response = await httpClient.DeleteAsync($"embeddings/{workshopId}/{employeeId}");
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingRefinedAsync(workshopId, employeeId);
|
||||
}
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
_logger.LogInformation("Embedding deleted successfully for Employee {EmployeeId}", employeeId);
|
||||
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingDeletedAsync(workshopId, employeeId);
|
||||
}
|
||||
|
||||
return new OperationResult { IsSuccedded = true, Message = "Embedding حذف شد" };
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to delete embedding. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
return new OperationResult { IsSuccedded = true, Message = "Embedding بهبود یافت" };
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to refine embedding. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در حذف Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while deleting embedding for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در حذف Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در بهبود Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while refining embedding for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در بهبود Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
public async Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
|
||||
var response = await httpClient.GetAsync($"embeddings/{workshopId}/{employeeId}");
|
||||
var response = await httpClient.DeleteAsync($"embeddings/{workshopId}/{employeeId}");
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
var content = await response.Content.ReadAsStringAsync();
|
||||
var embeddingData = JsonSerializer.Deserialize<FaceEmbeddingResponse>(content,
|
||||
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
_logger.LogInformation("Embedding deleted successfully for Employee {EmployeeId}", employeeId);
|
||||
|
||||
_logger.LogInformation("Embedding retrieved successfully for Employee {EmployeeId}", employeeId);
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
await _notificationService.NotifyEmbeddingDeletedAsync(workshopId, employeeId);
|
||||
}
|
||||
|
||||
return new OperationResult<FaceEmbeddingResponse>
|
||||
{
|
||||
IsSuccedded = true,
|
||||
Message = "Embedding دریافت شد",
|
||||
Data = embeddingData
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to get embedding. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
|
||||
return new OperationResult<FaceEmbeddingResponse>
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در دریافت Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while getting embedding for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult<FaceEmbeddingResponse>
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در دریافت Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
return new OperationResult { IsSuccedded = true, Message = "Embedding حذف شد" };
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to delete embedding. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در حذف Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while deleting embedding for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در حذف Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
|
||||
var response = await httpClient.GetAsync($"embeddings/{workshopId}/{employeeId}");
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
var content = await response.Content.ReadAsStringAsync();
|
||||
var embeddingData = JsonSerializer.Deserialize<FaceEmbeddingResponse>(content,
|
||||
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
|
||||
|
||||
_logger.LogInformation("Embedding retrieved successfully for Employee {EmployeeId}", employeeId);
|
||||
|
||||
return new OperationResult<FaceEmbeddingResponse>
|
||||
{
|
||||
IsSuccedded = true,
|
||||
Message = "Embedding دریافت شد",
|
||||
Data = embeddingData
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to get embedding. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
|
||||
return new OperationResult<FaceEmbeddingResponse>
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در دریافت Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while getting embedding for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult<FaceEmbeddingResponse>
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در دریافت Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<OperationResult> UpdateEmbeddingFullNameAsync(long employeeId, long workshopId,
|
||||
string newFullName)
|
||||
{
|
||||
try
|
||||
{
|
||||
var httpClient = _httpClientFactory.CreateClient();
|
||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||
|
||||
var requestBody = new
|
||||
{
|
||||
employee_id = employeeId,
|
||||
workshop_id = workshopId,
|
||||
employee_full_name = newFullName
|
||||
};
|
||||
|
||||
var response = await httpClient.PutAsJsonAsync("embeddings/update-name", requestBody);
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
_logger.LogInformation("Employee Name Changed For {EmployeeId} In workshop ={WorkshopId}", employeeId,
|
||||
workshopId);
|
||||
|
||||
// ارسال اطلاعرسانی به سایر سیستمها
|
||||
if (_notificationService != null)
|
||||
{
|
||||
//await _notificationService.NotifyEmbeddingRefinedAsync(workshopId, employeeId);
|
||||
}
|
||||
|
||||
return new OperationResult { IsSuccedded = true, Message = "عملیات با موفقیت انجام شد" };
|
||||
}
|
||||
else
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
_logger.LogError("Failed to refine embedding. Status: {StatusCode}, Error: {Error}",
|
||||
response.StatusCode, errorContent);
|
||||
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = $"خطا در بهبود Embedding: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error while Changing EmployeeFullName for Employee {EmployeeId}", employeeId);
|
||||
return new OperationResult
|
||||
{
|
||||
IsSuccedded = false,
|
||||
Message = "خطا در بهبود Embedding"
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,4 +27,3 @@ public class NullFaceEmbeddingNotificationService : IFaceEmbeddingNotificationSe
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using AccountManagement.Application.Contracts.Role;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.Account;
|
||||
|
||||
@@ -35,4 +36,20 @@ public class CreateAccount
|
||||
public string Email { get; set; }
|
||||
public string VerifyCode { get; set; }
|
||||
public string IsActiveString { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// آیا کاربر در پروگرام منیجر فعالیت مبکند؟
|
||||
/// </summary>
|
||||
public bool IsProgramManagerUser { get; set; }
|
||||
/// <summary>
|
||||
/// لیست نقش های پروگرام منیجر
|
||||
/// </summary>
|
||||
public List<long> UserRoles { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// لیست نقشهای موجود در پروگرام منیجر
|
||||
/// </summary>
|
||||
public SelectList RoleList { get; set; }
|
||||
|
||||
|
||||
}
|
||||
@@ -3,4 +3,5 @@
|
||||
public class EditAccount : CreateAccount
|
||||
{
|
||||
public long Id { get; set; }
|
||||
|
||||
}
|
||||
@@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.Account;
|
||||
namespace AccountManagement.Application.Contracts.Account;
|
||||
|
||||
public class EditClientAccount : RegisterAccount
|
||||
{
|
||||
|
||||
@@ -2,15 +2,21 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Shared.Contracts.PmUser.Queries;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.Account;
|
||||
|
||||
public interface IAccountApplication
|
||||
{
|
||||
AccountViewModel GetAccountBy(long id);
|
||||
OperationResult Create(CreateAccount command);
|
||||
/// <summary>
|
||||
/// ایجاد کاربر گزارشگیر و پروگرام منیجر
|
||||
/// </summary>
|
||||
/// <param name="command"></param>
|
||||
/// <returns></returns>
|
||||
Task<OperationResult> Create(CreateAccount command);
|
||||
OperationResult RegisterClient(RegisterAccount command);
|
||||
OperationResult Edit(EditAccount command);
|
||||
Task<OperationResult> Edit(EditAccount command);
|
||||
OperationResult EditClient(EditClientAccount command);
|
||||
OperationResult ChangePassword(ChangePassword command);
|
||||
OperationResult Login(Login command);
|
||||
@@ -67,6 +73,9 @@ public interface IAccountApplication
|
||||
List<AccountViewModel> GetAdminAccountsNew();
|
||||
|
||||
void CameraLogin(CameraLoginRequest request);
|
||||
|
||||
Task<GetPmUserDto> GetPmUserAsync(long accountId);
|
||||
|
||||
}
|
||||
|
||||
public class CameraLoginRequest
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.Application;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.Account;
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.Account;
|
||||
namespace AccountManagement.Application.Contracts.Account;
|
||||
|
||||
public class WorkshopSelectList
|
||||
{
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
||||
<ProjectReference Include="..\Shared.Contracts\Shared.Contracts.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||
|
||||
public record ApiResponse
|
||||
{
|
||||
public bool isSuccess { get; set; }
|
||||
public string errorMessage { get; set; }
|
||||
|
||||
|
||||
|
||||
public ErrorType ErrorType { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||
|
||||
|
||||
public record CreateProgramManagerRole
|
||||
{
|
||||
/// <summary>
|
||||
/// نام نقش
|
||||
/// </summary>
|
||||
public string RoleName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// کدهای دسترسی
|
||||
/// </summary>
|
||||
public List<int> Permissions { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// آی دی اکانت گزارشگیر
|
||||
/// </summary>
|
||||
public long? GozareshgirRoleId { get; set; }
|
||||
};
|
||||
@@ -0,0 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||
|
||||
public record CreateProgramManagerUser(string FullName, string UserName, string Password, string Mobile, string Email, long? AccountId, List<long> Roles);
|
||||
|
||||
public record EditUserCommand(string FullName, string UserName, string Mobile, long AccountId, List<long> Roles, bool IsActive);
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||
|
||||
public enum ErrorType
|
||||
{
|
||||
None,
|
||||
BadRequest,
|
||||
NotFound,
|
||||
Unauthorized,
|
||||
Validation,
|
||||
InternalServerError
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||
|
||||
public class RoleResponse
|
||||
{
|
||||
public bool isSuccess { get; set; }
|
||||
public RolesData data { get; set; }
|
||||
}
|
||||
|
||||
public class RolesData
|
||||
{
|
||||
public List<RoleList> role { get; set; }
|
||||
}
|
||||
|
||||
public class RoleList
|
||||
{
|
||||
public int id { get; set; }
|
||||
public string roleName { get; set; }
|
||||
public int gozareshgirRoleId { get; set; }
|
||||
public List<int> permissions { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System.Collections.Generic;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||
|
||||
public record SingleUserResponseResult
|
||||
{
|
||||
public bool isSuccess { get; set; }
|
||||
public SingleUserData Data { get; set; }
|
||||
};
|
||||
|
||||
public record SingleUserData
|
||||
|
||||
{
|
||||
public long id { get; set; }
|
||||
/// <summary>
|
||||
/// نام و نام خانوادگی
|
||||
/// </summary>
|
||||
public string fullName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// نام کاربری
|
||||
/// </summary>
|
||||
public string userName { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// مسیر عکس پروفایل
|
||||
/// </summary>
|
||||
public string profilePhotoPath { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// شماره موبایل
|
||||
/// </summary>
|
||||
public string mobile { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// فعال/غیر فعال بودن یوزر
|
||||
/// </summary>
|
||||
public bool isActive { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// گذرواژه
|
||||
/// </summary>
|
||||
public string password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ای دی اکانت کاربر در گزارشگیر
|
||||
/// </summary>
|
||||
public long? accountId { get; set; }
|
||||
|
||||
public List<long> Roles { get; set; }
|
||||
}
|
||||
@@ -9,6 +9,10 @@ namespace AccountManagement.Application.Contracts.Role
|
||||
[Required(ErrorMessage = ValidationMessages.IsRequired)]
|
||||
public string Name { get; set; }
|
||||
public List<int> Permissions { get; set; }
|
||||
/// <summary>
|
||||
/// لیست پرمیشن های پروگرام منیجر
|
||||
/// </summary>
|
||||
public List<int> PmPermissions { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,13 +1,26 @@
|
||||
using _0_Framework.Application;
|
||||
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Shared.Contracts.PmRole.Queries;
|
||||
|
||||
namespace AccountManagement.Application.Contracts.Role
|
||||
{
|
||||
public interface IRoleApplication
|
||||
{
|
||||
OperationResult Create(CreateRole command);
|
||||
OperationResult Edit(EditRole command);
|
||||
Task<OperationResult> Create(CreateRole command);
|
||||
Task<OperationResult> Edit(EditRole command);
|
||||
List<RoleViewModel> List();
|
||||
EditRole GetDetails(long id);
|
||||
|
||||
#region ProgramManager
|
||||
|
||||
Task<SelectList> GetPmRoleList(long? gozareshgirRoleId);
|
||||
Task<List<GetPmRolesDto>> GetPmRoleListToEdit(long? gozareshgirRoleId);
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,26 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using _0_Framework.Application;
|
||||
using _0_Framework.Application;
|
||||
using _0_Framework.Application.Sms;
|
||||
using _0_Framework.Exceptions;
|
||||
using AccountManagement.Application.Contracts.Account;
|
||||
using AccountManagement.Domain.AccountAgg;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.Application.Sms;
|
||||
using AccountManagement.Domain.AccountLeftWorkAgg;
|
||||
using AccountManagement.Domain.CameraAccountAgg;
|
||||
using AccountManagement.Domain.RoleAgg;
|
||||
using CompanyManagment.App.Contracts.Workshop;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
||||
using Company.Domain.WorkshopAgg;
|
||||
using System.Security.Claims;
|
||||
using _0_Framework.Exceptions;
|
||||
using AccountManagement.Domain.PositionAgg;
|
||||
using AccountManagement.Domain.RoleAgg;
|
||||
using AccountManagement.Domain.SubAccountAgg;
|
||||
using AccountManagement.Domain.SubAccountPermissionSubtitle1Agg;
|
||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||
using Company.Domain._common;
|
||||
using Company.Domain.WorkshopAgg;
|
||||
using Company.Domain.WorkshopSubAccountAgg;
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Shared.Contracts.PmUser.Commands;
|
||||
using Shared.Contracts.PmUser.Queries;
|
||||
|
||||
//using AccountManagement.Domain.RoleAgg;
|
||||
|
||||
@@ -39,15 +36,19 @@ public class AccountApplication : IAccountApplication
|
||||
private readonly ISmsService _smsService;
|
||||
private readonly ICameraAccountRepository _cameraAccountRepository;
|
||||
private readonly IPositionRepository _positionRepository;
|
||||
private readonly IAccountLeftworkRepository _accountLeftworkRepository;
|
||||
private readonly IAccountLeftworkRepository _accountLeftworkRepository;
|
||||
private readonly IWorkshopRepository _workshopRepository;
|
||||
private readonly ISubAccountRepository _subAccountRepository;
|
||||
private readonly ISubAccountRoleRepository _subAccountRoleRepository;
|
||||
private readonly IWorkshopSubAccountRepository _workshopSubAccountRepository;
|
||||
private readonly ISubAccountPermissionSubtitle1Repository _accountPermissionSubtitle1Repository;
|
||||
|
||||
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)
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
private readonly IPmUserQueryService _pmUserQueryService;
|
||||
private readonly IPmUserCommandService _pmUserCommandService;
|
||||
|
||||
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)
|
||||
{
|
||||
_authHelper = authHelper;
|
||||
_roleRepository = roleRepository;
|
||||
@@ -60,10 +61,14 @@ public class AccountApplication : IAccountApplication
|
||||
_subAccountRoleRepository = subAccountRoleRepository;
|
||||
_workshopSubAccountRepository = workshopSubAccountRepository;
|
||||
_accountPermissionSubtitle1Repository = accountPermissionSubtitle1Repository;
|
||||
_unitOfWork = unitOfWork;
|
||||
|
||||
_pmUserQueryService = pmUserQueryService;
|
||||
_pmUserCommandService = pmUserCommandService;
|
||||
_fileUploader = fileUploader;
|
||||
_passwordHasher = passwordHasher;
|
||||
_accountRepository = accountRepository;
|
||||
|
||||
|
||||
}
|
||||
|
||||
public OperationResult EditClient(EditClientAccount command)
|
||||
@@ -92,7 +97,7 @@ public class AccountApplication : IAccountApplication
|
||||
|
||||
var path = $"profilePhotos";
|
||||
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();
|
||||
return opreation.Succcedded();
|
||||
}
|
||||
@@ -123,7 +128,7 @@ public class AccountApplication : IAccountApplication
|
||||
};
|
||||
}
|
||||
|
||||
public OperationResult Create(CreateAccount command)
|
||||
public async Task<OperationResult> Create(CreateAccount command)
|
||||
{
|
||||
var operation = new OperationResult();
|
||||
|
||||
@@ -133,15 +138,59 @@ public class AccountApplication : IAccountApplication
|
||||
var password = _passwordHasher.Hash(command.Password);
|
||||
var roleName = _roleRepository.GetDetails(command.RoleId);
|
||||
var path = $"profilePhotos";
|
||||
var picturePath = "";
|
||||
if (_fileUploader != null)
|
||||
{
|
||||
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
||||
picturePath, roleName.Name,"true","false");
|
||||
_accountRepository.Create(account);
|
||||
picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||
|
||||
}
|
||||
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
||||
picturePath, roleName.Name, "true", "false");
|
||||
|
||||
_unitOfWork.BeginAccountContext();
|
||||
|
||||
|
||||
_accountRepository.Create(account);
|
||||
_accountRepository.SaveChanges();
|
||||
|
||||
if (command.IsProgramManagerUser)
|
||||
{
|
||||
if (command.UserRoles == null)
|
||||
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username, account.Password, command.Mobile,
|
||||
null, account.id, pmUserRoles));
|
||||
if (!createPm.isSuccess)
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("خطا در ویرایش کاربر پروگرام منیجر");
|
||||
}
|
||||
|
||||
|
||||
|
||||
//var url = "api/user/create";
|
||||
//var key = SecretKeys.ProgramManagerInternalApi;
|
||||
|
||||
//var response = InternalApiCaller.PostAsync<CreateProgramManagerUser, ApiResponse>(
|
||||
// url,
|
||||
// key,
|
||||
// parameters
|
||||
//);
|
||||
|
||||
//if (!response.Success)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Error);
|
||||
//}
|
||||
|
||||
//if (!response.Result.isSuccess)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Result.errorMessage);
|
||||
//}
|
||||
}
|
||||
|
||||
_accountRepository.SaveChanges();
|
||||
_unitOfWork.CommitAccountContext();
|
||||
return operation.Succcedded();
|
||||
}
|
||||
|
||||
@@ -155,8 +204,8 @@ public class AccountApplication : IAccountApplication
|
||||
return opreation.Failed("پر کردن تمامی فیلدها الزامی است");
|
||||
if (_accountRepository.Exists(x => x.Username == command.Username))
|
||||
return opreation.Failed("نام کاربری تکراری است");
|
||||
if (_accountRepository.Exists(x => x.Mobile == command.Mobile && x.IsActiveString =="true"))
|
||||
|
||||
if (_accountRepository.Exists(x => x.Mobile == command.Mobile && x.IsActiveString == "true"))
|
||||
|
||||
return opreation.Failed("مقادیر وارد شده تکراری است");
|
||||
|
||||
//var nationalCodeValidation = command.NationalCode.NationalCodeValid();
|
||||
@@ -173,14 +222,14 @@ public class AccountApplication : IAccountApplication
|
||||
// break;
|
||||
//}
|
||||
var password = _passwordHasher.Hash(command.Password);
|
||||
var register =new Account(command.Fullname,command.Username, password, command.Mobile, command.NationalCode);
|
||||
var register = new Account(command.Fullname, command.Username, password, command.Mobile, command.NationalCode);
|
||||
_accountRepository.Create(register);
|
||||
_accountRepository.SaveChanges();
|
||||
|
||||
return opreation.Succcedded(register.id,message: "ثبت نام شما با موفقیت انجام شد");
|
||||
return opreation.Succcedded(register.id, message: "ثبت نام شما با موفقیت انجام شد");
|
||||
}
|
||||
|
||||
public OperationResult Edit(EditAccount command)
|
||||
public async Task<OperationResult> Edit(EditAccount command)
|
||||
{
|
||||
var operation = new OperationResult();
|
||||
var account = _accountRepository.Get(command.Id);
|
||||
@@ -194,8 +243,129 @@ public class AccountApplication : IAccountApplication
|
||||
var roleName = _roleRepository.GetDetails(command.RoleId);
|
||||
var path = $"profilePhotos";
|
||||
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||
_unitOfWork.BeginAccountContext();
|
||||
account.Edit(command.Fullname, command.Username, command.Mobile, command.RoleId, picturePath, roleName.Name);
|
||||
_accountRepository.SaveChanges();
|
||||
var key = SecretKeys.ProgramManagerInternalApi;
|
||||
|
||||
//var apiResult = InternalApiCaller.GetAsync<SingleUserResponseResult>(
|
||||
// $"api/user/{account.id}",
|
||||
// key
|
||||
//);
|
||||
var userResult =await _pmUserQueryService.GetPmUserDataByAccountId(account.id);
|
||||
|
||||
if (command.UserRoles == null)
|
||||
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||
|
||||
//اگر کاربر در پروگرام منیجر قبلا ایجاد شده
|
||||
if (userResult.Id >0)
|
||||
{
|
||||
if (!command.UserRoles.Any())
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
||||
}
|
||||
|
||||
var editPm =await _pmUserCommandService.Edit(new EditPmUserDto(command.Fullname, command.Username, command.Mobile, account.id, pmUserRoles,
|
||||
command.IsProgramManagerUser));
|
||||
if (!editPm.isSuccess)
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("خطا در ویرایش کاربر پروگرام منیجر");
|
||||
}
|
||||
|
||||
//var parameters = new EditUserCommand(
|
||||
// command.Fullname,
|
||||
// command.Username,
|
||||
// command.Mobile,
|
||||
// account.id,
|
||||
// command.UserRoles,
|
||||
// command.IsProgramManagerUser
|
||||
//);
|
||||
//var url = "api/user/edit";
|
||||
//var response = InternalApiCaller.PostAsync<EditUserCommand, ApiResponse>(
|
||||
// url,
|
||||
// key,
|
||||
// parameters
|
||||
//);
|
||||
|
||||
//if (!response.Success)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Error);
|
||||
|
||||
//}
|
||||
|
||||
//if (!response.Result.isSuccess)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Error);
|
||||
//}
|
||||
|
||||
}
|
||||
else //اگر کاربر قبلا ایجاد نشده
|
||||
{
|
||||
//اگر تیک فعالیت در پروگرام منیجر روشن بود
|
||||
if (command.IsProgramManagerUser)
|
||||
{
|
||||
if (!command.UserRoles.Any())
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username, account.Password, command.Mobile,
|
||||
null, account.id, pmUserRoles));
|
||||
if (!createPm.isSuccess)
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("خطا در ویرایش کاربر پروگرام منیجر");
|
||||
}
|
||||
|
||||
|
||||
|
||||
//var parameters = new CreateProgramManagerUser(
|
||||
// command.Fullname,
|
||||
// command.Username,
|
||||
// account.Password,
|
||||
// command.Mobile,
|
||||
// command.Email,
|
||||
// account.id,
|
||||
// command.UserRoles
|
||||
//);
|
||||
|
||||
//var url = "api/user/Create";
|
||||
|
||||
|
||||
//var response = InternalApiCaller.PostAsync<CreateProgramManagerUser, ApiResponse>(
|
||||
// url,
|
||||
// key,
|
||||
// parameters
|
||||
//);
|
||||
|
||||
//if (!response.Success)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Error);
|
||||
|
||||
//}
|
||||
|
||||
//if (!response.Result.isSuccess)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Error);
|
||||
//}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
_unitOfWork.CommitAccountContext();
|
||||
return operation.Succcedded();
|
||||
}
|
||||
|
||||
@@ -210,18 +380,18 @@ public class AccountApplication : IAccountApplication
|
||||
long idAutoriz = 0;
|
||||
var operation = new OperationResult();
|
||||
if (string.IsNullOrWhiteSpace(command.Password))
|
||||
return operation.Failed(ApplicationMessages.EmptyPassword);
|
||||
return operation.Failed(ApplicationMessages.EmptyPassword);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(command.Username))
|
||||
return operation.Failed(ApplicationMessages.EmptyUsername);
|
||||
return operation.Failed(ApplicationMessages.EmptyUsername);
|
||||
|
||||
var account = _accountRepository.GetBy(command.Username);
|
||||
var account = _accountRepository.GetBy(command.Username);
|
||||
var cameraAccount = _cameraAccountRepository.GetBy(command.Username);
|
||||
SubAccount subAccount = _subAccountRepository.GetBy(command.Username);
|
||||
if (account == null && cameraAccount == null && subAccount == null)
|
||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||
SubAccount subAccount = _subAccountRepository.GetBy(command.Username);
|
||||
if (account == null && cameraAccount == null && subAccount == null)
|
||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||
|
||||
if (account != null)
|
||||
if (account != null)
|
||||
{
|
||||
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(account.Password, command.Password);
|
||||
if (!result.Verified)
|
||||
@@ -230,6 +400,23 @@ public class AccountApplication : IAccountApplication
|
||||
.Permissions
|
||||
.Select(x => x.Code)
|
||||
.ToList();
|
||||
//PmPermission
|
||||
var PmUserData = _pmUserQueryService.GetPmUserDataByAccountId(account.id).GetAwaiter().GetResult();
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
int? positionValue;
|
||||
if (account.PositionId != null)
|
||||
{
|
||||
@@ -239,14 +426,17 @@ public class AccountApplication : IAccountApplication
|
||||
{
|
||||
positionValue = null;
|
||||
}
|
||||
var pmUserId = PmUserData.AccountId > 0 ? PmUserData.AccountId : null;
|
||||
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,0,pmUserId);
|
||||
|
||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||
account.IsActiveString == "true")
|
||||
{
|
||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||
authViewModel.Permissions = clientPermissions;
|
||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||
authViewModel.Permissions = clientPermissions;
|
||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||
{
|
||||
PersonnelCount = x.PersonnelCount,
|
||||
@@ -255,14 +445,14 @@ public class AccountApplication : IAccountApplication
|
||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||
authViewModel.WorkshopList = workshopList;
|
||||
if (workshopList.Any())
|
||||
{
|
||||
var workshop = workshopList.First();
|
||||
authViewModel.WorkshopName = workshop.Name;
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||
if (workshopList.Any())
|
||||
{
|
||||
var workshop = workshopList.First();
|
||||
authViewModel.WorkshopName = workshop.Name;
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||
authViewModel.WorkshopId = workshop.Id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_authHelper.Signin(authViewModel);
|
||||
|
||||
@@ -281,7 +471,7 @@ public class AccountApplication : IAccountApplication
|
||||
|
||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||
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")
|
||||
{
|
||||
_authHelper.CameraSignIn(authViewModel);
|
||||
@@ -291,41 +481,41 @@ public class AccountApplication : IAccountApplication
|
||||
{
|
||||
idAutoriz = 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (subAccount != null)
|
||||
{
|
||||
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(subAccount.Password, command.Password);
|
||||
if (!result.Verified)
|
||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||
var role = _subAccountRoleRepository.Get(subAccount.SubAccountRoleId);
|
||||
if (subAccount != null)
|
||||
{
|
||||
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(subAccount.Password, command.Password);
|
||||
if (!result.Verified)
|
||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||
var role = _subAccountRoleRepository.Get(subAccount.SubAccountRoleId);
|
||||
|
||||
var permissions = role.RolePermissions.Select(x => x.PermissionCode).ToList();
|
||||
var authViewModel = new AuthViewModel(subAccount.AccountId, subAccount.SubAccountRoleId, subAccount.FullName
|
||||
, subAccount.Username, subAccount.PhoneNumber, "", permissions, role.Title, "false",
|
||||
"true", 0, subAccount.id);
|
||||
var workshopList = _workshopSubAccountRepository.GetWorkshopsBySubAccountId(subAccount.id);
|
||||
authViewModel.WorkshopList = workshopList.Select(x => new WorkshopClaim()
|
||||
{
|
||||
Slug = _passwordHasher.SlugHasher(x.WorkshopId),
|
||||
Name = x.WorkshopName,
|
||||
PersonnelCount = x.PersonnelCount,
|
||||
Id = x.WorkshopId
|
||||
}).ToList();
|
||||
var permissions = role.RolePermissions.Select(x => x.PermissionCode).ToList();
|
||||
var authViewModel = new AuthViewModel(subAccount.AccountId, subAccount.SubAccountRoleId, subAccount.FullName
|
||||
, subAccount.Username, subAccount.PhoneNumber, "", permissions, role.Title, "false",
|
||||
"true", 0, subAccount.id);
|
||||
var workshopList = _workshopSubAccountRepository.GetWorkshopsBySubAccountId(subAccount.id);
|
||||
authViewModel.WorkshopList = workshopList.Select(x => new WorkshopClaim()
|
||||
{
|
||||
Slug = _passwordHasher.SlugHasher(x.WorkshopId),
|
||||
Name = x.WorkshopName,
|
||||
PersonnelCount = x.PersonnelCount,
|
||||
Id = x.WorkshopId
|
||||
}).ToList();
|
||||
|
||||
if (workshopList.Any())
|
||||
{
|
||||
var workshop = workshopList.First();
|
||||
authViewModel.WorkshopName = workshop.WorkshopName;
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
||||
if (workshopList.Any())
|
||||
{
|
||||
var workshop = workshopList.First();
|
||||
authViewModel.WorkshopName = workshop.WorkshopName;
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
||||
authViewModel.WorkshopId = workshop.WorkshopId;
|
||||
}
|
||||
_authHelper.Signin(authViewModel);
|
||||
idAutoriz = 2;
|
||||
}
|
||||
}
|
||||
_authHelper.Signin(authViewModel);
|
||||
idAutoriz = 2;
|
||||
}
|
||||
|
||||
return operation.Succcedded(idAutoriz);
|
||||
return operation.Succcedded(idAutoriz);
|
||||
}
|
||||
public OperationResult LoginWithMobile(long id)
|
||||
{
|
||||
@@ -356,24 +546,24 @@ public class AccountApplication : IAccountApplication
|
||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||
account.IsActiveString == "true")
|
||||
{
|
||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||
authViewModel.Permissions = clientPermissions;
|
||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||
{
|
||||
PersonnelCount = x.PersonnelCount,
|
||||
Id = x.Id,
|
||||
Name = x.WorkshopFullName,
|
||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||
authViewModel.WorkshopList = workshopList;
|
||||
if (workshopList.Any())
|
||||
{
|
||||
var workshop = workshopList.First();
|
||||
authViewModel.WorkshopName = workshop.Name;
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||
authViewModel.Permissions = clientPermissions;
|
||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||
{
|
||||
PersonnelCount = x.PersonnelCount,
|
||||
Id = x.Id,
|
||||
Name = x.WorkshopFullName,
|
||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||
authViewModel.WorkshopList = workshopList;
|
||||
if (workshopList.Any())
|
||||
{
|
||||
var workshop = workshopList.First();
|
||||
authViewModel.WorkshopName = workshop.Name;
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||
authViewModel.WorkshopId = workshop.Id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_authHelper.Signin(authViewModel);
|
||||
long idAutoriz = 0;
|
||||
@@ -429,7 +619,7 @@ public class AccountApplication : IAccountApplication
|
||||
return _accountRepository.GetByUserNameAndId(id, username);
|
||||
}
|
||||
|
||||
public async Task <OperationResult> SetVerifyCode(string phone, long id)
|
||||
public async Task<OperationResult> SetVerifyCode(string phone, long id)
|
||||
{
|
||||
var operation = new OperationResult();
|
||||
var account = _accountRepository.Get(id);
|
||||
@@ -443,11 +633,11 @@ public class AccountApplication : IAccountApplication
|
||||
_smsService.LoginSend(phone, r);
|
||||
|
||||
//TimeSpan delay = TimeSpan.FromSeconds(30);
|
||||
|
||||
|
||||
await _accountRepository.RemoveCode(id);
|
||||
|
||||
|
||||
return operation.Succcedded();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -498,67 +688,67 @@ public class AccountApplication : IAccountApplication
|
||||
.Select(x => x.Code)
|
||||
.ToList();
|
||||
|
||||
|
||||
|
||||
_authHelper.SignOut();
|
||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true",null);
|
||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||
{
|
||||
PersonnelCount = x.PersonnelCount,
|
||||
Id = x.Id,
|
||||
Name = x.WorkshopFullName,
|
||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true", null);
|
||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||
{
|
||||
PersonnelCount = x.PersonnelCount,
|
||||
Id = x.Id,
|
||||
Name = x.WorkshopFullName,
|
||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||
|
||||
authViewModel.WorkshopList = workshopList;
|
||||
authViewModel.WorkshopList = workshopList;
|
||||
|
||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||
authViewModel.Permissions = clientPermissions;
|
||||
if (authViewModel.WorkshopList.Any())
|
||||
{
|
||||
var workshop = authViewModel.WorkshopList.First();
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||
authViewModel.WorkshopName = workshop.Name;
|
||||
if (authViewModel.WorkshopList.Any())
|
||||
{
|
||||
var workshop = authViewModel.WorkshopList.First();
|
||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||
authViewModel.WorkshopName = workshop.Name;
|
||||
authViewModel.WorkshopId = workshop.Id;
|
||||
}
|
||||
_authHelper.Signin(authViewModel);
|
||||
}
|
||||
_authHelper.Signin(authViewModel);
|
||||
return operation.Succcedded(2);
|
||||
}
|
||||
public OperationResult DirectCameraLogin(long cameraAccountId)
|
||||
{
|
||||
var prAcc = _authHelper.CurrentAccountInfo();
|
||||
var operation = new OperationResult();
|
||||
var cameraAccount = _cameraAccountRepository.GetById(cameraAccountId);
|
||||
if (cameraAccount == null)
|
||||
return operation.Failed("این اکانت وجود ندارد");
|
||||
var prAcc = _authHelper.CurrentAccountInfo();
|
||||
var operation = new OperationResult();
|
||||
var cameraAccount = _cameraAccountRepository.GetById(cameraAccountId);
|
||||
if (cameraAccount == null)
|
||||
return operation.Failed("این اکانت وجود ندارد");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
_authHelper.SignOut();
|
||||
_authHelper.SignOut();
|
||||
|
||||
|
||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId, cameraAccount.IsActiveSting);
|
||||
if (cameraAccount.IsActiveSting == "true")
|
||||
{
|
||||
_authHelper.CameraSignIn(authViewModel);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return operation.Failed("این اکانت غیر فعال شده است");
|
||||
}
|
||||
return operation.Succcedded(2);
|
||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId, cameraAccount.IsActiveSting);
|
||||
if (cameraAccount.IsActiveSting == "true")
|
||||
{
|
||||
_authHelper.CameraSignIn(authViewModel);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return operation.Failed("این اکانت غیر فعال شده است");
|
||||
}
|
||||
return operation.Succcedded(2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public AccountLeftWorkViewModel WorkshopList(long accountId)
|
||||
{
|
||||
string fullname = this._accountRepository.GetById(accountId).Fullname;
|
||||
List<WorkshopAccountlistViewModel> source =_accountLeftworkRepository.WorkshopList(accountId);
|
||||
List<WorkshopAccountlistViewModel> source = _accountLeftworkRepository.WorkshopList(accountId);
|
||||
List<long> userWorkshopIds = source.Select(x => x.WorkshopId).ToList();
|
||||
List<WorkshopSelectList> allWorkshops = this._accountLeftworkRepository.GetAllWorkshops();
|
||||
List<AccountViewModel> accountSelectList = this._accountRepository.GetAdminAccountSelectList();
|
||||
@@ -641,65 +831,65 @@ public class AccountApplication : IAccountApplication
|
||||
#region Pooya
|
||||
public OperationResult IsPhoneNumberAndPasswordValid(long accountId, string phoneNumber, string password, string rePassword)
|
||||
{
|
||||
OperationResult op = new();
|
||||
OperationResult op = new();
|
||||
|
||||
var entity = _accountRepository.Get(accountId);
|
||||
var entity = _accountRepository.Get(accountId);
|
||||
|
||||
if (entity == null)
|
||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||
if (entity == null)
|
||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(rePassword) || !string.IsNullOrWhiteSpace(password))
|
||||
{
|
||||
if (rePassword != password)
|
||||
return op.Failed("تکرار رمز عبور با رمز عبور مطابقت ندارد");
|
||||
if (!string.IsNullOrWhiteSpace(rePassword) || !string.IsNullOrWhiteSpace(password))
|
||||
{
|
||||
if (rePassword != password)
|
||||
return op.Failed("تکرار رمز عبور با رمز عبور مطابقت ندارد");
|
||||
|
||||
if (password.Length < 8)
|
||||
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
||||
}
|
||||
if (password.Length < 8)
|
||||
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
||||
}
|
||||
|
||||
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) && string.IsNullOrWhiteSpace(rePassword))
|
||||
return op.Failed("چیزی برای تغییر وجود ندارد");
|
||||
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) && string.IsNullOrWhiteSpace(rePassword))
|
||||
return op.Failed("چیزی برای تغییر وجود ندارد");
|
||||
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(phoneNumber) && entity.Mobile != phoneNumber)
|
||||
{
|
||||
phoneNumber = phoneNumber.Trim();
|
||||
if (phoneNumber.Length != 11)
|
||||
return op.Failed("شماره تلفن همراه به درستی وارد نشده است");
|
||||
if (_accountRepository.Exists(x => x.Mobile == phoneNumber && x.id != accountId) ||
|
||||
_subAccountRepository.Exists(x => x.PhoneNumber == phoneNumber) ||
|
||||
_cameraAccountRepository.Exists(x => x.Mobile == phoneNumber))
|
||||
return op.Failed("قبلا یک حساب با این شماره ثبت شده است");
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(phoneNumber) && entity.Mobile != phoneNumber)
|
||||
{
|
||||
phoneNumber = phoneNumber.Trim();
|
||||
if (phoneNumber.Length != 11)
|
||||
return op.Failed("شماره تلفن همراه به درستی وارد نشده است");
|
||||
if (_accountRepository.Exists(x => x.Mobile == phoneNumber && x.id != accountId) ||
|
||||
_subAccountRepository.Exists(x => x.PhoneNumber == phoneNumber) ||
|
||||
_cameraAccountRepository.Exists(x => x.Mobile == phoneNumber))
|
||||
return op.Failed("قبلا یک حساب با این شماره ثبت شده است");
|
||||
}
|
||||
|
||||
|
||||
return op.Succcedded();
|
||||
}
|
||||
return op.Succcedded();
|
||||
}
|
||||
|
||||
public OperationResult ChangePasswordAndPhoneNumber(AccountChangePasswordAndPhoneNumber command)
|
||||
{
|
||||
OperationResult op = new();
|
||||
command.PhoneNumber = command.PhoneNumber.Trim();
|
||||
var entity = _accountRepository.Get(command.AccountId);
|
||||
if (entity == null)
|
||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password, command.RePassword);
|
||||
if (validationResult.IsSuccedded == false)
|
||||
return validationResult;
|
||||
OperationResult op = new();
|
||||
command.PhoneNumber = command.PhoneNumber.Trim();
|
||||
var entity = _accountRepository.Get(command.AccountId);
|
||||
if (entity == null)
|
||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password, command.RePassword);
|
||||
if (validationResult.IsSuccedded == false)
|
||||
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))
|
||||
{
|
||||
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto, entity.RoleName);
|
||||
}
|
||||
_accountRepository.SaveChanges();
|
||||
return op.Succcedded();
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(command.PhoneNumber))
|
||||
{
|
||||
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto, entity.RoleName);
|
||||
}
|
||||
_accountRepository.SaveChanges();
|
||||
return op.Succcedded();
|
||||
}
|
||||
//public UserClaimsResponseDTO GetClaimsForSignIn(Login command)
|
||||
//{
|
||||
// var operation = new OperationResult();
|
||||
@@ -815,12 +1005,12 @@ public class AccountApplication : IAccountApplication
|
||||
}
|
||||
|
||||
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(cameraAccount.Password, request.Password);
|
||||
|
||||
|
||||
if (!result.Verified)
|
||||
throw new BadRequestException(ApplicationMessages.WrongUserPass);
|
||||
|
||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||
|
||||
|
||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,
|
||||
cameraAccount.IsActiveSting);
|
||||
@@ -829,4 +1019,9 @@ public class AccountApplication : IAccountApplication
|
||||
|
||||
_authHelper.CameraSignIn(authViewModel);
|
||||
}
|
||||
|
||||
public async Task<GetPmUserDto> GetPmUserAsync(long accountId)
|
||||
{
|
||||
return await _pmUserQueryService.GetPmUserDataByAccountId(accountId);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AccountManagement.Application.Contracts\AccountManagement.Application.Contracts.csproj" />
|
||||
<ProjectReference Include="..\AccountManagement.Domain\AccountManagement.Domain.csproj" />
|
||||
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
||||
<ProjectReference Include="..\Shared.Contracts\Shared.Contracts.csproj" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.Application;
|
||||
using AccountManagement.Application.Contracts.Account;
|
||||
using AccountManagement.Application.Contracts.CameraAccount;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using _0_Framework.Application;
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
using AccountManagement.Application.Contracts.Role;
|
||||
using AccountManagement.Domain.RoleAgg;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Company.Domain._common;
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
using Shared.Contracts.PmRole.Commands;
|
||||
using GetPmRolesDto = Shared.Contracts.PmRole.Queries.GetPmRolesDto;
|
||||
using Role = AccountManagement.Domain.RoleAgg.Role;
|
||||
using Shared.Contracts.PmRole.Queries;
|
||||
|
||||
namespace AccountManagement.Application;
|
||||
|
||||
@@ -9,32 +17,82 @@ public class RoleApplication : IRoleApplication
|
||||
{
|
||||
private readonly IRoleRepository _roleRepository;
|
||||
|
||||
public RoleApplication(IRoleRepository roleRepository)
|
||||
private readonly IPmRoleQueryService _pmRoleQueryService;
|
||||
private readonly IPmRoleCommandService _pmRoleCommandService;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public RoleApplication(IRoleRepository roleRepository, IUnitOfWork unitOfWork, IPmRoleQueryService pmRoleQueryService, IPmRoleCommandService pmRoleCommandService)
|
||||
{
|
||||
_roleRepository = roleRepository;
|
||||
_unitOfWork = unitOfWork;
|
||||
_pmRoleQueryService = pmRoleQueryService;
|
||||
_pmRoleCommandService = pmRoleCommandService;
|
||||
}
|
||||
|
||||
public OperationResult Create(CreateRole command)
|
||||
public async Task<OperationResult> Create(CreateRole command)
|
||||
{
|
||||
var operation = new OperationResult();
|
||||
if (_roleRepository.Exists(x => x.Name == command.Name))
|
||||
return operation.Failed(ApplicationMessages.DuplicatedRecord);
|
||||
var permissions = new List<Permission>();
|
||||
foreach (var code in command.Permissions)
|
||||
{
|
||||
if (code > 0)
|
||||
{
|
||||
permissions.Add(new Permission(code));
|
||||
}
|
||||
}
|
||||
//command.Permissions.ForEach(code => permissions.Add(new Permission(code)));
|
||||
var permissions = command.Permissions.Where(x => x > 0).Select(x => new Permission(x)).ToList();
|
||||
var role = new Role(command.Name, permissions);
|
||||
_unitOfWork.BeginAccountContext();
|
||||
|
||||
_roleRepository.Create(role);
|
||||
_roleRepository.SaveChanges();
|
||||
|
||||
var pmPermissions = command.PmPermissions.Where(x => x > 0).ToList();
|
||||
if (pmPermissions.Any())
|
||||
{
|
||||
|
||||
var pmRole = new CreatePmRoleDto{ RoleName = command.Name, Permissions = pmPermissions, GozareshgirRoleId = role.id};
|
||||
var res =await _pmRoleCommandService.Create(pmRole);
|
||||
if (!res.Item1)
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||
}
|
||||
|
||||
|
||||
//var parameters = new CreateProgramManagerRole
|
||||
//{
|
||||
// RoleName = command.Name,
|
||||
// Permissions = pmPermissions,
|
||||
// GozareshgirRoleId = role.id
|
||||
|
||||
//};
|
||||
|
||||
//var url = "api/role";
|
||||
//var key = SecretKeys.ProgramManagerInternalApi;
|
||||
|
||||
//var response = InternalApiCaller.PostAsync<CreateProgramManagerRole, ApiResponse>(
|
||||
// url,
|
||||
// key,
|
||||
// parameters
|
||||
//);
|
||||
|
||||
|
||||
//if (!response.Success)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed("ارتباط با اپلیکیش پروگرام منیجر برقرار نشد");
|
||||
//}
|
||||
|
||||
//if (!response.Result.isSuccess)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Result.errorMessage);
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//command.Permissions.ForEach(code => permissions.Add(new Permission(code)));
|
||||
_unitOfWork.CommitAccountContext();
|
||||
return operation.Succcedded();
|
||||
}
|
||||
|
||||
public OperationResult Edit(EditRole command)
|
||||
public async Task<OperationResult> Edit(EditRole command)
|
||||
{
|
||||
var operation = new OperationResult();
|
||||
var role = _roleRepository.Get(command.Id);
|
||||
@@ -47,17 +105,134 @@ public class RoleApplication : IRoleApplication
|
||||
//var permissions = new List<Permission>();
|
||||
//command.Permissions.ForEach(code => permissions.Add(new Permission(code)));
|
||||
|
||||
var permissions = new List<Permission>();
|
||||
foreach (var code in command.Permissions)
|
||||
{
|
||||
if (code > 0)
|
||||
{
|
||||
permissions.Add(new Permission(code));
|
||||
}
|
||||
}
|
||||
var permissions = command.Permissions.Where(x => x > 0).Select(x => new Permission(x)).ToList();
|
||||
|
||||
|
||||
|
||||
_unitOfWork.BeginAccountContext();
|
||||
role.Edit(command.Name, permissions);
|
||||
_roleRepository.SaveChanges();
|
||||
var key = SecretKeys.ProgramManagerInternalApi;
|
||||
var pmPermissions = command.PmPermissions.Where(x => x > 0).ToList();
|
||||
|
||||
|
||||
//یافتن نقش در پروگرام منیجر
|
||||
//var apiResult = InternalApiCaller.GetAsync<RoleResponse>(
|
||||
// "api/role",
|
||||
// key,
|
||||
// new Dictionary<string, object>
|
||||
// {
|
||||
// { "RoleName", "" },
|
||||
|
||||
// { "GozareshgirRoleId", command.Id}
|
||||
// }
|
||||
//);
|
||||
|
||||
|
||||
var pmRoleListResult = await _pmRoleQueryService.GetPmRoleList(command.Id);
|
||||
var pmRoleResult = pmRoleListResult.FirstOrDefault();
|
||||
|
||||
//اگر این نقش در پروگرام منیجر وجود داشت ویرایش کن
|
||||
if (pmRoleResult != null)
|
||||
{
|
||||
var edit = new CreatePmRoleDto { RoleName = command.Name, Permissions = pmPermissions, GozareshgirRoleId = role.id };
|
||||
var res = await _pmRoleCommandService.Edit(edit);
|
||||
if (!res.Item1)
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||
}
|
||||
|
||||
|
||||
|
||||
//var parameters = new CreateProgramManagerRole
|
||||
//{
|
||||
// RoleName = command.Name,
|
||||
// Permissions = pmPermissions,
|
||||
// GozareshgirRoleId = role.id
|
||||
|
||||
//};
|
||||
//var url = "api/role/edit";
|
||||
//var response = InternalApiCaller.PostAsync<CreateProgramManagerRole, ApiResponse>(
|
||||
// url,
|
||||
// key,
|
||||
// parameters
|
||||
//);
|
||||
|
||||
|
||||
//if (!response.Success)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed("ارتباط با اپلیکیش پروگرام منیجر برقرار نشد");
|
||||
//}
|
||||
|
||||
//if (!response.Result.isSuccess)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Result.errorMessage);
|
||||
//}
|
||||
}
|
||||
else //اگر نقش در پروگرام منیجر وجود نداشت
|
||||
{
|
||||
|
||||
//اگر تیک پرمیشن های پروگرام منیجر زده شده
|
||||
//این نقش را سمت پروگرام منیجر بساز
|
||||
if (pmPermissions.Any())
|
||||
{
|
||||
var pmRole = new CreatePmRoleDto { RoleName = command.Name, Permissions = pmPermissions, GozareshgirRoleId = role.id };
|
||||
var res = await _pmRoleCommandService.Create(pmRole);
|
||||
if (!res.Item1)
|
||||
{
|
||||
_unitOfWork.RollbackAccountContext();
|
||||
return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||
}
|
||||
|
||||
//try
|
||||
//{
|
||||
// var pmPermissionsData = pmPermissions.Where(x => x > 0).Select(x => new PmPermission(x)).ToList();
|
||||
// var pmRole = new PmRole(command.Name, command.Id, pmPermissionsData);
|
||||
// await _pmRoleRepository.CreateAsync(pmRole);
|
||||
// await _pmRoleRepository.SaveChangesAsync();
|
||||
|
||||
//}
|
||||
//catch (System.Exception)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||
//}
|
||||
|
||||
//var parameters = new CreateProgramManagerRole
|
||||
//{
|
||||
// RoleName = command.Name,
|
||||
// Permissions = pmPermissions,
|
||||
// GozareshgirRoleId = role.id
|
||||
|
||||
//};
|
||||
|
||||
//var url = "api/role";
|
||||
|
||||
|
||||
//var response = InternalApiCaller.PostAsync<CreateProgramManagerRole, ApiResponse>(
|
||||
// url,
|
||||
// key,
|
||||
// parameters
|
||||
//);
|
||||
|
||||
|
||||
//if (!response.Success)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed("ارتباط با اپلیکیش پروگرام منیجر برقرار نشد");
|
||||
//}
|
||||
|
||||
//if (!response.Result.isSuccess)
|
||||
//{
|
||||
// _unitOfWork.RollbackAccountContext();
|
||||
// return operation.Failed(response.Result.errorMessage);
|
||||
//}
|
||||
}
|
||||
}
|
||||
_unitOfWork.CommitAccountContext();
|
||||
return operation.Succcedded();
|
||||
}
|
||||
|
||||
@@ -70,4 +245,23 @@ public class RoleApplication : IRoleApplication
|
||||
{
|
||||
return _roleRepository.List();
|
||||
}
|
||||
|
||||
|
||||
public async Task<SelectList> GetPmRoleList(long? gozareshgirRoleId)
|
||||
{
|
||||
var rolse = await _pmRoleQueryService.GetPmRoleList(gozareshgirRoleId);
|
||||
return new SelectList(rolse, "Id", "RoleName");
|
||||
|
||||
|
||||
}
|
||||
|
||||
public async Task<List<GetPmRolesDto>> GetPmRoleListToEdit(long? gozareshgirRoleId)
|
||||
{
|
||||
return await _pmRoleQueryService.GetPmRoleList(gozareshgirRoleId);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -5,14 +5,11 @@ using AccountManagement.Domain.AccountAgg;
|
||||
using AccountManagement.Domain.CameraAccountAgg;
|
||||
using AccountManagement.Domain.SubAccountAgg;
|
||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||
using Company.Domain.WorkshopAccountAgg;
|
||||
using Company.Domain.WorkshopSubAccountAgg;
|
||||
using CompanyManagment.App.Contracts.Workshop;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
||||
|
||||
|
||||
namespace AccountManagement.Application
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using _0_Framework.Application;
|
||||
using AccountManagement.Application.Contracts.TaskSubject;
|
||||
using AccountManagement.Domain.TaskSubjectAgg;
|
||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
||||
|
||||
namespace AccountManagement.Application;
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.4">
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -1,9 +1,16 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
||||
<ProjectReference Include="..\AccountManagement.Application.Contracts\AccountManagement.Application.Contracts.csproj" />
|
||||
|
||||
155
AccountManagement.Domain/InternalApiCaller/InternalApiCaller.cs
Normal file
155
AccountManagement.Domain/InternalApiCaller/InternalApiCaller.cs
Normal file
@@ -0,0 +1,155 @@
|
||||
using Newtonsoft.Json;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace AccountManagement.Domain.InternalApiCaller;
|
||||
|
||||
public class ApiResult<T>
|
||||
{
|
||||
public bool Success { get; set; }
|
||||
public T Result { get; set; }
|
||||
public string Error { get; set; }
|
||||
}
|
||||
|
||||
public static class InternalApiCaller
|
||||
{
|
||||
private static string _baseUrl = "";
|
||||
|
||||
public static void SetBaseUrl(string baseUrl)
|
||||
{
|
||||
_baseUrl = baseUrl.TrimEnd('/'); // حذف / اضافی
|
||||
}
|
||||
/// <summary>
|
||||
///api post متد
|
||||
/// </summary>
|
||||
/// <typeparam name="TRequest"></typeparam>
|
||||
/// <typeparam name="TResponse"></typeparam>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="internalKey"></param>
|
||||
/// <param name="body"></param>
|
||||
/// <returns></returns>
|
||||
public static ApiResult<TResponse> PostAsync<TRequest, TResponse>(
|
||||
string url,
|
||||
string internalKey,
|
||||
TRequest body
|
||||
)
|
||||
{
|
||||
try
|
||||
{
|
||||
var client = new HttpClient();
|
||||
|
||||
// ساخت URL نهایی
|
||||
var finalUrl = $"{_baseUrl}/{url.TrimStart('/')}";
|
||||
|
||||
var request = new HttpRequestMessage(HttpMethod.Post, finalUrl);
|
||||
|
||||
request.Headers.Add("X-INTERNAL-KEY", internalKey);
|
||||
|
||||
var json = JsonConvert.SerializeObject(body);
|
||||
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
|
||||
|
||||
var response = client.SendAsync(request).GetAwaiter().GetResult();
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
return new ApiResult<TResponse>
|
||||
{
|
||||
Success = false,
|
||||
Error = $"HTTP Error: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
|
||||
var text = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
|
||||
var deserialized = JsonConvert.DeserializeObject<TResponse>(text);
|
||||
|
||||
return new ApiResult<TResponse>
|
||||
{
|
||||
Success = true,
|
||||
Result = deserialized
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return new ApiResult<TResponse>
|
||||
{
|
||||
Success = false,
|
||||
Error = ex.Message
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Api Get متد
|
||||
/// </summary>
|
||||
/// <typeparam name="TResponse"></typeparam>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="internalKey"></param>
|
||||
/// <param name="parameters"></param>
|
||||
/// <returns></returns>
|
||||
public static ApiResult<TResponse> GetAsync<TResponse>(
|
||||
string url,
|
||||
string internalKey,
|
||||
Dictionary<string, object> parameters = null
|
||||
)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (parameters != null && parameters.Any())
|
||||
{
|
||||
var query = string.Join("&",
|
||||
parameters
|
||||
.Where(p => p.Value != null)
|
||||
.Select(p => $"{p.Key}={p.Value}")
|
||||
);
|
||||
|
||||
url += url.Contains("?") ? "&" + query : "?" + query;
|
||||
}
|
||||
|
||||
// ساخت URL نهایی
|
||||
var finalUrl = $"{_baseUrl}/{url.TrimStart('/')}";
|
||||
|
||||
var client = new HttpClient();
|
||||
var request = new HttpRequestMessage(HttpMethod.Get, finalUrl);
|
||||
|
||||
request.Headers.Add("X-INTERNAL-KEY", internalKey);
|
||||
|
||||
var response = client.SendAsync(request).GetAwaiter().GetResult();
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
return new ApiResult<TResponse>
|
||||
{
|
||||
Success = false,
|
||||
Error = $"HTTP Error: {response.StatusCode}"
|
||||
};
|
||||
}
|
||||
|
||||
var text = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
|
||||
var deserialized = JsonConvert.DeserializeObject<TResponse>(text);
|
||||
|
||||
return new ApiResult<TResponse>
|
||||
{
|
||||
Success = true,
|
||||
Result = deserialized
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return new ApiResult<TResponse>
|
||||
{
|
||||
Success = false,
|
||||
Error = ex.Message
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using AccountManagement.Domain.AccountAgg;
|
||||
using AccountManagement.Domain.AccountAgg;
|
||||
using AccountMangement.Infrastructure.EFCore.Mappings;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
@@ -26,7 +26,6 @@ using AccountManagement.Domain.SubAccountPermissionSubtitle2Agg;
|
||||
using AccountManagement.Domain.SubAccountPermissionSubtitle3Agg;
|
||||
using AccountManagement.Domain.SubAccountPermissionSubtitle4Agg;
|
||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||
using AccountMangement.Infrastructure.EFCore.Seed;
|
||||
using AccountManagement.Domain.TaskScheduleAgg;
|
||||
|
||||
namespace AccountMangement.Infrastructure.EFCore
|
||||
@@ -60,9 +59,10 @@ namespace AccountMangement.Infrastructure.EFCore
|
||||
|
||||
public DbSet<TaskSchedule> TaskSchedules { get; set; }
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region Pooya
|
||||
public DbSet<SubAccount> SubAccounts { get; set; }
|
||||
public DbSet<SubAccountRole> SubAccountRoles { get; set; }
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.4">
|
||||
<PackageReference Include="Azure.Identity" Version="1.17.1" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
@@ -18,4 +20,12 @@
|
||||
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Services\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Mappings\BugReportMapping.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace AccountMangement.Infrastructure.EFCore.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class addprogrammangerbooinaccount : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "IsProgramManagerUser",
|
||||
table: "Accounts",
|
||||
type: "bit",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IsProgramManagerUser",
|
||||
table: "Accounts");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace AccountMangement.Infrastructure.EFCore.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class romoveIsProgramManagerUserFromAccount : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IsProgramManagerUser",
|
||||
table: "Accounts");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "IsProgramManagerUser",
|
||||
table: "Accounts",
|
||||
type: "bit",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ namespace AccountMangement.Infrastructure.EFCore.Migrations
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "8.0.10")
|
||||
.HasAnnotation("ProductVersion", "10.0.1")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
||||
|
||||
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||
@@ -377,6 +377,87 @@ namespace AccountMangement.Infrastructure.EFCore.Migrations
|
||||
b.ToTable("Medias", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmRoleAgg.PmRole", b =>
|
||||
{
|
||||
b.Property<long>("id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bigint");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("id"));
|
||||
|
||||
b.Property<DateTime>("CreationDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<long?>("GozareshgirRoleId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<string>("RoleName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.HasKey("id");
|
||||
|
||||
b.ToTable("PmRoles", null, t =>
|
||||
{
|
||||
t.ExcludeFromMigrations();
|
||||
});
|
||||
});
|
||||
|
||||
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmUserAgg.PmUser", b =>
|
||||
{
|
||||
b.Property<long>("id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bigint");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("id"));
|
||||
|
||||
b.Property<long?>("AccountId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<DateTime>("CreationDate")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.HasMaxLength(150)
|
||||
.HasColumnType("nvarchar(150)");
|
||||
|
||||
b.Property<string>("FullName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.HasColumnType("bit");
|
||||
|
||||
b.Property<string>("Mobile")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("nvarchar(20)");
|
||||
|
||||
b.Property<string>("Password")
|
||||
.IsRequired()
|
||||
.HasMaxLength(1000)
|
||||
.HasColumnType("nvarchar(1000)");
|
||||
|
||||
b.Property<string>("ProfilePhotoPath")
|
||||
.HasMaxLength(500)
|
||||
.HasColumnType("nvarchar(500)");
|
||||
|
||||
b.Property<string>("UserName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("nvarchar(100)");
|
||||
|
||||
b.Property<string>("VerifyCode")
|
||||
.HasMaxLength(10)
|
||||
.HasColumnType("nvarchar(10)");
|
||||
|
||||
b.HasKey("id");
|
||||
|
||||
b.ToTable("Users", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("AccountManagement.Domain.PositionAgg.Position", b =>
|
||||
{
|
||||
b.Property<long>("id")
|
||||
@@ -1001,6 +1082,71 @@ namespace AccountMangement.Infrastructure.EFCore.Migrations
|
||||
b.Navigation("Media");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmRoleAgg.PmRole", b =>
|
||||
{
|
||||
b.OwnsMany("AccountManagement.Domain.PmDomains.PmPermissionAgg.PmPermission", "PmPermission", b1 =>
|
||||
{
|
||||
b1.Property<long>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bigint");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property<long>("Id"));
|
||||
|
||||
b1.Property<int>("Code")
|
||||
.HasColumnType("int");
|
||||
|
||||
b1.Property<long>("Roleid")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b1.HasKey("Id");
|
||||
|
||||
b1.HasIndex("Roleid");
|
||||
|
||||
b1.ToTable("PmRolePermissions", null, t =>
|
||||
{
|
||||
t.ExcludeFromMigrations();
|
||||
});
|
||||
|
||||
b1.WithOwner("Role")
|
||||
.HasForeignKey("Roleid");
|
||||
|
||||
b1.Navigation("Role");
|
||||
});
|
||||
|
||||
b.Navigation("PmPermission");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmUserAgg.PmUser", b =>
|
||||
{
|
||||
b.OwnsMany("AccountManagement.Domain.PmDomains.PmRoleUserAgg.PmRoleUser", "RoleUser", b1 =>
|
||||
{
|
||||
b1.Property<long>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("bigint");
|
||||
|
||||
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property<long>("Id"));
|
||||
|
||||
b1.Property<long>("RoleId")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b1.Property<long>("Userid")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b1.HasKey("Id");
|
||||
|
||||
b1.HasIndex("Userid");
|
||||
|
||||
b1.ToTable("RoleUsers", (string)null);
|
||||
|
||||
b1.WithOwner("User")
|
||||
.HasForeignKey("Userid");
|
||||
|
||||
b1.Navigation("User");
|
||||
});
|
||||
|
||||
b.Navigation("RoleUser");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("AccountManagement.Domain.RoleAgg.Role", b =>
|
||||
{
|
||||
b.OwnsMany("AccountManagement.Domain.RoleAgg.Permission", "Permissions", b1 =>
|
||||
|
||||
175
BUG_REPORT_SYSTEM.md
Normal file
175
BUG_REPORT_SYSTEM.md
Normal file
@@ -0,0 +1,175 @@
|
||||
# سیستم گزارش خرابی (Bug Report System)
|
||||
|
||||
## نمای کلی
|
||||
|
||||
این سیستم برای جمعآوری، ذخیره و مدیریت گزارشهای خرابی از تطبیق موبایلی طراحی شده است.
|
||||
|
||||
## ساختار فایلها
|
||||
|
||||
### Domain Layer
|
||||
- `AccountManagement.Domain/BugReportAgg/`
|
||||
- `BugReport.cs` - موجودیت اصلی
|
||||
- `BugReportLog.cs` - لاگهای گزارش
|
||||
- `BugReportScreenshot.cs` - تصاویر ضمیمه شده
|
||||
|
||||
### Application Contracts
|
||||
- `AccountManagement.Application.Contracts/BugReport/`
|
||||
- `IBugReportApplication.cs` - اینترفیس سرویس
|
||||
- `CreateBugReportCommand.cs` - درخواست ایجاد
|
||||
- `EditBugReportCommand.cs` - درخواست ویرایش
|
||||
- `BugReportViewModel.cs` - نمایش لیست
|
||||
- `BugReportDetailViewModel.cs` - نمایش جزئیات
|
||||
- `IBugReportRepository.cs` - اینترفیس Repository
|
||||
|
||||
### Application Service
|
||||
- `AccountManagement.Application/BugReportApplication.cs` - پیادهسازی سرویس
|
||||
|
||||
### Infrastructure
|
||||
- `AccountMangement.Infrastructure.EFCore/`
|
||||
- `Mappings/BugReportMapping.cs`
|
||||
- `Mappings/BugReportLogMapping.cs`
|
||||
- `Mappings/BugReportScreenshotMapping.cs`
|
||||
- `Repository/BugReportRepository.cs`
|
||||
|
||||
### API Controller
|
||||
- `ServiceHost/Controllers/BugReportController.cs`
|
||||
|
||||
### Admin Pages
|
||||
- `ServiceHost/Areas/AdminNew/Pages/BugReport/`
|
||||
- `BugReportPageModel.cs` - base model
|
||||
- `Index.cshtml.cs / Index.cshtml` - لیست گزارشها
|
||||
- `Details.cshtml.cs / Details.cshtml` - جزئیات کامل
|
||||
- `Edit.cshtml.cs / Edit.cshtml` - ویرایش وضعیت/اولویت
|
||||
- `Delete.cshtml.cs / Delete.cshtml` - حذف
|
||||
|
||||
## روش استفاده
|
||||
|
||||
### 1. ثبت گزارش از موبایل
|
||||
|
||||
```csharp
|
||||
POST /api/bugreport/submit
|
||||
|
||||
{
|
||||
"title": "برنامه هنگام ورود خراب میشود",
|
||||
"description": "هنگام وارد کردن نام کاربری، برنامه کرش میکند",
|
||||
"userEmail": "user@example.com",
|
||||
"deviceModel": "Samsung Galaxy S21",
|
||||
"osVersion": "Android 12",
|
||||
"platform": "Android",
|
||||
"manufacturer": "Samsung",
|
||||
"deviceId": "device-unique-id",
|
||||
"screenResolution": "1440x3200",
|
||||
"memoryInMB": 8000,
|
||||
"storageInMB": 256000,
|
||||
"batteryLevel": 75,
|
||||
"isCharging": false,
|
||||
"networkType": "4G",
|
||||
"appVersion": "1.0.0",
|
||||
"buildNumber": "100",
|
||||
"packageName": "com.example.app",
|
||||
"installTime": "2024-01-01T10:00:00Z",
|
||||
"lastUpdateTime": "2024-12-01T14:30:00Z",
|
||||
"flavor": "production",
|
||||
"type": 1, // Crash = 1
|
||||
"priority": 2, // High = 2
|
||||
"stackTrace": "...",
|
||||
"logs": ["log1", "log2"],
|
||||
"screenshots": ["base64-encoded-image-1"]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. دسترسی به Admin Panel
|
||||
|
||||
```
|
||||
https://yourdomain.com/AdminNew/BugReport
|
||||
```
|
||||
|
||||
**صفحات موجود:**
|
||||
- **Index** - لیست تمام گزارشها با فیلترها
|
||||
- **Details** - نمایش جزئیات کامل شامل:
|
||||
- معلومات کاربر و گزارش
|
||||
- معلومات دستگاه
|
||||
- معلومات برنامه
|
||||
- لاگها
|
||||
- تصاویر
|
||||
- Stack Trace
|
||||
- **Edit** - تغییر وضعیت و اولویت
|
||||
- **Delete** - حذف گزارش
|
||||
|
||||
### 3. درخواستهای API
|
||||
|
||||
#### دریافت لیست
|
||||
```
|
||||
GET /api/bugreport/list?type=1&priority=2&status=1&searchTerm=crash&pageNumber=1&pageSize=10
|
||||
```
|
||||
|
||||
#### دریافت جزئیات
|
||||
```
|
||||
GET /api/bugreport/{id}
|
||||
```
|
||||
|
||||
#### ویرایش
|
||||
```
|
||||
PUT /api/bugreport/{id}
|
||||
|
||||
{
|
||||
"id": 1,
|
||||
"priority": 2,
|
||||
"status": 3
|
||||
}
|
||||
```
|
||||
|
||||
#### حذف
|
||||
```
|
||||
DELETE /api/bugreport/{id}
|
||||
```
|
||||
|
||||
## انواع (Enums)
|
||||
|
||||
### BugReportType
|
||||
- `1` - Crash (کرش)
|
||||
- `2` - UI (مشکل رابط)
|
||||
- `3` - Performance (عملکرد)
|
||||
- `4` - Feature (فیچر)
|
||||
- `5` - Network (شبکه)
|
||||
- `6` - Camera (دوربین)
|
||||
- `7` - FaceRecognition (تشخیص چهره)
|
||||
- `8` - Database (دیتابیس)
|
||||
- `9` - Login (ورود)
|
||||
- `10` - Other (سایر)
|
||||
|
||||
### BugPriority
|
||||
- `1` - Critical (بحرانی)
|
||||
- `2` - High (بالا)
|
||||
- `3` - Medium (متوسط)
|
||||
- `4` - Low (پایین)
|
||||
|
||||
### BugReportStatus
|
||||
- `1` - Open (باز)
|
||||
- `2` - InProgress (در حال بررسی)
|
||||
- `3` - Fixed (رفع شده)
|
||||
- `4` - Closed (بسته شده)
|
||||
- `5` - Reopened (مجدداً باز)
|
||||
|
||||
## Migration
|
||||
|
||||
برای اعمال تغییرات دیتابیس:
|
||||
|
||||
```powershell
|
||||
Add-Migration AddBugReportTables
|
||||
Update-Database
|
||||
```
|
||||
|
||||
## نکات مهم
|
||||
|
||||
1. **تصاویر**: تصاویر به صورت Base64 encoded ذخیره میشوند
|
||||
2. **لاگها**: تمام لاگها به صورت جدا ذخیره میشوند
|
||||
3. **وضعیت پیشفرض**: وقتی گزارش ثبت میشود، وضعیت آن "Open" است
|
||||
4. **تاریخ**: تاریخ ایجاد و بروزرسانی خودکار ثبت میشود
|
||||
|
||||
## Security
|
||||
|
||||
- API endpoints از `authentication` محافظت میشوند
|
||||
- Admin pages تنها برای کاربرانی با دسترسی AdminArea قابل دسترس هستند
|
||||
- حذف و ویرایش نیاز به تأیید دارد
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<AssemblyName>BackgroundInstitutionContract.Task</AssemblyName>
|
||||
@@ -12,6 +12,7 @@
|
||||
<ProjectReference Include="..\..\0_Framework\0_Framework.csproj" />
|
||||
<ProjectReference Include="..\..\AccountManagement.Configuration\AccountManagement.Configuration.csproj" />
|
||||
<ProjectReference Include="..\..\PersonalContractingParty.Config\PersonalContractingParty.Config.csproj" />
|
||||
<ProjectReference Include="..\..\ProgramManager\src\Infrastructure\GozareshgirProgramManager.Infrastructure\GozareshgirProgramManager.Infrastructure.csproj" />
|
||||
<ProjectReference Include="..\..\Query.Bootstrapper\Query.Bootstrapper.csproj" />
|
||||
<ProjectReference Include="..\..\WorkFlow\Infrastructure\WorkFlow.Infrastructure.Config\WorkFlow.Infrastructure.Config.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
using _0_Framework.Application;
|
||||
using _0_Framework.Application.Sms;
|
||||
using Company.Domain.ContarctingPartyAgg;
|
||||
using Company.Domain.InstitutionContractAgg;
|
||||
using Hangfire;
|
||||
@@ -13,13 +14,15 @@ public class JobSchedulerRegistrator
|
||||
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||
private static DateTime? _lastRunCreateTransaction;
|
||||
private static DateTime? _lastRunSendMonthlySms;
|
||||
private readonly ISmsService _smsService;
|
||||
|
||||
|
||||
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository)
|
||||
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService)
|
||||
{
|
||||
_smsReminder = smsReminder;
|
||||
_backgroundJobClient = backgroundJobClient;
|
||||
_institutionContractRepository = institutionContractRepository;
|
||||
_smsService = smsService;
|
||||
}
|
||||
|
||||
public void Register()
|
||||
@@ -47,6 +50,11 @@ public class JobSchedulerRegistrator
|
||||
() => SendBlockSms(),
|
||||
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||
);
|
||||
RecurringJob.AddOrUpdate(
|
||||
"InstitutionContract.SendInstitutionContractConfirmSms",
|
||||
() => SendInstitutionContractConfirmSms(),
|
||||
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -86,8 +94,8 @@ public class JobSchedulerRegistrator
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
//_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
|
||||
|
||||
await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -146,4 +154,15 @@ public class JobSchedulerRegistrator
|
||||
await _institutionContractRepository.SendBlockSmsForBackgroundTask();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// ارسال پیامک یادآور تایید قراداد مالی
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||
public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms()
|
||||
{
|
||||
await _institutionContractRepository.SendInstitutionContractConfirmSmsTask();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
using GozareshgirProgramManager.Application.Interfaces;
|
||||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||
|
||||
public class NullBoardNotificationPublisher:IBoardNotificationPublisher
|
||||
{
|
||||
public Task SendProjectStatusChanged(long userId, TaskSectionStatus oldStatus, TaskSectionStatus newStatus, Guid sectionId)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
@@ -7,11 +7,17 @@ using BackgroundInstitutionContract.Task;
|
||||
using BackgroundInstitutionContract.Task.Jobs;
|
||||
using CompanyManagment.App.Contracts.Hubs;
|
||||
using CompanyManagment.EFCore.Services;
|
||||
using GozareshgirProgramManager.Application._Bootstrapper;
|
||||
using GozareshgirProgramManager.Application.Interfaces;
|
||||
using GozareshgirProgramManager.Application.Modules.Users.Commands.CreateUser;
|
||||
using GozareshgirProgramManager.Infrastructure;
|
||||
using GozareshgirProgramManager.Infrastructure.Persistence.Seed;
|
||||
using Hangfire;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using MongoDB.Driver;
|
||||
using PersonalContractingParty.Config;
|
||||
using Query.Bootstrapper;
|
||||
using Shared.Contracts.PmUser.Queries;
|
||||
using WorkFlow.Infrastructure.Config;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
@@ -26,7 +32,7 @@ builder.Services.AddTransient<ISmsService, SmsService>();
|
||||
builder.Services.AddTransient<IUidService, UidService>();
|
||||
builder.Services.AddTransient<IFileUploader, FileUploader>();
|
||||
builder.Services.Configure<AppSettingConfiguration>(builder.Configuration);
|
||||
|
||||
builder.Services.AddScoped<IBoardNotificationPublisher, NullBoardNotificationPublisher>();
|
||||
#region MongoDb
|
||||
|
||||
var mongoConnectionSection = builder.Configuration.GetSection("MongoDb");
|
||||
@@ -38,10 +44,15 @@ builder.Services.AddSingleton<IMongoDatabase>(mongoDatabase);
|
||||
|
||||
#endregion
|
||||
|
||||
builder.Services.AddProgramManagerApplication();
|
||||
builder.Services.AddProgramManagerInfrastructure(builder.Configuration);
|
||||
|
||||
|
||||
PersonalBootstrapper.Configure(builder.Services, connectionString);
|
||||
TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
|
||||
AccountManagementBootstrapper.Configure(builder.Services, connectionString);
|
||||
WorkFlowBootstrapper.Configure(builder.Services, connectionString);
|
||||
|
||||
QueryBootstrapper.Configure(builder.Services);
|
||||
JobsBootstrapper.Configure(builder.Services);
|
||||
builder.Services.AddHttpClient();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
314
CHANGELOG.md
Normal file
314
CHANGELOG.md
Normal file
@@ -0,0 +1,314 @@
|
||||
# خلاصه تغییرات سیستم گزارش خرابی
|
||||
|
||||
## 📝 فایلهای اضافه شده (23 فایل)
|
||||
|
||||
### 1️⃣ Domain Layer (3 فایل)
|
||||
```
|
||||
✓ AccountManagement.Domain/BugReportAgg/
|
||||
├── BugReport.cs
|
||||
├── BugReportLog.cs
|
||||
└── BugReportScreenshot.cs
|
||||
```
|
||||
|
||||
### 2️⃣ Application Contracts (6 فایل)
|
||||
```
|
||||
✓ AccountManagement.Application.Contracts/BugReport/
|
||||
├── IBugReportRepository.cs
|
||||
├── IBugReportApplication.cs
|
||||
├── CreateBugReportCommand.cs
|
||||
├── EditBugReportCommand.cs
|
||||
├── BugReportViewModel.cs
|
||||
└── BugReportDetailViewModel.cs
|
||||
```
|
||||
|
||||
### 3️⃣ Application Service (1 فایل)
|
||||
```
|
||||
✓ AccountManagement.Application/
|
||||
└── BugReportApplication.cs
|
||||
```
|
||||
|
||||
### 4️⃣ Infrastructure EFCore (4 فایل)
|
||||
```
|
||||
✓ AccountMangement.Infrastructure.EFCore/
|
||||
├── Mappings/
|
||||
│ ├── BugReportMapping.cs
|
||||
│ ├── BugReportLogMapping.cs
|
||||
│ └── BugReportScreenshotMapping.cs
|
||||
└── Repository/
|
||||
└── BugReportRepository.cs
|
||||
```
|
||||
|
||||
### 5️⃣ API Controller (1 فایل)
|
||||
```
|
||||
✓ ServiceHost/Controllers/
|
||||
└── BugReportController.cs
|
||||
```
|
||||
|
||||
### 6️⃣ Admin Pages (8 فایل)
|
||||
```
|
||||
✓ ServiceHost/Areas/AdminNew/Pages/BugReport/
|
||||
├── BugReportPageModel.cs
|
||||
├── Index.cshtml.cs
|
||||
├── Index.cshtml
|
||||
├── Details.cshtml.cs
|
||||
├── Details.cshtml
|
||||
├── Edit.cshtml.cs
|
||||
├── Edit.cshtml
|
||||
├── Delete.cshtml.cs
|
||||
└── Delete.cshtml
|
||||
```
|
||||
|
||||
### 7️⃣ Documentation (2 فایل)
|
||||
```
|
||||
✓ BUG_REPORT_SYSTEM.md
|
||||
✓ FLUTTER_BUG_REPORT_EXAMPLE.dart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✏️ فایلهای اصلاح شده (2 فایل)
|
||||
|
||||
### 1. AccountManagement.Configuration/AccountManagementBootstrapper.cs
|
||||
**تغییر:** اضافه کردن using برای BugReport
|
||||
```csharp
|
||||
using AccountManagement.Application.Contracts.BugReport;
|
||||
```
|
||||
|
||||
**تغییر:** رجیستریشن سرویسها
|
||||
```csharp
|
||||
services.AddTransient<IBugReportApplication, BugReportApplication>();
|
||||
services.AddTransient<IBugReportRepository, BugReportRepository>();
|
||||
```
|
||||
|
||||
### 2. AccountMangement.Infrastructure.EFCore/AccountContext.cs
|
||||
**تغییر:** اضافه کردن using
|
||||
```csharp
|
||||
using AccountManagement.Domain.BugReportAgg;
|
||||
```
|
||||
|
||||
**تغییر:** اضافه کردن DbSets
|
||||
```csharp
|
||||
#region BugReport
|
||||
public DbSet<BugReport> BugReports { get; set; }
|
||||
public DbSet<BugReportLog> BugReportLogs { get; set; }
|
||||
public DbSet<BugReportScreenshot> BugReportScreenshots { get; set; }
|
||||
#endregion
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 موارد مورد نیاز قبل از استفاده
|
||||
|
||||
### 1. Database Migration
|
||||
```powershell
|
||||
# در Package Manager Console
|
||||
cd AccountMangement.Infrastructure.EFCore
|
||||
|
||||
Add-Migration AddBugReportSystem
|
||||
Update-Database
|
||||
```
|
||||
|
||||
### 2. الگوی Enum برای Flutter
|
||||
```dart
|
||||
enum BugReportType {
|
||||
crash, // 1
|
||||
ui, // 2
|
||||
performance, // 3
|
||||
feature, // 4
|
||||
network, // 5
|
||||
camera, // 6
|
||||
faceRecognition, // 7
|
||||
database, // 8
|
||||
login, // 9
|
||||
other, // 10
|
||||
}
|
||||
|
||||
enum BugPriority {
|
||||
critical, // 1
|
||||
high, // 2
|
||||
medium, // 3
|
||||
low, // 4
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 نقاط ورود
|
||||
|
||||
### API Endpoints
|
||||
```
|
||||
POST /api/bugreport/submit - ثبت گزارش جدید
|
||||
GET /api/bugreport/list - دریافت لیست
|
||||
GET /api/bugreport/{id} - دریافت جزئیات
|
||||
PUT /api/bugreport/{id} - ویرایش وضعیت/اولویت
|
||||
DELETE /api/bugreport/{id} - حذف گزارش
|
||||
```
|
||||
|
||||
### Admin Pages
|
||||
```
|
||||
/AdminNew/BugReport - لیست گزارشها
|
||||
/AdminNew/BugReport/Details/{id} - جزئیات کامل
|
||||
/AdminNew/BugReport/Edit/{id} - ویرایش
|
||||
/AdminNew/BugReport/Delete/{id} - حذف
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Database Schema
|
||||
|
||||
### BugReports جدول
|
||||
```sql
|
||||
- id (bigint, PK)
|
||||
- Title (nvarchar(200))
|
||||
- Description (ntext)
|
||||
- UserEmail (nvarchar(150))
|
||||
- AccountId (bigint, nullable)
|
||||
- DeviceModel (nvarchar(100))
|
||||
- OsVersion (nvarchar(50))
|
||||
- Platform (nvarchar(50))
|
||||
- Manufacturer (nvarchar(100))
|
||||
- DeviceId (nvarchar(200))
|
||||
- ScreenResolution (nvarchar(50))
|
||||
- MemoryInMB (int)
|
||||
- StorageInMB (int)
|
||||
- BatteryLevel (int)
|
||||
- IsCharging (bit)
|
||||
- NetworkType (nvarchar(50))
|
||||
- AppVersion (nvarchar(50))
|
||||
- BuildNumber (nvarchar(50))
|
||||
- PackageName (nvarchar(150))
|
||||
- InstallTime (datetime2)
|
||||
- LastUpdateTime (datetime2)
|
||||
- Flavor (nvarchar(50))
|
||||
- Type (int)
|
||||
- Priority (int)
|
||||
- Status (int)
|
||||
- StackTrace (ntext, nullable)
|
||||
- CreationDate (datetime2)
|
||||
- UpdateDate (datetime2, nullable)
|
||||
```
|
||||
|
||||
### BugReportLogs جدول
|
||||
```sql
|
||||
- id (bigint, PK)
|
||||
- BugReportId (bigint, FK)
|
||||
- Message (ntext)
|
||||
- Timestamp (datetime2)
|
||||
```
|
||||
|
||||
### BugReportScreenshots جدول
|
||||
```sql
|
||||
- id (bigint, PK)
|
||||
- BugReportId (bigint, FK)
|
||||
- Base64Data (ntext)
|
||||
- FileName (nvarchar(255))
|
||||
- UploadDate (datetime2)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✨ مثال درخواست API
|
||||
|
||||
```json
|
||||
POST /api/bugreport/submit
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"title": "برنامه هنگام ورود خراب میشود",
|
||||
"description": "هنگام فشار دادن دکمه ورود، برنامه کرش میکند",
|
||||
"userEmail": "user@example.com",
|
||||
"accountId": 123,
|
||||
"deviceModel": "Samsung Galaxy S21",
|
||||
"osVersion": "Android 12",
|
||||
"platform": "Android",
|
||||
"manufacturer": "Samsung",
|
||||
"deviceId": "device-12345",
|
||||
"screenResolution": "1440x3200",
|
||||
"memoryInMB": 8000,
|
||||
"storageInMB": 256000,
|
||||
"batteryLevel": 75,
|
||||
"isCharging": false,
|
||||
"networkType": "4G",
|
||||
"appVersion": "1.0.0",
|
||||
"buildNumber": "100",
|
||||
"packageName": "com.example.app",
|
||||
"installTime": "2024-01-01T10:00:00Z",
|
||||
"lastUpdateTime": "2024-12-07T14:30:00Z",
|
||||
"flavor": "production",
|
||||
"type": 1,
|
||||
"priority": 2,
|
||||
"stackTrace": "...",
|
||||
"logs": ["log line 1", "log line 2"],
|
||||
"screenshots": ["base64-string"]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Security Features
|
||||
|
||||
- ✅ Authorization برای Admin Pages (AdminAreaPermission required)
|
||||
- ✅ API Authentication
|
||||
- ✅ XSS Protection (Html.Raw محدود)
|
||||
- ✅ CSRF Protection (ASP.NET Core default)
|
||||
- ✅ Input Validation
|
||||
- ✅ Safe Delete with Confirmation
|
||||
|
||||
---
|
||||
|
||||
## 📚 Documentation Files
|
||||
|
||||
1. **BUG_REPORT_SYSTEM.md** - راهنمای کامل سیستم
|
||||
2. **FLUTTER_BUG_REPORT_EXAMPLE.dart** - مثال پیادهسازی Flutter
|
||||
3. **CHANGELOG.md** (این فایل) - خلاصه تغییرات
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checklist پیادهسازی
|
||||
|
||||
- [x] Domain Models
|
||||
- [x] Database Mappings
|
||||
- [x] Repository Pattern
|
||||
- [x] Application Services
|
||||
- [x] API Endpoints
|
||||
- [x] Admin UI Pages
|
||||
- [x] Dependency Injection
|
||||
- [x] Error Handling
|
||||
- [x] Documentation
|
||||
- [x] Flutter Example
|
||||
- [ ] Database Migration (باید دستی اجرا شود)
|
||||
- [ ] Testing
|
||||
|
||||
---
|
||||
|
||||
## 🎯 مراحل بعدی
|
||||
|
||||
1. **اجرای Migration:**
|
||||
```powershell
|
||||
Add-Migration AddBugReportSystem
|
||||
Update-Database
|
||||
```
|
||||
|
||||
2. **تست API:**
|
||||
- استفاده از Postman/Thunder Client
|
||||
- تست تمام endpoints
|
||||
|
||||
3. **تست Admin Panel:**
|
||||
- دسترسی به /AdminNew/BugReport
|
||||
- تست فیلترها و جستجو
|
||||
- تست ویرایش و حذف
|
||||
|
||||
4. **Integration Flutter:**
|
||||
- کپی کردن `FLUTTER_BUG_REPORT_EXAMPLE.dart`
|
||||
- سازگار کردن با پروژه Flutter
|
||||
- تست ثبت گزارشها
|
||||
|
||||
---
|
||||
|
||||
## 📞 پشتیبانی
|
||||
|
||||
برای هر سوال یا مشکل:
|
||||
1. بررسی کنید `BUG_REPORT_SYSTEM.md`
|
||||
2. بررسی کنید logs و error messages
|
||||
3. مطمئن شوید Migration اجرا شده است
|
||||
|
||||
195
Company.Domain/CameraBugReportAgg/CameraBugReport.cs
Normal file
195
Company.Domain/CameraBugReportAgg/CameraBugReport.cs
Normal file
@@ -0,0 +1,195 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using _0_Framework.Domain;
|
||||
using MongoDB.Bson.Serialization.Attributes;
|
||||
|
||||
namespace Company.Domain.CameraBugReportAgg;
|
||||
|
||||
/// <summary>
|
||||
/// مدل دامنه برای گزارش خرابی دوربین
|
||||
/// </summary>
|
||||
public class CameraBugReport
|
||||
{
|
||||
[BsonId]
|
||||
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public CameraBugReport()
|
||||
{
|
||||
Id = Guid.NewGuid();
|
||||
CreationDate = DateTime.Now;
|
||||
Status = CameraBugReportStatus.Open;
|
||||
Screenshots = new List<CameraBugReportScreenshot>();
|
||||
Logs = new List<CameraBugReportLog>();
|
||||
}
|
||||
|
||||
public CameraBugReport(
|
||||
string title,
|
||||
string description,
|
||||
string userEmail,
|
||||
string deviceModel,
|
||||
string osVersion,
|
||||
string manufacturer,
|
||||
string buildNumber,
|
||||
string appVersion,
|
||||
string screenResolution,
|
||||
bool isCharging,
|
||||
int batteryLevel,
|
||||
int storageInMB,
|
||||
int memoryInMB,
|
||||
string networkType,
|
||||
string platform,
|
||||
string deviceId,
|
||||
string packageName,
|
||||
DateTime installTime,
|
||||
DateTime lastUpdateTime,
|
||||
string flavor,
|
||||
CameraBugReportType type,
|
||||
CameraBugPriority priority,
|
||||
long? accountId = null,
|
||||
string stackTrace = null) : this()
|
||||
|
||||
{
|
||||
Priority = priority;
|
||||
Type = type;
|
||||
Flavor = flavor;
|
||||
LastUpdateTime = lastUpdateTime;
|
||||
InstallTime = installTime;
|
||||
PackageName = packageName;
|
||||
BuildNumber = buildNumber;
|
||||
AppVersion = appVersion;
|
||||
NetworkType = networkType;
|
||||
IsCharging = isCharging;
|
||||
BatteryLevel = batteryLevel;
|
||||
StorageInMB = storageInMB;
|
||||
MemoryInMB = memoryInMB;
|
||||
ScreenResolution = screenResolution;
|
||||
DeviceId = deviceId;
|
||||
Manufacturer = manufacturer;
|
||||
Platform = platform;
|
||||
OsVersion = osVersion;
|
||||
DeviceModel = deviceModel;
|
||||
AccountId = accountId;
|
||||
UserEmail = userEmail;
|
||||
Description = description;
|
||||
Title = title;
|
||||
StackTrace = stackTrace;
|
||||
}
|
||||
|
||||
[BsonElement("screenshots")]
|
||||
public List<CameraBugReportScreenshot> Screenshots { get; private set; }
|
||||
|
||||
[BsonElement("logs")]
|
||||
public List<CameraBugReportLog> Logs { get; private set; }
|
||||
|
||||
[BsonElement("updateDate")]
|
||||
public DateTime? UpdateDate { get; private set; }
|
||||
|
||||
[BsonElement("creationDate")]
|
||||
public DateTime CreationDate { get; private set; }
|
||||
|
||||
[BsonElement("stackTrace")]
|
||||
public string StackTrace { get; private set; }
|
||||
|
||||
[BsonElement("status")]
|
||||
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||
public CameraBugReportStatus Status { get; private set; }
|
||||
|
||||
[BsonElement("priority")]
|
||||
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||
|
||||
public CameraBugPriority Priority { get; private set; }
|
||||
|
||||
[BsonElement("type")]
|
||||
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||
|
||||
public CameraBugReportType Type { get; private set; }
|
||||
|
||||
[BsonElement("flavor")]
|
||||
public string Flavor { get; private set; }
|
||||
|
||||
[BsonElement("lastUpdateTime")]
|
||||
public DateTime LastUpdateTime { get; private set; }
|
||||
|
||||
[BsonElement("installTime")]
|
||||
public DateTime InstallTime { get; private set; }
|
||||
|
||||
[BsonElement("packageName")]
|
||||
public string PackageName { get; private set; }
|
||||
|
||||
[BsonElement("buildNumber")]
|
||||
public string BuildNumber { get; private set; }
|
||||
|
||||
[BsonElement("appVersion")]
|
||||
public string AppVersion { get; private set; }
|
||||
|
||||
[BsonElement("networkType")]
|
||||
public string NetworkType { get; private set; }
|
||||
|
||||
[BsonElement("isCharging")]
|
||||
public bool IsCharging { get; private set; }
|
||||
|
||||
[BsonElement("batteryLevel")]
|
||||
public int BatteryLevel { get; private set; }
|
||||
|
||||
[BsonElement("storageInMB")]
|
||||
public int StorageInMB { get; private set; }
|
||||
|
||||
[BsonElement("memoryInMB")]
|
||||
public int MemoryInMB { get; private set; }
|
||||
|
||||
[BsonElement("screenResolution")]
|
||||
public string ScreenResolution { get; private set; }
|
||||
|
||||
[BsonElement("deviceId")]
|
||||
public string DeviceId { get; private set; }
|
||||
|
||||
[BsonElement("manufacturer")]
|
||||
public string Manufacturer { get; private set; }
|
||||
|
||||
[BsonElement("platform")]
|
||||
public string Platform { get; private set; }
|
||||
|
||||
[BsonElement("osVersion")]
|
||||
public string OsVersion { get; private set; }
|
||||
|
||||
[BsonElement("deviceModel")]
|
||||
public string DeviceModel { get; private set; }
|
||||
|
||||
[BsonElement("accountId")]
|
||||
public long? AccountId { get; private set; }
|
||||
|
||||
[BsonElement("userEmail")]
|
||||
public string UserEmail { get; private set; }
|
||||
|
||||
[BsonElement("description")]
|
||||
public string Description { get; private set; }
|
||||
|
||||
[BsonElement("title")]
|
||||
public string Title { get; private set; }
|
||||
|
||||
|
||||
public void ChangeStatus(CameraBugReportStatus newStatus)
|
||||
{
|
||||
UpdateDate = DateTime.Now;
|
||||
Status = newStatus;
|
||||
}
|
||||
|
||||
public void ChangePriority(CameraBugPriority newPriority)
|
||||
{
|
||||
Priority = newPriority;
|
||||
UpdateDate = DateTime.Now;
|
||||
}
|
||||
|
||||
public void AddScreenshot(string base64Data, string fileName)
|
||||
{
|
||||
Screenshots.Add(new CameraBugReportScreenshot
|
||||
{ Base64Data = base64Data, FileName = fileName, UploadDate = DateTime.Now });
|
||||
}
|
||||
|
||||
public void AddLog(string logMessage)
|
||||
{
|
||||
Logs.Add(new CameraBugReportLog { Message = logMessage, Timestamp = DateTime.Now });
|
||||
}
|
||||
}
|
||||
|
||||
20
Company.Domain/CameraBugReportAgg/CameraBugReportLog.cs
Normal file
20
Company.Domain/CameraBugReportAgg/CameraBugReportLog.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using _0_Framework.Domain;
|
||||
using MongoDB.Bson.Serialization.Attributes;
|
||||
|
||||
namespace Company.Domain.CameraBugReportAgg
|
||||
{
|
||||
/// <summary>
|
||||
/// لاگهای گزارش خرابی دوربین
|
||||
/// </summary>
|
||||
public class CameraBugReportLog : EntityBase
|
||||
{
|
||||
// FK و navigation property حذف شد برای MongoDB
|
||||
[BsonElement("message")]
|
||||
public string Message { get; set; }
|
||||
|
||||
[BsonElement("timestamp")]
|
||||
public DateTime Timestamp { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using _0_Framework.Domain;
|
||||
using MongoDB.Bson.Serialization.Attributes;
|
||||
|
||||
namespace Company.Domain.CameraBugReportAgg
|
||||
{
|
||||
/// <summary>
|
||||
/// عکسهای ضمیمه شده به گزارش خرابی دوربین (Base64 encoded)
|
||||
/// </summary>
|
||||
public class CameraBugReportScreenshot : EntityBase
|
||||
{
|
||||
// FK و navigation property حذف شد برای MongoDB
|
||||
[BsonElement("base64Data")]
|
||||
public string Base64Data { get; set; }
|
||||
|
||||
[BsonElement("fileName")]
|
||||
public string FileName { get; set; }
|
||||
|
||||
[BsonElement("uploadDate")]
|
||||
public DateTime UploadDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.InfraStructure;
|
||||
|
||||
namespace Company.Domain.CameraBugReportAgg;
|
||||
|
||||
/// <summary>
|
||||
/// رابط انبار گزارش خرابی دوربین برای MongoDB
|
||||
/// </summary>
|
||||
public interface ICameraBugReportRepository
|
||||
{
|
||||
// Async methods for MongoDB operations
|
||||
Task CreateAsync(CameraBugReport bugReport);
|
||||
Task UpdateAsync(CameraBugReport bugReport);
|
||||
Task<CameraBugReport> GetByIdAsync(Guid id);
|
||||
Task<List<CameraBugReport>> GetAllAsync();
|
||||
Task<List<CameraBugReport>> GetAllAsync(int skip, int take);
|
||||
Task DeleteAsync(Guid id);
|
||||
Task<bool> IsExistAsync(Guid id);
|
||||
Task<List<CameraBugReport>> FilterAsync(
|
||||
CameraBugReportType? type = null,
|
||||
CameraBugPriority? priority = null,
|
||||
CameraBugReportStatus? status = null,
|
||||
string searchTerm = null,
|
||||
int skip = 0,
|
||||
int take = 10);
|
||||
Task<int> CountAsync(
|
||||
CameraBugReportType? type = null,
|
||||
CameraBugPriority? priority = null,
|
||||
CameraBugReportStatus? status = null,
|
||||
string searchTerm = null);
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -16,10 +16,15 @@
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="CheckoutAgg\ValueObjects\" />
|
||||
<Folder Include="_common\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MongoDB.Bson" Version="3.5.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||
<PackageReference Include="MongoDB.Bson" Version="3.5.2" />
|
||||
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -290,4 +290,13 @@ public class PersonalContractingParty : EntityBase
|
||||
this.Gender = gender;
|
||||
this.IsAuthenticated = true;
|
||||
}
|
||||
|
||||
public void EditLegalPartyFromInstitution(string legalPosition, string companyName,
|
||||
string registerId,string nationalId)
|
||||
{
|
||||
LegalPosition = legalPosition;
|
||||
LName = companyName;
|
||||
RegisterId = registerId;
|
||||
NationalId = nationalId;
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ namespace Company.Domain.EmployeeDocumentsAgg
|
||||
{
|
||||
WorkshopId = workshopId;
|
||||
EmployeeId = employeeId;
|
||||
Gender = gender;
|
||||
Gender = gender??string.Empty;
|
||||
}
|
||||
|
||||
private EmployeeDocuments()
|
||||
|
||||
@@ -56,6 +56,9 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
||||
void UpdateStatusIfNeeded(long institutionContractId);
|
||||
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
|
||||
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
|
||||
InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request);
|
||||
InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
|
||||
|
||||
|
||||
#region Extension
|
||||
|
||||
@@ -63,9 +66,13 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
||||
Task<InstitutionContractExtensionWorkshopsResponse> GetExtensionWorkshops(InstitutionContractExtensionWorkshopsRequest request);
|
||||
Task<InstitutionContractExtensionPlanResponse> GetExtensionInstitutionPlan(InstitutionContractExtensionPlanRequest request);
|
||||
Task<InstitutionContractExtensionPaymentResponse> GetExtensionPaymentMethod(InstitutionContractExtensionPaymentRequest request);
|
||||
Task<InstitutionContractDiscountResponse> SetDiscountForExtension(
|
||||
InstitutionContractSetDiscountForExtensionRequest request);
|
||||
Task<InstitutionContractDiscountResponse> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request);
|
||||
|
||||
Task<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request);
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
#region Upgrade(Amendment)
|
||||
|
||||
@@ -133,6 +140,11 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
||||
/// <returns></returns>
|
||||
Task SendReminderSmsToContractingParties(List<SmsListData> smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
|
||||
|
||||
/// <summary>
|
||||
/// ارسال پیامک یادآور تایید قراداد مالی
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task SendInstitutionContractConfirmSmsTask();
|
||||
#endregion
|
||||
|
||||
#region CreateMontlyTransaction
|
||||
@@ -145,4 +157,6 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
Task<long> GetIdByInstallmentId(long installmentId);
|
||||
}
|
||||
@@ -19,7 +19,8 @@ public class InstitutionContract : EntityBase
|
||||
string contractEndFa, double contractAmount, double dailyCompenseation, double obligation,
|
||||
double totalAmount, int extensionNo, string workshopManualCount, string employeeManualCount, string description,
|
||||
string officialCompany, string typeOfcontract, string hasValueAddedTax, double valueAddedTax,
|
||||
List<InstitutionContractWorkshopInitial> workshopDetails, long lawId)
|
||||
List<InstitutionContractWorkshopInitial> workshopDetails, long lawId,
|
||||
int discountPercentage, double discountAmount)
|
||||
{
|
||||
ContractNo = contractNo;
|
||||
RepresentativeId = representativeId;
|
||||
@@ -57,8 +58,12 @@ public class InstitutionContract : EntityBase
|
||||
WorkshopGroup = new InstitutionContractWorkshopGroup(id, workshopDetails);
|
||||
PublicId = Guid.NewGuid();
|
||||
LawId = lawId;
|
||||
DiscountPercentage = discountPercentage;
|
||||
DiscountAmount = discountAmount;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public long LawId { get; private set; }
|
||||
|
||||
public string ContractNo { get; private set; }
|
||||
@@ -93,6 +98,11 @@ public class InstitutionContract : EntityBase
|
||||
// مبلغ قرارداد
|
||||
public double ContractAmount { get; private set; }
|
||||
|
||||
public double ContractAmountWithTax => !IsOldContract ? ContractAmount + ContractAmountTax
|
||||
: ContractAmount;
|
||||
|
||||
public double ContractAmountTax => ContractAmount*0.10;
|
||||
|
||||
//خسارت روزانه
|
||||
public double DailyCompenseation { get; private set; }
|
||||
|
||||
@@ -128,6 +138,10 @@ public class InstitutionContract : EntityBase
|
||||
public DateTime VerifyCodeCreation { get; private set; }
|
||||
public string VerifierFullName { get; private set; }
|
||||
public string VerifierPhoneNumber { get; private set; }
|
||||
|
||||
public double DiscountAmount { get; private set; }
|
||||
|
||||
public int DiscountPercentage { get; private set; }
|
||||
|
||||
[NotMapped] public bool VerifyCodeExpired => VerifyCodeCreation.Add(ExpireTime) <= DateTime.Now;
|
||||
|
||||
@@ -150,6 +164,10 @@ public class InstitutionContract : EntityBase
|
||||
|
||||
public List<InstitutionContractAmendment> Amendments { get; private set; }
|
||||
|
||||
public InstitutionContractSigningType? SigningType { get; private set; }
|
||||
|
||||
public bool IsOldContract => LawId== 0;
|
||||
|
||||
public InstitutionContract()
|
||||
{
|
||||
ContactInfoList = [];
|
||||
@@ -253,6 +271,10 @@ public class InstitutionContract : EntityBase
|
||||
{
|
||||
WorkshopGroup = null;
|
||||
}
|
||||
public void SetSigningType(InstitutionContractSigningType signingType)
|
||||
{
|
||||
SigningType = signingType;
|
||||
}
|
||||
}
|
||||
|
||||
public class InstitutionContractAmendment : EntityBase
|
||||
|
||||
@@ -10,13 +10,15 @@ public class InstitutionContractWorkshopCurrent:InstitutionContractWorkshopBase
|
||||
public InstitutionContractWorkshopCurrent(string workshopName, bool hasRollCallPlan,
|
||||
bool hasRollCallPlanInPerson, bool hasCustomizeCheckoutPlan, bool hasContractPlan,
|
||||
bool hasContractPlanInPerson, bool hasInsurancePlan, bool hasInsurancePlanInPerson,
|
||||
int personnelCount, double price,long institutionContractWorkshopGroupId,InstitutionContractWorkshopGroup workshopGroup,long workshopId) : base(workshopName, hasRollCallPlan,
|
||||
int personnelCount, double price,long institutionContractWorkshopGroupId,
|
||||
InstitutionContractWorkshopGroup workshopGroup,long workshopId,long initialWorkshopId) : base(workshopName, hasRollCallPlan,
|
||||
hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, hasContractPlan,
|
||||
hasContractPlanInPerson, hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, price)
|
||||
{
|
||||
InstitutionContractWorkshopGroupId = institutionContractWorkshopGroupId;
|
||||
WorkshopGroup = workshopGroup;
|
||||
WorkshopId = workshopId;
|
||||
InitialWorkshopId = initialWorkshopId;
|
||||
}
|
||||
public long InstitutionContractWorkshopGroupId { get; private set; }
|
||||
public InstitutionContractWorkshopGroup WorkshopGroup { get; private set; }
|
||||
|
||||
@@ -37,4 +37,10 @@ public class InstitutionContractWorkshopGroup : EntityBase
|
||||
CurrentWorkshops = updatedDetails.ToList();
|
||||
LastModifiedDate = DateTime.Now;
|
||||
}
|
||||
|
||||
public void AddCurrentWorkshop(InstitutionContractWorkshopCurrent currentWorkshop)
|
||||
{
|
||||
CurrentWorkshops.Add(currentWorkshop);
|
||||
LastModifiedDate = DateTime.Now;
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ public class InstitutionContractWorkshopInitial:InstitutionContractWorkshopBase
|
||||
WorkshopCreated = true;
|
||||
WorkshopCurrent = new InstitutionContractWorkshopCurrent(WorkshopName,Services.RollCall,Services.RollCallInPerson,
|
||||
Services.CustomizeCheckout,Services.Contract,Services.ContractInPerson,Services.Insurance,
|
||||
Services.InsuranceInPerson,PersonnelCount,Price,InstitutionContractWorkshopGroupId,WorkshopGroup,workshopId);
|
||||
Services.InsuranceInPerson,PersonnelCount,Price,InstitutionContractWorkshopGroupId,WorkshopGroup,workshopId,id);
|
||||
WorkshopCurrent.SetEmployers(Employers.Select(x=>x.EmployerId).ToList());
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ public class InstitutionContractExtensionTemp
|
||||
MonthlyPayment = monthly;
|
||||
OneTimePayment = oneTime;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using _0_Framework.Domain;
|
||||
using _0_Framework.Application;
|
||||
using _0_Framework.Domain;
|
||||
using CompanyManagment.App.Contracts.InstitutionPlan;
|
||||
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Company.Domain.InstitutionPlanAgg;
|
||||
|
||||
@@ -26,4 +28,18 @@ public interface IPlanPercentageRepository : IRepository<long, PlanPercentage>
|
||||
/// <param name="command"></param>
|
||||
/// <returns></returns>
|
||||
InstitutionPlanViewModel GetInstitutionPlanForWorkshop(WorkshopTempViewModel command);
|
||||
|
||||
/// <summary>
|
||||
/// دریافت دیتای مودال ایجاد
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<CreateServiceAmountDto> GetCreateModalData();
|
||||
|
||||
/// <summary>
|
||||
/// دریافت لیست مبالغ سرویس ها
|
||||
/// </summary>
|
||||
/// <param name="searchModel"></param>
|
||||
/// <returns></returns>
|
||||
Task<PagedResult<InstitutionPlanListDto>> GetList(
|
||||
InstitutionPlanSearchModel searchModel);
|
||||
}
|
||||
@@ -73,6 +73,7 @@ public interface IInsuranceListRepository:IRepository<long, InsuranceList>
|
||||
Task<InsuranceListConfirmOperation> GetInsuranceOperationDetails(long id);
|
||||
|
||||
Task<InsuranceListTabsCountViewModel> GetTabCounts(InsuranceListSearchModel searchModel);
|
||||
Task<PagedResult<InsuranceClientListViewModel>> GetInsuranceClientList(InsuranceClientSearchModel searchModel);
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -316,7 +316,10 @@ public class Workshop : EntityBase
|
||||
IsStaticCheckout = isStaticCheckout;
|
||||
}
|
||||
|
||||
|
||||
public void AddContractingPartyId(long contractingPartyId)
|
||||
{
|
||||
ContractingPartyId = contractingPartyId;
|
||||
}
|
||||
public void Active(string archiveCode)
|
||||
{
|
||||
this.IsActive = true;
|
||||
|
||||
8
Company.Domain/_common/IUnitOfWork.cs
Normal file
8
Company.Domain/_common/IUnitOfWork.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace Company.Domain._common;
|
||||
|
||||
public interface IUnitOfWork
|
||||
{
|
||||
void BeginAccountContext();
|
||||
void CommitAccountContext();
|
||||
void RollbackAccountContext();
|
||||
}
|
||||
@@ -26,7 +26,7 @@ public class CustomizeWorkshopGroupSettingExcelGenerator
|
||||
{
|
||||
public static byte[] Generate(List<CustomizeWorkshopGroupExcelViewModel> groups)
|
||||
{
|
||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using (var package = new ExcelPackage())
|
||||
{
|
||||
var worksheet = package.Workbook.Worksheets.Add("GroupsAndEmployees");
|
||||
|
||||
@@ -24,7 +24,7 @@ public class CaseManagementExcelGenerator
|
||||
};
|
||||
public static byte[] GenerateCheckoutTempExcelInfo(List<FileExcelViewModel> data)
|
||||
{
|
||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using var package = new ExcelPackage();
|
||||
CreateSheet(data, package,"همه");
|
||||
CreateSheet(data.Where(x=>x.Status ==2).ToList(), package,"فعال");
|
||||
|
||||
@@ -46,7 +46,7 @@ public class CustomizeCheckoutExcelGenerator
|
||||
};
|
||||
public static byte[] GenerateCheckoutTempExcelInfo(List<CustomizeCheckoutTempExcelViewModel> data, List<string> selectedParameters)
|
||||
{
|
||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using var package = new ExcelPackage();
|
||||
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="EPPlus" Version="7.5.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
|
||||
<PackageReference Include="Azure.Identity" Version="1.17.1" />
|
||||
<PackageReference Include="EPPlus" Version="8.4.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AccountMangement.Infrastructure.EFCore\AccountMangement.Infrastructure.EFCore.csproj" />
|
||||
|
||||
@@ -7,7 +7,7 @@ public class EmployeeBankInfoExcelGenerator
|
||||
{
|
||||
public static byte[] Generate(List<EmployeeBankInfoExcelViewModel> list)
|
||||
{
|
||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using var package = new ExcelPackage();
|
||||
var worksheet = package.Workbook.Worksheets.Add("EmployeeBankInfo");
|
||||
|
||||
@@ -166,7 +166,7 @@ public class EmployeeBankInfoExcelGenerator
|
||||
|
||||
public static byte[] Generate2(List<EmployeeBankInfoExcelViewModel> list)
|
||||
{
|
||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using var package = new ExcelPackage();
|
||||
foreach (var employee in list)
|
||||
{
|
||||
@@ -220,4 +220,4 @@ public class EmployeeBankInfoExcelGenerator
|
||||
cell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
|
||||
cell.Style.Fill.PatternType = ExcelFillStyle.Solid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ public class InstitutionContractExcelGenerator
|
||||
|
||||
public static byte[] GenerateExcel(List<InstitutionContractViewModel> institutionContractViewModels)
|
||||
{
|
||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using var package = new ExcelPackage();
|
||||
var allWorksheet = package.Workbook.Worksheets.Add("همه");
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ public class RollCallExcelGenerator : ExcelGenerator
|
||||
{
|
||||
public static byte[] CaseHistoryExcelForEmployee(CaseHistoryRollCallExcelForEmployeeViewModel data)
|
||||
{
|
||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using var package = new OfficeOpenXml.ExcelPackage();
|
||||
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
||||
var rollCalls = data.RollCalls;
|
||||
@@ -181,7 +181,7 @@ public class RollCallExcelGenerator : ExcelGenerator
|
||||
|
||||
public static byte[] CaseHistoryExcelForOneDay(CaseHistoryRollCallForOneDayViewModel data)
|
||||
{
|
||||
OfficeOpenXml.ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using var package = new OfficeOpenXml.ExcelPackage();
|
||||
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
|
||||
var rollCalls = data.RollCalls;
|
||||
|
||||
@@ -43,7 +43,7 @@ public class SalaryAidImportExcel
|
||||
ValidData = []
|
||||
};
|
||||
|
||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
|
||||
if (file == null || file.Length == 0)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@ public class WorkshopRollCallExcelExporter
|
||||
{
|
||||
public static byte[] Export(List<WorkshopRollCallExcelViewModel> workshops)
|
||||
{
|
||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||
using (var package = new ExcelPackage())
|
||||
{
|
||||
var ws = package.Workbook.Worksheets.Add("Workshops");
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Company.Domain.CameraBugReportAgg;
|
||||
using MongoDB.Bson;
|
||||
using MongoDB.Driver;
|
||||
|
||||
namespace CompanyManagement.Infrastructure.Mongo.CameraBugReportRepo;
|
||||
|
||||
/// <summary>
|
||||
/// پیادهسازی انبار گزارش خرابی دوربین برای MongoDB
|
||||
/// </summary>
|
||||
public class CameraBugReportRepository : ICameraBugReportRepository
|
||||
{
|
||||
private readonly IMongoCollection<CameraBugReport> _cameraBugReports;
|
||||
|
||||
public CameraBugReportRepository(IMongoDatabase database)
|
||||
{
|
||||
_cameraBugReports = database.GetCollection<CameraBugReport>("CameraBugReports");
|
||||
}
|
||||
|
||||
public async Task CreateAsync(CameraBugReport bugReport)
|
||||
{
|
||||
await _cameraBugReports.InsertOneAsync(bugReport);
|
||||
}
|
||||
|
||||
public async Task UpdateAsync(CameraBugReport bugReport)
|
||||
{
|
||||
await _cameraBugReports.ReplaceOneAsync(
|
||||
x => x.Id == bugReport.Id,
|
||||
bugReport);
|
||||
}
|
||||
|
||||
public async Task<CameraBugReport> GetByIdAsync(Guid id)
|
||||
{
|
||||
return await _cameraBugReports
|
||||
.Find(x => x.Id == id)
|
||||
.FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
public async Task<List<CameraBugReport>> GetAllAsync()
|
||||
{
|
||||
return await _cameraBugReports
|
||||
.Find(_ => true)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<List<CameraBugReport>> GetAllAsync(int skip, int take)
|
||||
{
|
||||
return await _cameraBugReports
|
||||
.Find(_ => true)
|
||||
.Skip(skip)
|
||||
.Limit(take)
|
||||
.SortByDescending(x => x.CreationDate)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task DeleteAsync(Guid id)
|
||||
{
|
||||
await _cameraBugReports.DeleteOneAsync(x => x.Id == id);
|
||||
}
|
||||
|
||||
public async Task<bool> IsExistAsync(Guid id)
|
||||
{
|
||||
var result = await _cameraBugReports
|
||||
.Find(x => x.Id == id)
|
||||
.FirstOrDefaultAsync();
|
||||
return result != null;
|
||||
}
|
||||
|
||||
public async Task<List<CameraBugReport>> FilterAsync(
|
||||
CameraBugReportType? type = null,
|
||||
CameraBugPriority? priority = null,
|
||||
CameraBugReportStatus? status = null,
|
||||
string searchTerm = null,
|
||||
int skip = 0,
|
||||
int take = 10)
|
||||
{
|
||||
var filterDefinition = BuildFilterDefinition(type, priority, status, searchTerm);
|
||||
|
||||
return await _cameraBugReports
|
||||
.Find(filterDefinition)
|
||||
.Skip(skip)
|
||||
.Limit(take)
|
||||
.SortByDescending(x => x.CreationDate)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<int> CountAsync(
|
||||
CameraBugReportType? type = null,
|
||||
CameraBugPriority? priority = null,
|
||||
CameraBugReportStatus? status = null,
|
||||
string searchTerm = null)
|
||||
{
|
||||
var filterDefinition = BuildFilterDefinition(type, priority, status, searchTerm);
|
||||
var count = await _cameraBugReports.CountDocumentsAsync(filterDefinition);
|
||||
return (int)count;
|
||||
}
|
||||
|
||||
private FilterDefinition<CameraBugReport> BuildFilterDefinition(
|
||||
CameraBugReportType? type = null,
|
||||
CameraBugPriority? priority = null,
|
||||
CameraBugReportStatus? status = null,
|
||||
string searchTerm = null)
|
||||
{
|
||||
var filters = new List<FilterDefinition<CameraBugReport>>();
|
||||
|
||||
if (type.HasValue)
|
||||
filters.Add(Builders<CameraBugReport>.Filter.Eq(x => x.Type, type.Value));
|
||||
|
||||
if (priority.HasValue)
|
||||
filters.Add(Builders<CameraBugReport>.Filter.Eq(x => x.Priority, priority.Value));
|
||||
|
||||
if (status.HasValue)
|
||||
filters.Add(Builders<CameraBugReport>.Filter.Eq(x => x.Status, status.Value));
|
||||
|
||||
if (!string.IsNullOrEmpty(searchTerm))
|
||||
{
|
||||
var searchFilter = Builders<CameraBugReport>.Filter.Or(
|
||||
Builders<CameraBugReport>.Filter.Regex(x => x.Title, new BsonRegularExpression(searchTerm, "i")),
|
||||
Builders<CameraBugReport>.Filter.Regex(x => x.Description, new BsonRegularExpression(searchTerm, "i")),
|
||||
Builders<CameraBugReport>.Filter.Regex(x => x.UserEmail, new BsonRegularExpression(searchTerm, "i"))
|
||||
);
|
||||
filters.Add(searchFilter);
|
||||
}
|
||||
|
||||
if (filters.Count == 0)
|
||||
return Builders<CameraBugReport>.Filter.Empty;
|
||||
|
||||
return Builders<CameraBugReport>.Filter.And(filters);
|
||||
}
|
||||
|
||||
// Sync methods from IRepository interface (not used in MongoDB flow but required for interface implementation)
|
||||
public CameraBugReport Get(long id)
|
||||
{
|
||||
throw new NotImplementedException("استفاده از GetByIdAsync برای MongoDB");
|
||||
}
|
||||
|
||||
public List<CameraBugReport> Get()
|
||||
{
|
||||
throw new NotImplementedException("استفاده از GetAllAsync برای MongoDB");
|
||||
}
|
||||
|
||||
public void Create(CameraBugReport entity)
|
||||
{
|
||||
throw new NotImplementedException("استفاده از CreateAsync برای MongoDB");
|
||||
}
|
||||
|
||||
public bool ExistsIgnoreQueryFilter(System.Linq.Expressions.Expression<Func<CameraBugReport, bool>> expression)
|
||||
{
|
||||
throw new NotImplementedException("استفاده از IsExistAsync برای MongoDB");
|
||||
}
|
||||
|
||||
public bool Exists(System.Linq.Expressions.Expression<Func<CameraBugReport, bool>> expression)
|
||||
{
|
||||
throw new NotImplementedException("استفاده از FilterAsync برای MongoDB");
|
||||
}
|
||||
|
||||
public void SaveChanges()
|
||||
{
|
||||
throw new NotImplementedException("MongoDB نیازی به SaveChanges ندارد");
|
||||
}
|
||||
|
||||
public async Task SaveChangesAsync()
|
||||
{
|
||||
// MongoDB خودکار ذخیره میکند، بنابراین این متد خالی است
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task<Microsoft.EntityFrameworkCore.Storage.IDbContextTransaction> BeginTransactionAsync()
|
||||
{
|
||||
throw new NotImplementedException("MongoDB اعاملات را بصورت متفاوت مدیریت میکند");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
@@ -11,7 +11,8 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MongoDB.Driver" Version="3.5.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
<PackageReference Include="MongoDB.Driver" Version="3.5.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||
{
|
||||
public class CameraBugReportDetailViewModel
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string UserEmail { get; set; }
|
||||
public long? AccountId { get; set; }
|
||||
public string DeviceModel { get; set; }
|
||||
public string OsVersion { get; set; }
|
||||
public string Platform { get; set; }
|
||||
public string Manufacturer { get; set; }
|
||||
public string DeviceId { get; set; }
|
||||
public string ScreenResolution { get; set; }
|
||||
public int MemoryInMB { get; set; }
|
||||
public int StorageInMB { get; set; }
|
||||
public int BatteryLevel { get; set; }
|
||||
public bool IsCharging { get; set; }
|
||||
public string NetworkType { get; set; }
|
||||
public string AppVersion { get; set; }
|
||||
public string BuildNumber { get; set; }
|
||||
public string PackageName { get; set; }
|
||||
public DateTime InstallTime { get; set; }
|
||||
public DateTime LastUpdateTime { get; set; }
|
||||
public string Flavor { get; set; }
|
||||
public CameraBugReportType Type { get; set; }
|
||||
public CameraBugPriority Priority { get; set; }
|
||||
public CameraBugReportStatus Status { get; set; }
|
||||
public string StackTrace { get; set; }
|
||||
public DateTime CreationDate { get; set; }
|
||||
public DateTime? UpdateDate { get; set; }
|
||||
public List<string> Logs { get; set; }
|
||||
public List<CameraBugReportScreenshotViewModel> Screenshots { get; set; }
|
||||
}
|
||||
|
||||
public class CameraBugReportScreenshotViewModel
|
||||
{
|
||||
public string FileName { get; set; }
|
||||
public DateTime UploadDate { get; set; }
|
||||
public string Base64Data { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||
{
|
||||
public class CameraBugReportViewModel
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string UserEmail { get; set; }
|
||||
public long? AccountId { get; set; }
|
||||
public string DeviceModel { get; set; }
|
||||
public string AppVersion { get; set; }
|
||||
public CameraBugReportType Type { get; set; }
|
||||
public CameraBugPriority Priority { get; set; }
|
||||
public CameraBugReportStatus Status { get; set; }
|
||||
public DateTime CreationDate { get; set; }
|
||||
public DateTime? UpdateDate { get; set; }
|
||||
public int LogsCount { get; set; }
|
||||
public int ScreenshotsCount { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||
{
|
||||
public class CreateCameraBugReportCommand
|
||||
{
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string UserEmail { get; set; }
|
||||
public long? AccountId { get; set; }
|
||||
public string DeviceModel { get; set; }
|
||||
public string OsVersion { get; set; }
|
||||
public string Platform { get; set; }
|
||||
public string Manufacturer { get; set; }
|
||||
public string DeviceId { get; set; }
|
||||
public string ScreenResolution { get; set; }
|
||||
public int MemoryInMB { get; set; }
|
||||
public int StorageInMB { get; set; }
|
||||
public int BatteryLevel { get; set; }
|
||||
public bool IsCharging { get; set; }
|
||||
public string NetworkType { get; set; }
|
||||
public string AppVersion { get; set; }
|
||||
public string BuildNumber { get; set; }
|
||||
public string PackageName { get; set; }
|
||||
public DateTime InstallTime { get; set; }
|
||||
public DateTime LastUpdateTime { get; set; }
|
||||
public string Flavor { get; set; }
|
||||
public CameraBugReportType Type { get; set; }
|
||||
public CameraBugPriority Priority { get; set; }
|
||||
public string StackTrace { get; set; }
|
||||
public List<string> Logs { get; set; }
|
||||
public List<string> Screenshots { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
using System;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||
{
|
||||
public class EditCameraBugReportCommand
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public CameraBugPriority Priority { get; set; }
|
||||
public CameraBugReportStatus Status { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.Application;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.CameraBugReport
|
||||
{
|
||||
public interface ICameraBugReportApplication
|
||||
{
|
||||
Task<OperationResult> CreateAsync(CreateCameraBugReportCommand command);
|
||||
Task<OperationResult> EditAsync(EditCameraBugReportCommand command);
|
||||
Task<OperationResult> DeleteAsync(Guid id);
|
||||
Task<List<CameraBugReportViewModel>> GetAllAsync(CameraBugReportSearchModel searchModel);
|
||||
Task<CameraBugReportDetailViewModel> GetDetailsAsync(Guid id);
|
||||
Task<bool> IsExistAsync(Guid id);
|
||||
|
||||
// Keep sync methods for backward compatibility but they delegate to async
|
||||
OperationResult Create(CreateCameraBugReportCommand command);
|
||||
OperationResult Edit(EditCameraBugReportCommand command);
|
||||
OperationResult Delete(Guid id);
|
||||
List<CameraBugReportViewModel> GetAll(CameraBugReportSearchModel searchModel);
|
||||
CameraBugReportDetailViewModel GetDetails(Guid id);
|
||||
bool IsExist(Guid id);
|
||||
}
|
||||
|
||||
public class CameraBugReportSearchModel
|
||||
{
|
||||
public CameraBugReportType? Type { get; set; }
|
||||
public CameraBugPriority? Priority { get; set; }
|
||||
public CameraBugReportStatus? Status { get; set; }
|
||||
public string SearchTerm { get; set; }
|
||||
public int PageNumber { get; set; } = 1;
|
||||
public int PageSize { get; set; } = 10;
|
||||
}
|
||||
}
|
||||
|
||||
/// </summary>
|
||||
/// وضعیت گزارش خرابی دوربین
|
||||
/// <summary>
|
||||
public enum CameraBugReportStatus
|
||||
{
|
||||
Reopened = 5, // مجدداً باز شده
|
||||
Closed = 4, // بسته شده
|
||||
Fixed = 3, // رفع شده
|
||||
InProgress = 2, // در حال بررسی
|
||||
Open = 1, // باز
|
||||
}
|
||||
|
||||
/// </summary>
|
||||
/// اولویت گزارش خرابی دوربین
|
||||
/// <summary>
|
||||
public enum CameraBugPriority
|
||||
{
|
||||
Low = 4, // پایین
|
||||
Medium = 3, // متوسط
|
||||
High = 2, // بالا
|
||||
Critical = 1, // بحرانی
|
||||
}
|
||||
|
||||
/// </summary>
|
||||
/// انواع گزارش خرابی دوربین
|
||||
/// <summary>
|
||||
public enum CameraBugReportType
|
||||
{
|
||||
Other = 8, // سایر
|
||||
CrashOnCapture = 7, // کرش هنگام عکسبرداری
|
||||
LightingIssue = 6, // مشکل روشنایی
|
||||
FocusIssue = 5, // مشکل فوکوس
|
||||
PerformanceIssue = 4, // مشکل عملکردی
|
||||
FaceRecognitionFailed = 3, // شناسایی چهره ناموفق
|
||||
BlurryImage = 2, // تصویر مبهم
|
||||
CameraNotWorking = 1, // دوربین کار نمیکند
|
||||
}
|
||||
@@ -1,12 +1,16 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||
<PackageReference Include="PersianTools.Core" Version="2.0.4" />
|
||||
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -60,7 +60,7 @@ public interface IEmployeeApplication
|
||||
/// <returns></returns>
|
||||
Task<OperationResult<EmployeeByNationalCodeInWorkshopViewModel>>
|
||||
ValidateCreateEmployeeClientByNationalCodeAndWorkshopId(string nationalCode,
|
||||
string birthDate, long workshopId);
|
||||
string birthDate,bool authorizedCanceled, long workshopId);
|
||||
|
||||
/// <summary>
|
||||
/// پرسنل هایی که در کارگاهی از سمت ادمین شروع به کار کرده اند
|
||||
|
||||
@@ -13,5 +13,6 @@ namespace CompanyManagment.App.Contracts.EmployeeDocuments
|
||||
public string EmployerName { get; set; }
|
||||
public List<EmployeeDocumentItemViewModel> SubmittedItems { get; set; }
|
||||
public int EmployeesWithoutDocumentCount { get; set; }
|
||||
public long EmployeeId { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public enum InstitutionContractSigningType
|
||||
{
|
||||
/// <summary>
|
||||
/// قدیمی
|
||||
/// </summary>
|
||||
Legacy = 0,
|
||||
/// <summary>
|
||||
/// الکترونیکی با کد یکبار مصرف
|
||||
/// </summary>
|
||||
OtpBased = 1,
|
||||
/// <summary>
|
||||
/// به صورت فیزیکی
|
||||
/// </summary>
|
||||
Physical = 2
|
||||
}
|
||||
@@ -87,7 +87,7 @@ public class CreateInstitutionContractRequest
|
||||
/// <summary>
|
||||
/// مبلغ کل قرارداد
|
||||
/// </summary>
|
||||
public double TotalAmount { get; set; }
|
||||
public double PaymentAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// آیا قرارداد اقساطی است؟
|
||||
@@ -102,6 +102,10 @@ public class CreateInstitutionContractRequest
|
||||
public double OneMonthAmount { get; set; }
|
||||
|
||||
public long LawId { get; set; }
|
||||
|
||||
public int DiscountPercentage { get; set; }
|
||||
|
||||
public double DiscountAmount { get; set; }
|
||||
}
|
||||
/// <summary>
|
||||
/// مدت زمان قرارداد نهاد
|
||||
|
||||
@@ -7,7 +7,6 @@ using System.Threading.Tasks;
|
||||
using _0_Framework.Application;
|
||||
using _0_Framework.Application.Sms;
|
||||
using CompanyManagment.App.Contracts.Checkout;
|
||||
using CompanyManagment.App.Contracts.Law;
|
||||
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
||||
using CompanyManagment.App.Contracts.Workshop;
|
||||
using CompanyManagment.App.Contracts.WorkshopPlan;
|
||||
@@ -215,7 +214,9 @@ public interface IInstitutionContractApplication
|
||||
Task<OperationResult<OtpResultViewModel>> SendVerifyOtp(Guid id);
|
||||
Task<OperationResult<string>> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl);
|
||||
Task<InstitutionContractWorkshopDetailViewModel> GetWorkshopInitialDetails(long workshopDetailsId);
|
||||
|
||||
InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request);
|
||||
InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
|
||||
|
||||
#region Extension
|
||||
|
||||
Task<InstitutionContractExtensionInquiryResult> GetExtensionInquiry(long previousContractId);
|
||||
@@ -228,6 +229,12 @@ public interface IInstitutionContractApplication
|
||||
|
||||
Task<InstitutionContractExtensionPaymentResponse> GetExtensionPaymentMethod(
|
||||
InstitutionContractExtensionPaymentRequest request);
|
||||
|
||||
Task<InstitutionContractDiscountResponse> SetDiscountForExtension(
|
||||
InstitutionContractSetDiscountForExtensionRequest request);
|
||||
Task<InstitutionContractDiscountResponse> ResetDiscountForExtension(
|
||||
InstitutionContractResetDiscountForExtensionRequest request);
|
||||
|
||||
|
||||
Task<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request);
|
||||
Task<List<InstitutionContractSelectListViewModel>> GetInstitutionContractSelectList(string search,string selected);
|
||||
@@ -252,85 +259,13 @@ public interface IInstitutionContractApplication
|
||||
/// <returns></returns>
|
||||
Task<InstitutionContractPrintViewModel> PrintOneAsync(long id);
|
||||
|
||||
Task<OperationResult> SetPendingWorkflow(long entityId);
|
||||
}
|
||||
|
||||
public class InstitutionContractPrintViewModel
|
||||
{
|
||||
public InstitutionContratVerificationParty FirstParty { get; set; }
|
||||
public InstitutionContratVerificationParty SecondParty { get; set; }
|
||||
public string ContractNo { get; set; }
|
||||
public string CreationDate { get; set; }
|
||||
public string ContractStart { get; set; }
|
||||
public string ContractEnd { get; set; }
|
||||
public List<GetInstitutionVerificationDetailsWorkshopsViewModel> Workshops { get; set; }
|
||||
public string TotalPrice { get; set; }
|
||||
public string TaxPrice { get; set; }
|
||||
public string PaymentPrice { get; set; }
|
||||
public string VerifyCode { get; set; }
|
||||
public string VerifyDate { get; set; }
|
||||
public string VerifyTime { get; set; }
|
||||
public string VerifierFullName { get; set; }
|
||||
public string VerifierPhoneNumber { get; set; }
|
||||
public LawViewModel LawViewModel { get; set; }
|
||||
public string Obligation { get; set; }
|
||||
}
|
||||
|
||||
public class InsertAmendmentTempWorkshopResponse
|
||||
{
|
||||
public Guid WorkshopTempId { get; set; }
|
||||
public string Amount { get; set; }
|
||||
}
|
||||
|
||||
public class InstitutionContractAmendmentWorkshopsResponse
|
||||
{
|
||||
Task<OperationResult> SetPendingWorkflow(long entityId,InstitutionContractSigningType signingType);
|
||||
Task<long> GetIdByInstallmentId(long installmentId);
|
||||
/// <summary>
|
||||
///
|
||||
/// تایید قرارداد مالی به صورت دستی
|
||||
/// </summary>
|
||||
public List<InstitutionContractAmendmentTempWorkshopViewModel> Workshops { get; set; }
|
||||
/// <param name="institutionContractId"></param>
|
||||
/// <returns></returns>
|
||||
Task<OperationResult> VerifyInstitutionContractManually(long institutionContractId);
|
||||
|
||||
public Guid TempId { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class InstitutionContractSelectListViewModel : SelectListViewModel;
|
||||
|
||||
public class InstitutionContractExtensionInquiryResponse
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public string FName { get; set; }
|
||||
public string LName { get; set; }
|
||||
public string DateOfBirthFa { get; set; }
|
||||
public string FatherName { get; set; }
|
||||
public string IdNumberSerial { get; set; }
|
||||
public string IdNumber { get; set; }
|
||||
public string Address { get; set; }
|
||||
public string Phone { get; set; }
|
||||
public string City { get; set; }
|
||||
public string State { get; set; }
|
||||
public long RepresentativeId { get; set; }
|
||||
public string NationalCode { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class InstitutionContractExtensionPaymentMonthly:InstitutionContractExtensionPaymentOneTime
|
||||
{
|
||||
public List<MonthlyInstallment> Installments { get; set; }
|
||||
}
|
||||
|
||||
public class InstitutionContractExtensionPaymentOneTime
|
||||
{
|
||||
/// <summary>
|
||||
/// مجموع مبالغ
|
||||
/// </summary>
|
||||
public string TotalAmount { get; set; }
|
||||
/// <summary>
|
||||
/// ارزش افزوده
|
||||
/// </summary>
|
||||
public string Tax { get; set; }
|
||||
/// <summary>
|
||||
/// مبلغ قابل پرداخت
|
||||
/// </summary>
|
||||
public string PaymentAmount { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InsertAmendmentTempWorkshopResponse
|
||||
{
|
||||
public Guid WorkshopTempId { get; set; }
|
||||
public string Amount { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InstitutionContractAmendmentWorkshopsResponse
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public List<InstitutionContractAmendmentTempWorkshopViewModel> Workshops { get; set; }
|
||||
|
||||
public Guid TempId { get; set; }
|
||||
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
using System.Collections.Generic;
|
||||
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InstitutionContractDiscountResponse
|
||||
{
|
||||
public InstitutionContractDiscountOneTimeViewModel OneTime { get; set; }
|
||||
public InstitutionContractDiscountMonthlyViewModel Monthly { get; set; }
|
||||
}
|
||||
public class InstitutionContractDiscountMonthlyViewModel:InstitutionContractDiscountOneTimeViewModel
|
||||
{
|
||||
public List<MonthlyInstallment> Installments { get; set; }
|
||||
}
|
||||
|
||||
public class InstitutionContractDiscountOneTimeViewModel
|
||||
{
|
||||
/// <summary>
|
||||
/// مجموع مبالغ
|
||||
/// </summary>
|
||||
public string TotalAmount { get; set; }
|
||||
/// <summary>
|
||||
/// ارزش افزوده
|
||||
/// </summary>
|
||||
public string Tax { get; set; }
|
||||
/// <summary>
|
||||
/// مبلغ قابل پرداخت
|
||||
/// </summary>
|
||||
public string PaymentAmount { get; set; }
|
||||
|
||||
public string DiscountedAmount { get; set; }
|
||||
|
||||
public int DiscountPercetage { get; set; }
|
||||
|
||||
public string Obligation { get; set; }
|
||||
|
||||
public string OneMonthAmount { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InstitutionContractExtensionInquiryResponse
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public string FName { get; set; }
|
||||
public string LName { get; set; }
|
||||
public string DateOfBirthFa { get; set; }
|
||||
public string FatherName { get; set; }
|
||||
public string IdNumberSerial { get; set; }
|
||||
public string IdNumber { get; set; }
|
||||
public string Address { get; set; }
|
||||
public string Phone { get; set; }
|
||||
public string City { get; set; }
|
||||
public string State { get; set; }
|
||||
public long RepresentativeId { get; set; }
|
||||
public string NationalCode { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.Collections.Generic;
|
||||
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InstitutionContractExtensionPaymentMonthly:InstitutionContractExtensionPaymentOneTime
|
||||
{
|
||||
public List<MonthlyInstallment> Installments { get; set; }
|
||||
}
|
||||
public class InstitutionContractExtensionPaymentOneTime
|
||||
{
|
||||
/// <summary>
|
||||
/// مجموع مبالغ
|
||||
/// </summary>
|
||||
public string TotalAmount { get; set; }
|
||||
/// <summary>
|
||||
/// ارزش افزوده
|
||||
/// </summary>
|
||||
public string Tax { get; set; }
|
||||
/// <summary>
|
||||
/// مبلغ قابل پرداخت
|
||||
/// </summary>
|
||||
public string PaymentAmount { get; set; }
|
||||
}
|
||||
@@ -17,6 +17,9 @@ public class InstitutionContractPaymentOneTimeViewModel
|
||||
/// مبلغ قابل پرداخت
|
||||
/// </summary>
|
||||
public string PaymentAmount { get; set; }
|
||||
|
||||
public string DiscountedAmount { get; set; }
|
||||
public int DiscountPercetage { get; set; }
|
||||
}
|
||||
public class InstitutionContractPaymentMonthlyViewModel:InstitutionContractPaymentOneTimeViewModel
|
||||
{
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
using System.Collections.Generic;
|
||||
using CompanyManagment.App.Contracts.Law;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InstitutionContractPrintViewModel
|
||||
{
|
||||
public InstitutionContratVerificationParty FirstParty { get; set; }
|
||||
public InstitutionContratVerificationParty SecondParty { get; set; }
|
||||
public string ContractNo { get; set; }
|
||||
public string CreationDate { get; set; }
|
||||
public string ContractStart { get; set; }
|
||||
public string ContractEnd { get; set; }
|
||||
public List<GetInstitutionVerificationDetailsWorkshopsViewModel> Workshops { get; set; }
|
||||
public string TotalPrice { get; set; }
|
||||
public string TaxPrice { get; set; }
|
||||
public string PaymentPrice { get; set; }
|
||||
public string OneMonthPrice { get; set; }
|
||||
public string VerifyCode { get; set; }
|
||||
public string VerifyDate { get; set; }
|
||||
public string VerifyTime { get; set; }
|
||||
public string VerifierFullName { get; set; }
|
||||
public string VerifierPhoneNumber { get; set; }
|
||||
public LawViewModel LawViewModel { get; set; }
|
||||
public string Obligation { get; set; }
|
||||
public string OneMonthWithoutTax { get; set; }
|
||||
public string OneMonthTax { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InstitutionContractResetDiscountForCreateRequest
|
||||
{
|
||||
public int DiscountPercentage { get; set; }
|
||||
public double TotalAmount { get; set; }
|
||||
public bool IsInstallment { get; set; }
|
||||
public InstitutionContractDuration Duration { get; set; }
|
||||
public double OneMonthAmount { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
namespace CompanyManagment.App.Contracts.InstitutionContract;
|
||||
|
||||
public class InstitutionContractResetDiscountForExtensionRequest
|
||||
{
|
||||
public Guid TempId { get; set; }
|
||||
public bool IsInstallment { get; set; }
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user