From 040f40df52ede1007d2147f0158fefc0f65cb8c0 Mon Sep 17 00:00:00 2001 From: MahanCh Date: Sat, 2 Aug 2025 13:05:32 +0330 Subject: [PATCH] add status for GetList in InstitutionContractRepository.cs --- .../IInstitutionContractApplication.cs | 22 ++- .../InstitutionContractRepository.cs | 107 ++++++++++---- .../institutionContractController.cs | 3 +- ServiceHost/Program.cs | 134 +++++++++--------- ServiceHost/Properties/launchSettings.json | 2 +- 5 files changed, 169 insertions(+), 99 deletions(-) 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"