Merge pull request 'Feature_Plan_Review' (#162) from Feature_Plan_Review into main
Reviewed-on: #162
This commit is contained in:
commit
55a05ecff2
9
Marco.Pms.Model/Dtos/Tenant/InventoryModuleDetailsDto.cs
Normal file
9
Marco.Pms.Model/Dtos/Tenant/InventoryModuleDetailsDto.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
15
Marco.Pms.Model/ViewModels/Tenant/AttendanceDetailsVM.cs
Normal file
15
Marco.Pms.Model/ViewModels/Tenant/AttendanceDetailsVM.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
14
Marco.Pms.Model/ViewModels/Tenant/DirectoryDetailsVM.cs
Normal file
14
Marco.Pms.Model/ViewModels/Tenant/DirectoryDetailsVM.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
12
Marco.Pms.Model/ViewModels/Tenant/ExpenseModuleDetailsVM.cs
Normal file
12
Marco.Pms.Model/ViewModels/Tenant/ExpenseModuleDetailsVM.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
13
Marco.Pms.Model/ViewModels/Tenant/FeatureDetailsVM.cs
Normal file
13
Marco.Pms.Model/ViewModels/Tenant/FeatureDetailsVM.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
14
Marco.Pms.Model/ViewModels/Tenant/ModulesDetailsVM.cs
Normal file
14
Marco.Pms.Model/ViewModels/Tenant/ModulesDetailsVM.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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 =======================================================
|
||||
|
||||
|
||||
@ -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))
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user