From cfbfbf2e2b01e60bb5bdaf66d511c0a888968d50 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 22 Jul 2025 10:53:55 +0530 Subject: [PATCH] Renamed the CacheHelper To Helpers --- .../CacheHelper}/EmployeeCache.cs | 4 +- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 24 +++++ .../CacheHelper}/ProjectCache.cs | 5 +- .../CacheHelper}/ReportCache.cs | 4 +- .../Marco.Pms.Helpers.csproj | 0 .../UpdateLogHelper.cs | 4 +- Marco.Pms.Model/Marco.Pms.Model.csproj | 28 ++--- .../EmployeePermissionMongoDB.cs | 2 +- .../Expenses/ExpenseDetailsMongoDB.cs | 6 ++ .../{ => Masters}/StatusMasterMongoDB.cs | 2 +- .../WorkCategoryMasterMongoDB.cs | 2 +- .../{ => Project}/ActivityMasterMongoDB.cs | 2 +- .../{ => Project}/BuildingMongoDB.cs | 2 +- .../{ => Project}/FloorMongoDB.cs | 2 +- .../{ => Project}/ProjectMongoDB.cs | 4 +- .../{ => Project}/WorkAreaInfoMongoDB.cs | 2 +- .../{ => Project}/WorkAreaMongoDB.cs | 2 +- .../{ => Project}/WorkItemMongoDB.cs | 4 +- .../ProjectReportEmailMongoDB.cs | 2 +- .../{ => Utility}/UpdateLogsObject.cs | 2 +- Marco.Pms.Services/Dockerfile | 2 +- .../Helpers/CacheUpdateHelper.cs | 7 +- Marco.Pms.Services/Helpers/GeneralHelper.cs | 1 + Marco.Pms.Services/Helpers/ReportHelper.cs | 2 +- .../MappingProfiles/MappingProfile.cs | 3 +- Marco.Pms.Services/Marco.Pms.Services.csproj | 90 ++++++++-------- Marco.Pms.Services/Program.cs | 3 +- Marco.Pms.Services/Service/ExpensesService.cs | 102 ++++++++++++++++-- Marco.Pms.Services/Service/ProjectServices.cs | 2 +- marco.pms.api.sln | 2 +- 30 files changed, 220 insertions(+), 97 deletions(-) rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers/CacheHelper}/EmployeeCache.cs (98%) create mode 100644 Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers/CacheHelper}/ProjectCache.cs (99%) rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers/CacheHelper}/ReportCache.cs (95%) rename Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj => Marco.Pms.Helpers/Marco.Pms.Helpers.csproj (100%) rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers}/UpdateLogHelper.cs (97%) rename Marco.Pms.Model/MongoDBModels/{ => Employees}/EmployeePermissionMongoDB.cs (91%) create mode 100644 Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs rename Marco.Pms.Model/MongoDBModels/{ => Masters}/StatusMasterMongoDB.cs (74%) rename Marco.Pms.Model/MongoDBModels/{ => Masters}/WorkCategoryMasterMongoDB.cs (82%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/ActivityMasterMongoDB.cs (80%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/BuildingMongoDB.cs (94%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/FloorMongoDB.cs (93%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/ProjectMongoDB.cs (88%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/WorkAreaInfoMongoDB.cs (89%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/WorkAreaMongoDB.cs (89%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/WorkItemMongoDB.cs (87%) rename Marco.Pms.Model/MongoDBModels/{ => Utility}/ProjectReportEmailMongoDB.cs (91%) rename Marco.Pms.Model/MongoDBModels/{ => Utility}/UpdateLogsObject.cs (90%) diff --git a/Marco.Pms.CacheHelper/EmployeeCache.cs b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs similarity index 98% rename from Marco.Pms.CacheHelper/EmployeeCache.cs rename to Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs index 7c7f4b4..560748c 100644 --- a/Marco.Pms.CacheHelper/EmployeeCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs @@ -1,9 +1,9 @@ -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Employees; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MongoDB.Driver; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers.CacheHelper { public class EmployeeCache { diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs new file mode 100644 index 0000000..8036c5f --- /dev/null +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -0,0 +1,24 @@ +using Marco.Pms.Model.MongoDBModels.Employees; +using Microsoft.Extensions.Configuration; +using MongoDB.Driver; + +namespace Marco.Pms.Helpers.CacheHelper +{ + public class ExpenseCache + { + private readonly IMongoCollection _collection; + public ExpenseCache(IConfiguration configuration) + { + + var connectionString = configuration["MongoDB:ConnectionString"]; + var mongoUrl = new MongoUrl(connectionString); + var client = new MongoClient(mongoUrl); // Your MongoDB connection string + var mongoDB = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name + _collection = mongoDB.GetCollection("Expenses"); + } + public async Task AddExpenseToCacheAsync() + { + + } + } +} diff --git a/Marco.Pms.CacheHelper/ProjectCache.cs b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs similarity index 99% rename from Marco.Pms.CacheHelper/ProjectCache.cs rename to Marco.Pms.Helpers/CacheHelper/ProjectCache.cs index 10eb623..f5721aa 100644 --- a/Marco.Pms.CacheHelper/ProjectCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs @@ -1,13 +1,14 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Master; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MongoDB.Bson; using MongoDB.Driver; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers { public class ProjectCache { diff --git a/Marco.Pms.CacheHelper/ReportCache.cs b/Marco.Pms.Helpers/CacheHelper/ReportCache.cs similarity index 95% rename from Marco.Pms.CacheHelper/ReportCache.cs rename to Marco.Pms.Helpers/CacheHelper/ReportCache.cs index 66611a8..009bdf2 100644 --- a/Marco.Pms.CacheHelper/ReportCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ReportCache.cs @@ -1,8 +1,8 @@ -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Utility; using Microsoft.Extensions.Configuration; using MongoDB.Driver; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers.CacheHelper { public class ReportCache { diff --git a/Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj b/Marco.Pms.Helpers/Marco.Pms.Helpers.csproj similarity index 100% rename from Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj rename to Marco.Pms.Helpers/Marco.Pms.Helpers.csproj diff --git a/Marco.Pms.CacheHelper/UpdateLogHelper.cs b/Marco.Pms.Helpers/UpdateLogHelper.cs similarity index 97% rename from Marco.Pms.CacheHelper/UpdateLogHelper.cs rename to Marco.Pms.Helpers/UpdateLogHelper.cs index ddea104..5c7595f 100644 --- a/Marco.Pms.CacheHelper/UpdateLogHelper.cs +++ b/Marco.Pms.Helpers/UpdateLogHelper.cs @@ -1,10 +1,10 @@ -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Utility; using Microsoft.Extensions.Configuration; using MongoDB.Bson; using MongoDB.Driver; using System.Collections; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers { public class UpdateLogHelper { diff --git a/Marco.Pms.Model/Marco.Pms.Model.csproj b/Marco.Pms.Model/Marco.Pms.Model.csproj index a1a21a5..332759a 100644 --- a/Marco.Pms.Model/Marco.Pms.Model.csproj +++ b/Marco.Pms.Model/Marco.Pms.Model.csproj @@ -1,20 +1,20 @@ - + - - net7.0 - enable - enable - + + net7.0 + enable + enable + - + - - - - + + + + - - - + + + diff --git a/Marco.Pms.Model/MongoDBModels/EmployeePermissionMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Employees/EmployeePermissionMongoDB.cs similarity index 91% rename from Marco.Pms.Model/MongoDBModels/EmployeePermissionMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Employees/EmployeePermissionMongoDB.cs index fab2b84..07da2ef 100644 --- a/Marco.Pms.Model/MongoDBModels/EmployeePermissionMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Employees/EmployeePermissionMongoDB.cs @@ -1,6 +1,6 @@ using MongoDB.Bson.Serialization.Attributes; -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Employees { [BsonIgnoreExtraElements] public class EmployeePermissionMongoDB diff --git a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs new file mode 100644 index 0000000..e4a1c5c --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs @@ -0,0 +1,6 @@ +namespace Marco.Pms.Model.MongoDBModels.Expenses +{ + public class ExpenseDetailsMongoDB + { + } +} diff --git a/Marco.Pms.Model/MongoDBModels/StatusMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/StatusMasterMongoDB.cs similarity index 74% rename from Marco.Pms.Model/MongoDBModels/StatusMasterMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Masters/StatusMasterMongoDB.cs index 77e8eb5..96a56a6 100644 --- a/Marco.Pms.Model/MongoDBModels/StatusMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Masters/StatusMasterMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Masters { public class StatusMasterMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkCategoryMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/WorkCategoryMasterMongoDB.cs similarity index 82% rename from Marco.Pms.Model/MongoDBModels/WorkCategoryMasterMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Masters/WorkCategoryMasterMongoDB.cs index 4ea4682..4270a25 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkCategoryMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Masters/WorkCategoryMasterMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Masters { public class WorkCategoryMasterMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/ActivityMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/ActivityMasterMongoDB.cs similarity index 80% rename from Marco.Pms.Model/MongoDBModels/ActivityMasterMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/ActivityMasterMongoDB.cs index cc77d96..ecb88c1 100644 --- a/Marco.Pms.Model/MongoDBModels/ActivityMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/ActivityMasterMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class ActivityMasterMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/BuildingMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/BuildingMongoDB.cs similarity index 94% rename from Marco.Pms.Model/MongoDBModels/BuildingMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/BuildingMongoDB.cs index 786ceb5..640be18 100644 --- a/Marco.Pms.Model/MongoDBModels/BuildingMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/BuildingMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class BuildingMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/FloorMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/FloorMongoDB.cs similarity index 93% rename from Marco.Pms.Model/MongoDBModels/FloorMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/FloorMongoDB.cs index 15d3060..debb663 100644 --- a/Marco.Pms.Model/MongoDBModels/FloorMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/FloorMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class FloorMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/ProjectMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs similarity index 88% rename from Marco.Pms.Model/MongoDBModels/ProjectMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs index aac0e2c..c2600bd 100644 --- a/Marco.Pms.Model/MongoDBModels/ProjectMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs @@ -1,4 +1,6 @@ -namespace Marco.Pms.Model.MongoDBModels +using Marco.Pms.Model.MongoDBModels.Masters; + +namespace Marco.Pms.Model.MongoDBModels.Project { public class ProjectMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkAreaInfoMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaInfoMongoDB.cs similarity index 89% rename from Marco.Pms.Model/MongoDBModels/WorkAreaInfoMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/WorkAreaInfoMongoDB.cs index da1001b..97da737 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkAreaInfoMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaInfoMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class WorkAreaInfoMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkAreaMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaMongoDB.cs similarity index 89% rename from Marco.Pms.Model/MongoDBModels/WorkAreaMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/WorkAreaMongoDB.cs index 412c940..d768e3b 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkAreaMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class WorkAreaMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkItemMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/WorkItemMongoDB.cs similarity index 87% rename from Marco.Pms.Model/MongoDBModels/WorkItemMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/WorkItemMongoDB.cs index cf798f3..00aa168 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkItemMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/WorkItemMongoDB.cs @@ -1,4 +1,6 @@ -namespace Marco.Pms.Model.MongoDBModels +using Marco.Pms.Model.MongoDBModels.Masters; + +namespace Marco.Pms.Model.MongoDBModels.Project { public class WorkItemMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/ProjectReportEmailMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Utility/ProjectReportEmailMongoDB.cs similarity index 91% rename from Marco.Pms.Model/MongoDBModels/ProjectReportEmailMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Utility/ProjectReportEmailMongoDB.cs index 519ea4f..928b814 100644 --- a/Marco.Pms.Model/MongoDBModels/ProjectReportEmailMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Utility/ProjectReportEmailMongoDB.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Utility { public class ProjectReportEmailMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs b/Marco.Pms.Model/MongoDBModels/Utility/UpdateLogsObject.cs similarity index 90% rename from Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs rename to Marco.Pms.Model/MongoDBModels/Utility/UpdateLogsObject.cs index 3153c78..30f87d6 100644 --- a/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs +++ b/Marco.Pms.Model/MongoDBModels/Utility/UpdateLogsObject.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Utility { public class UpdateLogsObject { diff --git a/Marco.Pms.Services/Dockerfile b/Marco.Pms.Services/Dockerfile index 2aa24ea..50b9865 100644 --- a/Marco.Pms.Services/Dockerfile +++ b/Marco.Pms.Services/Dockerfile @@ -19,7 +19,7 @@ COPY ["Marco.Pms.Services/Marco.Pms.Services.csproj", "Marco.Pms.Services/"] COPY ["Marco.Pms.DataAccess/Marco.Pms.DataAccess.csproj", "Marco.Pms.DataAccess/"] COPY ["Marco.Pms.Model/Marco.Pms.Model.csproj", "Marco.Pms.Model/"] COPY ["Marco.Pms.Utility/Marco.Pms.Utility.csproj", "Marco.Pms.Utility/"] -COPY ["Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj", "Marco.Pms.CacheHelper/"] +COPY ["Marco.Pms.Helpers/Marco.Pms.Helpers.csproj", "Marco.Pms.Helpers/"] RUN dotnet restore "./Marco.Pms.Services/Marco.Pms.Services.csproj" COPY . . WORKDIR "/src/Marco.Pms.Services" diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index d942ab1..1c4deb0 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -1,7 +1,10 @@ -using Marco.Pms.CacheHelper; +using Marco.Pms.Helpers; +using Marco.Pms.Helpers.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Master; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Projects; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index c2f8fe4..b5bf7dc 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -1,5 +1,6 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Project; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; diff --git a/Marco.Pms.Services/Helpers/ReportHelper.cs b/Marco.Pms.Services/Helpers/ReportHelper.cs index 35dcf8b..5a174e6 100644 --- a/Marco.Pms.Services/Helpers/ReportHelper.cs +++ b/Marco.Pms.Services/Helpers/ReportHelper.cs @@ -2,7 +2,7 @@ using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Mail; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Report; using MarcoBMS.Services.Service; diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index ea34613..33c64bb 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -5,7 +5,8 @@ using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Employee; diff --git a/Marco.Pms.Services/Marco.Pms.Services.csproj b/Marco.Pms.Services/Marco.Pms.Services.csproj index 2feafaf..5b30ba4 100644 --- a/Marco.Pms.Services/Marco.Pms.Services.csproj +++ b/Marco.Pms.Services/Marco.Pms.Services.csproj @@ -1,52 +1,52 @@ - - net8.0 - enable - enable - True - False - 55935cea-fc40-40f8-be42-da094f06b11f - Linux - + + net8.0 + enable + enable + True + False + 55935cea-fc40-40f8-be42-da094f06b11f + Linux + - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + - - - - - - + + + + + + PreserveNewest diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 6b6bfa5..9e8e736 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,4 +1,5 @@ -using Marco.Pms.CacheHelper; +using Marco.Pms.Helpers; +using Marco.Pms.Helpers.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Entitlements; diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 8d1c974..26f3b21 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1,12 +1,12 @@ using AutoMapper; -using Marco.Pms.CacheHelper; +using Marco.Pms.Helpers; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.DocumentManager; using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Expanses; @@ -29,6 +29,7 @@ namespace Marco.Pms.Services.Service private readonly UpdateLogHelper _updateLogHelper; private readonly IMapper _mapper; private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); + private static readonly Guid Rejected = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"); private static readonly string Collection = "ExpensesModificationLog"; public ExpensesService( IDbContextFactory dbContextFactory, @@ -391,9 +392,25 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("Successfully created Expense {ExpenseId} for Project {ProjectId}.", expense.Id, expense.ProjectId); return ApiResponse.SuccessResponse(response, "Expense created successfully.", 201); } - catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation + catch (DbUpdateException dbEx) { await transaction.RollbackAsync(); + _logger.LogError(dbEx, "Databsae Exception occured while adding expense"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation + { _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("Invalid Request Data.", new { @@ -410,7 +427,6 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) { - await transaction.RollbackAsync(); _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("An internal server error occurred.", new { @@ -615,15 +631,29 @@ namespace Marco.Pms.Services.Service } public async Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId) { - var exsitingExpense = await _context.Expenses.FirstOrDefaultAsync(e => e.Id == model.Id && e.TenantId == tenantId); + var existingExpense = await _context.Expenses + .Include(e => e.ExpensesType) + .Include(e => e.Project) + .Include(e => e.PaidBy) + .ThenInclude(e => e!.JobRole) + .Include(e => e.PaymentMode) + .Include(e => e.Status) + .Include(e => e.CreatedBy) + .FirstOrDefaultAsync(e => + e.Id == model.Id && + e.CreatedById == loggedInEmployee.Id && + (e.StatusId == Draft || e.StatusId == Rejected) && + e.TenantId == tenantId); - if (exsitingExpense == null) + if (existingExpense == null) { return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); } - _mapper.Map(model, exsitingExpense); - _context.Entry(exsitingExpense).State = EntityState.Modified; + + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(existingExpense); // Capture state for audit log BEFORE changes + _mapper.Map(model, existingExpense); + _context.Entry(existingExpense).State = EntityState.Modified; try { @@ -637,8 +667,60 @@ namespace Marco.Pms.Services.Service _logger.LogError(ex, "Concurrency conflict while updating project {ProjectId} ", id); return ApiResponse.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409); } - var response = _mapper.Map(exsitingExpense); - return ApiResponse.SuccessResponse(response); + try + { + // Task to save the detailed audit log to a separate system (e.g., MongoDB). + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = existingExpense.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); + + // Task to get all possible next statuses from the *new* current state to help the UI. + // NOTE: This now fetches a list of all possible next states, which is more useful for a UI. + var getNextStatusesTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(t => + { + var dbContext = t.Result; + return dbContext.ExpensesStatusMapping + .Include(s => s.NextStatus) + .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId) + .Select(s => s.NextStatus) // Select only the status object + .ToListAsync() + .ContinueWith(res => + { + dbContext.Dispose(); // Ensure the context is disposed + return res.Result; + }); + }).Unwrap(); + + await Task.WhenAll(mongoDBTask, getNextStatusesTask); + + var nextPossibleStatuses = await getNextStatusesTask; + + var response = _mapper.Map(existingExpense); + if (nextPossibleStatuses != null) + { + // The response DTO should have a property like: public List NextAvailableStatuses { get; set; } + response.NextStatus = _mapper.Map>(nextPossibleStatuses); + } + + return ApiResponse.SuccessResponse(response); + } + catch (Exception ex) + { + // This catch block handles errors from post-save operations like MongoDB logging. + // The primary update was successful, but we must log this failure. + _logger.LogError(ex, "Error occurred during post-save operations for ExpenseId: {ExpenseId} (e.g., audit logging). The primary status change was successful.", existingExpense.Id); + + // We can still return a success response because the main operation succeeded, + // but we should not block the user for a failed audit log. + // Alternatively, if audit logging is critical, you could return an error. + // Here, we choose to return success but log the ancillary failure. + var response = _mapper.Map(existingExpense); + return ApiResponse.SuccessResponse(response, "Status updated, but a post-processing error occurred."); + } } public void Delete(int id) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 9406ec9..894ba81 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -5,7 +5,7 @@ using Marco.Pms.Model.Activities; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Employee; diff --git a/marco.pms.api.sln b/marco.pms.api.sln index 424b709..cb6aefe 100644 --- a/marco.pms.api.sln +++ b/marco.pms.api.sln @@ -11,7 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marco.Pms.Utility", "Marco. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marco.Pms.Services", "Marco.Pms.Services\Marco.Pms.Services.csproj", "{27A83653-5B7F-4135-9886-01594D54AFAE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marco.Pms.CacheHelper", "Marco.Pms.CacheHelper\Marco.Pms.CacheHelper.csproj", "{1A105C22-4ED7-4F54-8834-6923DDD96852}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marco.Pms.Helpers", "Marco.Pms.Helpers\Marco.Pms.Helpers.csproj", "{1A105C22-4ED7-4F54-8834-6923DDD96852}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution