add status for GetList in InstitutionContractRepository.cs

This commit is contained in:
MahanCh
2025-08-02 13:05:32 +03:30
parent ac66df98f5
commit 040f40df52
5 changed files with 169 additions and 99 deletions

View File

@@ -104,12 +104,25 @@ public class InstitutionContractListSearchModel
/// </summary>
public string ContractDateTo { get; set; }
public InstitutionContractStatus? Status { get; set; }
/// <summary>
/// ایندکس صفحه
/// </summary>
public int PageIndex { get; set; }
}
public enum InstitutionContractStatus
{
Active,
Deactive,
DeactiveWithDebt,
Block,
Free,
PendingForRenewal,
WithoutWorkshop,
}
/// <summary>
/// لیست قرارداد های موسسه
/// </summary>
@@ -202,7 +215,12 @@ public class GetInstitutionContractListItemsViewModel
public double Balance { get; set; }
/// <summary>
/// رنگ بک گراند
/// وضعیت قرارداد
/// </summary>
public KnownColor Color { get; set; }
public InstitutionContractStatus Status { get; set; }
/// <summary>
/// آیا منقضی شده است
/// </summary>
public bool IsExpired { get; set; }
}

View File

@@ -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<long, InstitutionCon
public async Task<GetInstitutionContractListViewModel> 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<long, InstitutionCon
joinedQuery = joinedQuery.Where(x => 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<long, InstitutionCon
x.contract.ContractStartGr <= dateTo && x.contract.ContractEndGr <= dateFrom);
}
//Todo: Search by Status For Tab
var list = await joinedQuery.Skip(searchModel.PageIndex).Take(30).ToListAsync();
#endregion
var res = new GetInstitutionContractListViewModel()
{
TotalAmount = totalAmount,
TotalDebt = totalDebt,
Items = list.Select(x=>
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 : RepositoryBase<long, InstitutionCon
ContractStartFa = x.contract.ContractStartGr.ToFarsi(),
ContractEndFa = x.contract.ContractEndGr.ToFarsi(),
ContractingPartyName = x.contract.ContractingPartyName,
WorkshopNames = workshops.Select(w=>w.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

View File

@@ -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;
/// <summary>
/// کنترلر قرارداد های مالی موسسه
/// </summary>
public class institutionContractController : Controller
public class institutionContractController : AdminBaseController
{
private readonly IInstitutionContractApplication _institutionContractApplication;

View File

@@ -27,15 +27,12 @@ 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();
@@ -58,6 +55,7 @@ var connectionStringTestDb = builder.Configuration.GetConnectionString("TestDb")
//builder.Services.AddSingleton<IMongoDatabase>(mongoDatabase);
#endregion
builder.Services.AddSingleton<IActionResultExecutor<JsonResult>, 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<string> { "true" }));
options.AddPolicy("AdminNewArea",
builder => builder.RequireClaim("AccountId"));
options.AddPolicy("AdminNewArea",
builder => builder.RequireClaim("AdminAreaPermission", new List<string> { "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<SecurityPageFilter>());
options.Conventions.AuthorizeAreaFolder("Client", "/", "ClientArea"))
.AddMvcOptions(options => options.Filters.Add<SecurityPageFilter>());
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<string>()
}
});
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<string>()
}
});
options.EnableAnnotations();
options.EnableAnnotations();
});
#endregion
#region CORS
@@ -295,6 +295,7 @@ builder.Services.AddCors(options =>
// .AllowCredentials();
// });
//});
#endregion
builder.Services.AddExceptionHandler<CustomExceptionHandler>();
@@ -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<RazorJsonEnumOverrideMiddleware>();
#endregion
@@ -377,6 +378,7 @@ app.MapHub<HolidayApiHub>("/trackingHolidayHub");
app.MapHub<CheckoutHub>("/trackingCheckoutHub");
app.MapRazorPages();
app.MapControllers();
#endregion
app.Run();

View File

@@ -11,7 +11,7 @@
},
"ServiceHost": {
"commandName": "Project",
"launchBrowser": true,
"launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"