This commit is contained in:
ashutosh.nehete 2025-12-13 15:28:01 +05:30
commit b8c10a20bf
16 changed files with 234 additions and 10 deletions

View File

@ -0,0 +1,9 @@
namespace Marco.Pms.Model.Dtos.Tenant
{
public class InventoryModuleDetailsDto
{
public List<Guid>? FeatureId { get; set; }
public string Name { get; set; } = "Expense Management";
public bool Enabled { get; set; } = false;
}
}

View File

@ -1,4 +1,6 @@
namespace Marco.Pms.Model.Dtos.Tenant
using Marco.Pms.Model.TenantModels.MongoDBModel;
namespace Marco.Pms.Model.Dtos.Tenant
{
public class ModulesDetailsDto
{
@ -6,5 +8,6 @@
public AttendanceDetailsDto? Attendance { get; set; }
public DirectoryDetailsDto? Directory { get; set; }
public ExpenseModuleDetailsDto? Expense { get; set; }
public InventoryModuleDetailsDto? Inventory { get; set; }
}
}

View File

@ -0,0 +1,18 @@
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace Marco.Pms.Model.TenantModels.MongoDBModel
{
public class InventoryModuleDetails
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public Guid Id { get; set; } = Guid.NewGuid();
public string? Name { get; set; }
[BsonRepresentation(BsonType.String)]
public List<Guid> FeatureId { get; set; } = new List<Guid>();
public bool Enabled { get; set; } = false;
}
}

View File

@ -12,5 +12,6 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel
public AttendanceDetails? Attendance { get; set; }
public DirectoryDetails? Directory { get; set; }
public ExpenseModuleDetails? Expense { get; set; }
public InventoryModuleDetails? Inventory { get; set; }
}
}

View File

@ -14,4 +14,10 @@
public ICollection<FeaturePermissionVM>? FeaturePermissions { get; set; }
}
public class BasicFeatureVM
{
public Guid Id { get; set; } // Unique identifier for the permission
public string? Name { get; set; } // Feature name
public string? Description { get; set; } // Feature description
}
}

View File

@ -0,0 +1,15 @@
using Marco.Pms.Model.ViewModels.Master;
namespace Marco.Pms.Model.ViewModels.Tenant
{
public class AttendanceDetailsVM
{
public Guid Id { get; set; }
public string? Name { get; set; }
public List<BasicFeatureVM>? Features { get; set; }
public bool Enabled { get; set; }
public bool ManualEntry { get; set; }
public bool LocationTracking { get; set; }
public bool ShiftManagement { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using Marco.Pms.Model.ViewModels.Master;
namespace Marco.Pms.Model.ViewModels.Tenant
{
public class DirectoryDetailsVM
{
public Guid Id { get; set; }
public string? Name { get; set; }
public List<BasicFeatureVM>? Features { get; set; }
public bool Enabled { get; set; }
public int BucketLimit { get; set; }
public bool OrganizationChart { get; set; }
}
}

View File

@ -0,0 +1,12 @@
using Marco.Pms.Model.ViewModels.Master;
namespace Marco.Pms.Model.ViewModels.Tenant
{
public class ExpenseModuleDetailsVM
{
public Guid Id { get; set; }
public string? Name { get; set; }
public List<BasicFeatureVM>? Features { get; set; }
public bool Enabled { get; set; }
}
}

View File

@ -0,0 +1,13 @@
using Marco.Pms.Model.TenantModels.MongoDBModel;
namespace Marco.Pms.Model.ViewModels.Tenant
{
public class FeatureDetailsVM
{
public Guid Id { get; set; }
public ModulesDetailsVM? Modules { get; set; }
public ReportDetails? Reports { get; set; }
public SupportDetails? Supports { get; set; }
public List<SubscriptionCheckList>? SubscriptionCheckList { get; set; }
}
}

View File

@ -0,0 +1,17 @@
using Marco.Pms.Model.ViewModels.Master;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Marco.Pms.Model.ViewModels.Tenant
{
public class InventoryModuleDetailsVM
{
public Guid Id { get; set; }
public string? Name { get; set; }
public List<BasicFeatureVM>? Features { get; set; }
public bool Enabled { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using Marco.Pms.Model.TenantModels.MongoDBModel;
namespace Marco.Pms.Model.ViewModels.Tenant
{
public class ModulesDetailsVM
{
public Guid Id { get; set; }
public ProjectManagementDetailsVM? ProjectManagement { get; set; }
public AttendanceDetailsVM? Attendance { get; set; }
public DirectoryDetailsVM? Directory { get; set; }
public ExpenseModuleDetailsVM? Expense { get; set; }
public InventoryModuleDetailsVM? Inventory { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using Marco.Pms.Model.ViewModels.Master;
namespace Marco.Pms.Model.ViewModels.Tenant
{
public class ProjectManagementDetailsVM
{
public Guid Id { get; set; }
public string? Name { get; set; }
public List<BasicFeatureVM>? Features { get; set; }
public bool Enabled { get; set; }
public int MaxProject { get; set; }
public double MaxTaskPerProject { get; set; }
public bool GanttChart { get; set; }
public bool ResourceAllocation { get; set; }
}
}

View File

@ -17,4 +17,18 @@ namespace Marco.Pms.Model.ViewModels.Tenant
public FeatureDetails? Features { get; set; }
public CurrencyMaster? Currency { get; set; }
}
public class MarketSubscriptionPlanVM
{
public Guid Id { get; set; }
public string? PlanName { get; set; }
public string? Description { get; set; }
public double? Price { get; set; }
public PLAN_FREQUENCY? Frequency { get; set; }
public int TrialDays { get; set; }
public double MaxUser { get; set; }
public double MaxStorage { get; set; }
public FeatureDetailsVM? Features { get; set; }
public CurrencyMaster? Currency { get; set; }
}
}

View File

@ -1,4 +1,6 @@
using AutoMapper;
using AutoMapper.QueryableExtensions;
using FirebaseAdmin.Auth.Multitenancy;
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Helpers.Utility;
using Marco.Pms.Model.Dtos.Util;
@ -6,6 +8,7 @@ using Marco.Pms.Model.Mapper;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.TenantModels;
using Marco.Pms.Model.Utilities;
using Marco.Pms.Model.ViewModels.Master;
using Marco.Pms.Model.ViewModels.Tenant;
using Marco.Pms.Services.Helpers;
using MarcoBMS.Services.Service;
@ -82,7 +85,7 @@ namespace Marco.Pms.Services.Controllers
_logger.LogInfo("GetSubscriptionPlanList called with frequency: {Frequency}", frequency ?? PLAN_FREQUENCY.MONTHLY);
// Initialize the list to store subscription plan view models
List<SubscriptionPlanVM> detailsVM = new List<SubscriptionPlanVM>();
List<MarketSubscriptionPlanVM> detailsVM = new List<MarketSubscriptionPlanVM>();
try
{
@ -104,14 +107,45 @@ namespace Marco.Pms.Services.Controllers
var subscriptionPlans = await query.ToListAsync();
var features = await _context.Features
.ProjectTo<BasicFeatureVM>(_mapper.ConfigurationProvider)
.ToListAsync();
// Map and fetch feature details for each subscription plan
foreach (var subscriptionPlan in subscriptionPlans)
{
var response = _mapper.Map<SubscriptionPlanVM>(subscriptionPlan);
var response = _mapper.Map<MarketSubscriptionPlanVM>(subscriptionPlan);
try
{
response.Features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId);
var featureDetails = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId);
if (featureDetails == null) continue;
var attendanceFeatures = featureDetails.Modules?.Attendance?.FeatureId ?? new List<Guid>();
var projectManagementFeatures = featureDetails.Modules?.ProjectManagement?.FeatureId ?? new List<Guid>();
var directoryFeatures = featureDetails.Modules?.Directory?.FeatureId ?? new List<Guid>();
var expenseFeatures = featureDetails.Modules?.Expense?.FeatureId ?? new List<Guid>();
var inventoryFeatures = featureDetails.Modules?.Inventory?.FeatureId ?? new List<Guid>();
var featureDetailsVM = _mapper.Map<FeatureDetailsVM>(featureDetails);
if (featureDetailsVM.Modules?.Attendance != null)
featureDetailsVM.Modules.Attendance.Features = features.Where(f => attendanceFeatures.Contains(f.Id)).ToList();
if (featureDetailsVM.Modules?.ProjectManagement != null)
featureDetailsVM.Modules.ProjectManagement.Features = features.Where(f => projectManagementFeatures.Contains(f.Id)).ToList();
if (featureDetailsVM.Modules?.Directory != null)
featureDetailsVM.Modules.Directory.Features = features.Where(f => directoryFeatures.Contains(f.Id)).ToList();
if (featureDetailsVM.Modules?.Expense != null)
featureDetailsVM.Modules.Expense.Features = features.Where(f => expenseFeatures.Contains(f.Id)).ToList();
if (featureDetailsVM.Modules?.Inventory != null)
featureDetailsVM.Modules.Inventory.Features = features.Where(f => inventoryFeatures.Contains(f.Id)).ToList();
response.Features = featureDetailsVM;
}
catch (Exception exFeature)
{

View File

@ -100,6 +100,15 @@ namespace Marco.Pms.Services.MappingProfiles
dest => dest.Description,
opt => opt.MapFrom(src => src.Plan != null ? src.Plan.Description : "")
);
CreateMap<SubscriptionPlanDetails, MarketSubscriptionPlanVM>()
.ForMember(
dest => dest.PlanName,
opt => opt.MapFrom(src => src.Plan != null ? src.Plan.PlanName : "")
)
.ForMember(
dest => dest.Description,
opt => opt.MapFrom(src => src.Plan != null ? src.Plan.Description : "")
);
CreateMap<TenantSubscriptions, SubscriptionPlanDetailsVM>()
.ForMember(
dest => dest.PlanName,
@ -121,14 +130,31 @@ namespace Marco.Pms.Services.MappingProfiles
CreateMap<SubscriptionPlanDto, SubscriptionPlan>();
CreateMap<FeatureDetailsDto, FeatureDetails>();
CreateMap<FeatureDetails, FeatureDetailsVM>();
CreateMap<SubscriptionCheckListDto, SubscriptionCheckList>();
CreateMap<SupportDetailsDto, SupportDetails>();
CreateMap<ReportDetailsDto, ReportDetails>();
CreateMap<ModulesDetailsDto, ModulesDetails>();
CreateMap<ModulesDetails, ModulesDetailsVM>();
CreateMap<ProjectManagementDetailsDto, ProjectManagementDetails>();
CreateMap<ProjectManagementDetails, ProjectManagementDetailsVM>();
CreateMap<AttendanceDetailsDto, AttendanceDetails>();
CreateMap<AttendanceDetails, AttendanceDetailsVM>();
CreateMap<DirectoryDetailsDto, DirectoryDetails>();
CreateMap<DirectoryDetails, DirectoryDetailsVM>();
CreateMap<ExpenseModuleDetailsDto, ExpenseModuleDetails>();
CreateMap<ExpenseModuleDetails, ExpenseModuleDetailsVM>();
CreateMap<InventoryModuleDetailsDto, InventoryModuleDetails>();
CreateMap<InventoryModuleDetails, InventoryModuleDetailsVM>();
#endregion
@ -410,6 +436,7 @@ namespace Marco.Pms.Services.MappingProfiles
#region ======================================================= Master =======================================================
CreateMap<FeaturePermission, FeaturePermissionVM>();
CreateMap<Feature, BasicFeatureVM>();
#region ======================================================= Global Service Master =======================================================

View File

@ -1,6 +1,6 @@
using MarcoBMS.Services.Service;
using Serilog.Context;
using Serilog.Context;
using System.Diagnostics;
using System.Security.Claims;
namespace MarcoBMS.Services.Middleware
{
@ -8,22 +8,32 @@ namespace MarcoBMS.Services.Middleware
{
private readonly RequestDelegate _next;
private readonly ILogger<LoggingMiddleware> _logger;
private readonly ILoggingService _loggingService;
//private readonly UserHelper _userHelper;
public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger, ILoggingService loggingService)
private readonly List<string> _ignoredPaths = new List<string>
{
"/hubs/marco",
"/hubs/marco/negotiate",
"/swagger"
};
public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
{
_next = next;
_logger = logger;
//_userHelper = userHelper;
_loggingService = loggingService;
}
public async Task Invoke(HttpContext context)
{
if (_ignoredPaths.Any(path => context.Request.Path.StartsWithSegments(path, StringComparison.OrdinalIgnoreCase)))
{
await _next(context);
return;
}
var stopwatch = Stopwatch.StartNew();
var response = context.Response;
var request = context.Request;
var tenantId = context.User.FindFirst("TenantId")?.Value;
var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);
string origin = request.Headers["Origin"].FirstOrDefault() ?? "";
using (LogContext.PushProperty("TenantId", tenantId))
@ -35,6 +45,7 @@ namespace MarcoBMS.Services.Middleware
using (LogContext.PushProperty("RequestPath", request.Path))
using (LogContext.PushProperty("Origin", origin))
using (LogContext.PushProperty("LogOrigin", "ASP .NET Api"))
using (LogContext.PushProperty("UserId", userId))