Added Inventory module and changed the view model for market feature plan API

This commit is contained in:
ashutosh.nehete 2025-12-12 19:11:24 +05:30
parent cf240ae626
commit 6f6292b167
15 changed files with 226 additions and 4 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,54 @@ 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);
//var featureDetailsVM = new FeatureDetailsVM
//{
// Id = featureDetails.Id,
// Modules = _mapper.Map<ModulesDetailsVM>(featureDetails.Modules),
// Reports = featureDetails.Reports,
// Supports = featureDetails.Supports,
// SubscriptionCheckList = featureDetails.SubscriptionCheckList
//};
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 =======================================================