diff --git a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs
index b1704413..03e9fd60 100644
--- a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs
+++ b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs
@@ -104,12 +104,25 @@ public class InstitutionContractListSearchModel
///
public string ContractDateTo { get; set; }
+ public InstitutionContractStatus? Status { get; set; }
+
///
/// ایندکس صفحه
///
public int PageIndex { get; set; }
}
+public enum InstitutionContractStatus
+{
+ Active,
+ Deactive,
+ DeactiveWithDebt,
+ Block,
+ Free,
+ PendingForRenewal,
+ WithoutWorkshop,
+}
+
///
/// لیست قرارداد های موسسه
///
@@ -202,7 +215,12 @@ public class GetInstitutionContractListItemsViewModel
public double Balance { get; set; }
///
- /// رنگ بک گراند
+ /// وضعیت قرارداد
///
- public KnownColor Color { get; set; }
+ public InstitutionContractStatus Status { get; set; }
+
+ ///
+ /// آیا منقضی شده است
+ ///
+ public bool IsExpired { get; set; }
}
\ No newline at end of file
diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs
index 993e3ea7..32f8a66a 100644
--- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs
+++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
+using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.Application;
@@ -1002,25 +1003,26 @@ public class InstitutionContractRepository : RepositoryBase GetList(InstitutionContractListSearchModel searchModel)
{
var query = _context.InstitutionContractSet
- .Include(x => x.ContactInfoList).AsSplitQuery();
+ .Include(x => x.ContactInfoList);
var totalAmount = await query.Where(x => x.IsActiveString == "true").SumAsync(x => x.ContractAmount);
var totalDebt = await _context.FinancialStatments.Include(x => x.FinancialTransactionList)
- .Where(x => query.Select(i => i.ContractingPartyId).Contains(x.ContractingPartyId))
- .SumAsync(x => x.FinancialTransactionList.Sum(t => t.Deptor - t.Creditor));
+ .Where(x => query.Where(q=>q.IsActiveString == "true" || q.IsActiveString == "blue").Select(i => i.ContractingPartyId).Contains(x.ContractingPartyId))
+ .SelectMany(x => x.FinancialTransactionList)
+ .SumAsync(x => x.Deptor - x.Creditor);
var joinedQuery = query.Join(_context.PersonalContractingParties
- .Include(x => x.Employers)
- .ThenInclude(x => x.WorkshopEmployers)
- .ThenInclude(x => x.Workshop),
- contract => contract.ContractingPartyId,
- contractingParty => contractingParty.id,
- (contract, contractingParty) => new { contract, contractingParty })
- .Join(_context.FinancialStatments.Include(x=>x.FinancialTransactionList),
- x =>x.contractingParty.id,
- statement =>statement.ContractingPartyId,
- (x, statement) => new {x.contractingParty,contract = x.contract,statement });
+ .Include(x => x.Employers)
+ .ThenInclude(x => x.WorkshopEmployers)
+ .ThenInclude(x => x.Workshop),
+ contract => contract.ContractingPartyId,
+ contractingParty => contractingParty.id,
+ (contract, contractingParty) => new { contract, contractingParty })
+ .Join(_context.FinancialStatments.Include(x => x.FinancialTransactionList),
+ x => x.contractingParty.id,
+ statement => statement.ContractingPartyId,
+ (x, statement) => new { x.contractingParty, x.contract, statement });
#region Search
@@ -1058,8 +1060,8 @@ public class InstitutionContractRepository : RepositoryBase x.contract.ContractAmount <= searchModel.AmountTo);
}
- if (string.IsNullOrWhiteSpace(searchModel.ContractDateFrom) &&
- string.IsNullOrWhiteSpace(searchModel.ContractDateTo))
+ if (!string.IsNullOrWhiteSpace(searchModel.ContractDateFrom) &&
+ !string.IsNullOrWhiteSpace(searchModel.ContractDateTo))
{
if (!searchModel.ContractDateFrom.TryToGeorgianDateTime(out var dateFrom))
throw new BadRequestException("تاریخ وارد شده نامعتبر است");
@@ -1078,26 +1080,33 @@ public class InstitutionContractRepository : RepositoryBase
+ Items = list.Select(x =>
{
var workshops = x.contractingParty.Employers
.SelectMany(e => e.WorkshopEmployers.Select(we => we.Workshop)).DistinctBy(w => w.id).ToList();
-
+
var employers = x.contractingParty.Employers.ToList();
-
- var arc = workshops.Select(w => new
- {
- ArchiveCodeInt = w.ArchiveCode.Substring(0, 1) == "b" ? 10000000 : w.ArchiveCode.ConvertToInt(),
- }).OrderBy(w => w.ArchiveCodeInt).ToList();
- var minArchiveCode = arc.Min(x => x.ArchiveCodeInt);
+
+ var arc = workshops.Select(w =>
+ w.ArchiveCode.Substring(0, 1) == "b"
+ ? 10000000
+ : w.ArchiveCode.ConvertToInt()
+ ).OrderBy(w => w).ToList();
+
+ var minArchiveCode = arc.Count > 0 ? arc.Min(a => a) : 0;
+
var archiveCode = minArchiveCode == 10000000 ? 0 : minArchiveCode;
+ var status = SetContractStatus(x.contract.ContractEndGr, x.contract.ContractAmount,
+ x.contract.IsActiveString);
return new GetInstitutionContractListItemsViewModel()
{
ContractAmount = x.contract.ContractAmount,
@@ -1106,23 +1115,63 @@ public class InstitutionContractRepository : RepositoryBasew.WorkshopFullName).ToList(),
+ WorkshopNames = workshops.Select(w => w.WorkshopFullName).ToList(),
RepresentativeName = x.contractingParty.RepresentativeFullName,
HasSigniture = x.contract.Signature == "1",
Id = x.contract.id,
ContractNo = x.contract.ContractNo,
ArchiveNo = archiveCode.ToString(),
EmployeesCount = _context.LeftWorkList
- .Where(l=>workshops.Select(w=>w.id).Contains(l.id))
- .Count(l=>l.StartWorkDate<=DateTime.Now && l.LeftWorkDate>=DateTime.Now),
- EmployerNames = employers.Select(e=>e.FullName).ToList(),
- //Todo:FillColor
+ .Where(l => workshops.Select(w => w.id).Contains(l.id))
+ .Count(l => l.StartWorkDate <= DateTime.Now && l.LeftWorkDate >= DateTime.Now),
+ EmployerNames = employers.Select(e => e.FullName).ToList(),
+ Status = status.status,
+ IsExpired = status.isExpiered
};
}).ToList()
};
return res;
}
+ private (InstitutionContractStatus status, bool isExpiered) SetContractStatus(DateTime contractEndGr, double contractAmount,
+ string isActiveString)
+ {
+ var now = DateTime.Now;
+ var nowFa = now.ToFarsi();
+ var endFa = nowFa.FindeEndOfMonth();
+ var endThisMontGr = endFa.ToGeorgianDateTime();
+ InstitutionContractStatus status = InstitutionContractStatus.Active;
+ bool isExpier = false;
+ if (contractEndGr < now)
+ {
+ status = InstitutionContractStatus.Deactive;
+ isExpier = true;
+ }
+
+ if (contractEndGr >= now && contractEndGr <= endThisMontGr)
+ {
+ status = InstitutionContractStatus.PendingForRenewal;
+ isExpier = true;
+ }
+
+ if (contractAmount == 0)
+ {
+ status = InstitutionContractStatus.Free;
+ if ((contractEndGr >= now && contractEndGr <= endThisMontGr) || (contractEndGr < now))
+ {
+ isExpier = true;
+ }
+ }
+
+ if (isActiveString == "blue")
+ {
+ status = InstitutionContractStatus.DeactiveWithDebt;
+ isExpier = true;
+ }
+
+ return (status, isExpier);
+ }
+
#endregion
diff --git a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs
index 85cae08f..035a8db2 100644
--- a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs
+++ b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs
@@ -1,13 +1,14 @@
using _0_Framework.Application;
using CompanyManagment.App.Contracts.InstitutionContract;
using Microsoft.AspNetCore.Mvc;
+using ServiceHost.BaseControllers;
namespace ServiceHost.Areas.Admin.Controllers;
///
/// کنترلر قرارداد های مالی موسسه
///
-public class institutionContractController : Controller
+public class institutionContractController : AdminBaseController
{
private readonly IInstitutionContractApplication _institutionContractApplication;
diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs
index 3dc3b092..d83fb1d4 100644
--- a/ServiceHost/Program.cs
+++ b/ServiceHost/Program.cs
@@ -27,18 +27,15 @@ using Microsoft.AspNetCore.CookiePolicy;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Diagnostics;
-
+using Swashbuckle.AspNetCore.SwaggerUI;
var builder = WebApplication.CreateBuilder(args);
-builder.WebHost.ConfigureKestrel(serverOptions =>
-{
- serverOptions.Limits.MaxRequestBodySize = long.MaxValue;
-});
+builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.Limits.MaxRequestBodySize = long.MaxValue; });
builder.Services.AddRazorPages()
- .AddRazorRuntimeCompilation();
+ .AddRazorRuntimeCompilation();
//Register Services
#region Register Services
@@ -58,6 +55,7 @@ var connectionStringTestDb = builder.Configuration.GetConnectionString("TestDb")
//builder.Services.AddSingleton(mongoDatabase);
#endregion
+
builder.Services.AddSingleton, CustomJsonResultExecutor>();
PersonalBootstrapper.Configure(builder.Services, connectionString);
TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
@@ -142,15 +140,14 @@ builder.Services.AddAuthorization(options =>
{
options.AddPolicy("CameraArea",
builder => builder.RequireClaim("AccountId"));
-
});
builder.Services.AddAuthorization(options =>
{
- options.AddPolicy("AdminNewArea",
- builder => builder.RequireClaim("AccountId"));
- options.AddPolicy("AdminNewArea",
- builder => builder.RequireClaim("AdminAreaPermission", new List { "true" }));
+ options.AddPolicy("AdminNewArea",
+ builder => builder.RequireClaim("AccountId"));
+ options.AddPolicy("AdminNewArea",
+ builder => builder.RequireClaim("AdminAreaPermission", new List { "true" }));
});
//services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
@@ -176,15 +173,15 @@ builder.Services.AddControllers().AddJsonOptions(options =>
builder.Services.AddRazorPages(options =>
options.Conventions.AuthorizeAreaFolder("Admin", "/", "AdminArea"));
builder.Services.AddRazorPages(options =>
- options.Conventions.AuthorizeAreaFolder("Client", "/", "ClientArea")).AddMvcOptions(options => options.Filters.Add());
+ options.Conventions.AuthorizeAreaFolder("Client", "/", "ClientArea"))
+ .AddMvcOptions(options => options.Filters.Add());
builder.Services.AddRazorPages(options =>
options.Conventions.AuthorizeAreaFolder("Camera", "/", "CameraArea"));
builder.Services.AddRazorPages(options =>
- options.Conventions.AuthorizeAreaFolder("AdminNew", "/", "AdminNewArea"));
+ options.Conventions.AuthorizeAreaFolder("AdminNew", "/", "AdminNewArea"));
builder.Services.AddMvc();
builder.Services.AddSignalR();
-
#endregion
#region PWA
@@ -203,56 +200,59 @@ builder.Services.AddSignalR();
#endregion
#region Swagger
+
builder.Services.AddSwaggerGen(options =>
{
- options.UseInlineDefinitionsForEnums();
-
+ options.UseInlineDefinitionsForEnums();
+
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
- var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
- options.IncludeXmlComments(xmlPath);
+ var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
+ options.IncludeXmlComments(xmlPath);
- // Get XML comments from the class library
- var classLibraryXmlFile = "CompanyManagment.App.Contracts.xml";
- var classLibraryXmlPath = Path.Combine(AppContext.BaseDirectory, classLibraryXmlFile);
- options.IncludeXmlComments(classLibraryXmlPath);
+ // Get XML comments from the class library
+ var classLibraryXmlFile = "CompanyManagment.App.Contracts.xml";
+ var classLibraryXmlPath = Path.Combine(AppContext.BaseDirectory, classLibraryXmlFile);
+ options.IncludeXmlComments(classLibraryXmlPath);
- options.SwaggerDoc("General", new OpenApiInfo { Title = "API - General", Version = "v1" });
- options.SwaggerDoc("Admin", new OpenApiInfo { Title = "API - Admin", Version = "v1" });
- options.SwaggerDoc("Client", new OpenApiInfo { Title = "API - Client", Version = "v1" });
- options.SwaggerDoc("Camera", new OpenApiInfo { Title = "API - Camera", Version = "v1" });
+ options.SwaggerDoc("General", new OpenApiInfo { Title = "API - General", Version = "v1" });
+ options.SwaggerDoc("Admin", new OpenApiInfo { Title = "API - Admin", Version = "v1" });
+ options.SwaggerDoc("Client", new OpenApiInfo { Title = "API - Client", Version = "v1" });
+ options.SwaggerDoc("Camera", new OpenApiInfo { Title = "API - Camera", Version = "v1" });
- options.DocInclusionPredicate((docName, apiDesc) => string.Equals(docName, apiDesc.GroupName, StringComparison.OrdinalIgnoreCase));
+ options.DocInclusionPredicate((docName, apiDesc) =>
+ string.Equals(docName, apiDesc.GroupName, StringComparison.OrdinalIgnoreCase));
- // اضافه کردن پشتیبانی از JWT در Swagger
- options.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
- {
- Name = "Authorization",
- Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey,
- Scheme = "Bearer",
- BearerFormat = "JWT",
- In = Microsoft.OpenApi.Models.ParameterLocation.Header,
- Description = "لطفاً 'Bearer [space] token' را وارد کنید."
- });
+ // اضافه کردن پشتیبانی از JWT در Swagger
+ options.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
+ {
+ Name = "Authorization",
+ Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey,
+ Scheme = "Bearer",
+ BearerFormat = "JWT",
+ In = Microsoft.OpenApi.Models.ParameterLocation.Header,
+ Description = "لطفاً 'Bearer [space] token' را وارد کنید."
+ });
- options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
- {
- {
- new Microsoft.OpenApi.Models.OpenApiSecurityScheme
- {
- Reference = new Microsoft.OpenApi.Models.OpenApiReference
- {
- Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme,
- Id = "Bearer"
- }
- },
- Array.Empty()
- }
- });
+ options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
+ {
+ {
+ new Microsoft.OpenApi.Models.OpenApiSecurityScheme
+ {
+ Reference = new Microsoft.OpenApi.Models.OpenApiReference
+ {
+ Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme,
+ Id = "Bearer"
+ }
+ },
+ Array.Empty()
+ }
+ });
- options.EnableAnnotations();
+ options.EnableAnnotations();
});
+
#endregion
#region CORS
@@ -295,6 +295,7 @@ builder.Services.AddCors(options =>
// .AllowCredentials();
// });
//});
+
#endregion
builder.Services.AddExceptionHandler();
@@ -304,7 +305,6 @@ var app = builder.Build();
app.UseCors("AllowSpecificOrigins");
-
#region Mahan
//app.UseStatusCodePagesWithRedirects("/error/{0}");
@@ -319,21 +319,23 @@ if (builder.Environment.IsDevelopment())
if (app.Environment.IsDevelopment())
{
- app.UseSwagger();
- app.UseSwaggerUI(options =>
- {
- options.SwaggerEndpoint("/swagger/General/swagger.json", "API - General");
- options.SwaggerEndpoint("/swagger/Admin/swagger.json", "API - Admin");
- options.SwaggerEndpoint("/swagger/Client/swagger.json", "API - Client");
- options.SwaggerEndpoint("/swagger/Camera/swagger.json", "API - Camera");
- });
+ app.UseSwagger();
+ app.UseSwaggerUI(options =>
+ {
+ options.DocExpansion(DocExpansion.None);
+ options.SwaggerEndpoint("/swagger/General/swagger.json", "API - General");
+ options.SwaggerEndpoint("/swagger/Admin/swagger.json", "API - Admin");
+ options.SwaggerEndpoint("/swagger/Client/swagger.json", "API - Client");
+ options.SwaggerEndpoint("/swagger/Camera/swagger.json", "API - Camera");
+ });
}
+
#endregion
+
//Create Http Pipeline
#region Create Http Pipeline
-
if (builder.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
@@ -352,7 +354,6 @@ app.UseAuthentication();
app.UseAuthorization();
-
app.UseHttpsRedirection();
@@ -361,13 +362,13 @@ app.UseStaticFiles();
app.UseCookiePolicy();
-
#region Mahan
//app.UseLoginHandlerMiddleware();
//app.UseCheckTaskMiddleware();
-app.UseMiddleware();
+app.UseMiddleware();
+
#endregion
@@ -377,6 +378,7 @@ app.MapHub("/trackingHolidayHub");
app.MapHub("/trackingCheckoutHub");
app.MapRazorPages();
app.MapControllers();
+
#endregion
-app.Run();
+app.Run();
\ No newline at end of file
diff --git a/ServiceHost/Properties/launchSettings.json b/ServiceHost/Properties/launchSettings.json
index 788962e4..69be5550 100644
--- a/ServiceHost/Properties/launchSettings.json
+++ b/ServiceHost/Properties/launchSettings.json
@@ -11,7 +11,7 @@
},
"ServiceHost": {
"commandName": "Project",
- "launchBrowser": true,
+ "launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"