Added the self subscription API

This commit is contained in:
ashutosh.nehete 2025-10-29 16:28:55 +05:30
parent 4916a95eb4
commit 3b0c958342
6 changed files with 83 additions and 25 deletions

View File

@ -0,0 +1,9 @@
namespace Marco.Pms.Model.Dtos.Tenant
{
public class SelfSubscriptionDto
{
public Guid TenantEnquireId { get; set; }
public Guid PaymentDetailId { get; set; }
public Guid PlanId { get; set; }
}
}

View File

@ -1,6 +1,7 @@
using Marco.Pms.Model.Master;
using Marco.Pms.Model.TenantModels;
using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.PaymentGetway;
namespace Marco.Pms.Model.ViewModels.Tenant
{
@ -16,6 +17,7 @@ namespace Marco.Pms.Model.ViewModels.Tenant
public DateTime EndDate { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; }
public PaymentDetailsVM? PaymentDetail { get; set; }
public BasicEmployeeVM? CreatedBy { get; set; }
public BasicEmployeeVM? updatedBy { get; set; }
public CurrencyMaster? Currency { get; set; }

View File

@ -79,7 +79,6 @@ namespace Marco.Pms.Services.Controllers
// Fetch complete payment details from Razorpay including card details
var response = await _razorpayService.GetPaymentDetails(request.PaymentId);
var tenant = await _tenantService.CreateTenantAsync(request.TenantEnquireId, response.Id, request.PlanId);
_logger.LogInfo("Invoice generated and saved for OrderId: {OrderId}", request.OrderId);

View File

@ -16,6 +16,7 @@ using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.Tenant;
using Marco.Pms.Services.Helpers;
using Marco.Pms.Services.Service;
using Marco.Pms.Services.Service.ServiceInterfaces;
using MarcoBMS.Services.Helpers;
using MarcoBMS.Services.Service;
using Microsoft.AspNetCore.Authorization;
@ -238,34 +239,31 @@ namespace Marco.Pms.Services.Controllers
return StatusCode(403, ApiResponse<object>.ErrorResponse("Unauthorized", "User must be logged in.", 403));
}
using var scope = _serviceScopeFactory.CreateScope();
// Check permissions using a single service scope to avoid overhead
bool hasManagePermission, hasModifyPermission, hasViewPermission;
using (var scope = _serviceScopeFactory.CreateScope())
var manageTask = Task.Run(async () =>
{
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
return await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id);
});
var modifyTask = Task.Run(async () =>
{
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
return await permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id);
});
var viewTask = Task.Run(async () =>
{
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
return await permissionService.HasPermission(PermissionsMaster.ViewTenant, loggedInEmployee.Id);
});
await Task.WhenAll(manageTask, modifyTask, viewTask);
var manageTask = Task.Run(async () =>
{
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
return await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id);
});
var modifyTask = Task.Run(async () =>
{
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
return await permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id);
});
var viewTask = Task.Run(async () =>
{
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
return await permissionService.HasPermission(PermissionsMaster.ViewTenant, loggedInEmployee.Id);
});
await Task.WhenAll(manageTask, modifyTask, viewTask);
hasManagePermission = manageTask.Result;
hasModifyPermission = modifyTask.Result;
hasViewPermission = viewTask.Result;
}
hasManagePermission = manageTask.Result;
hasModifyPermission = modifyTask.Result;
hasViewPermission = viewTask.Result;
if (!hasManagePermission && !hasModifyPermission && !hasViewPermission)
{
@ -351,6 +349,11 @@ namespace Marco.Pms.Services.Controllers
var plans = plansTask.Result;
var projects = projectsTask.Result;
var _razorpayService = scope.ServiceProvider.GetRequiredService<IRazorpayService>();
var paymentDetailIds = plans.Where(ts => ts.PaymentDetailId.HasValue).Select(ts => ts.PaymentDetailId!.Value).ToList();
var paymentsDetails = await _razorpayService.GetPaymentDetailsListFromDataBase(paymentDetailIds);
// Calculate active/inactive employees count
var activeEmployeesCount = employees.Count(e => e.IsActive);
var inActiveEmployeesCount = employees.Count - activeEmployeesCount;
@ -379,9 +382,16 @@ namespace Marco.Pms.Services.Controllers
response.CreatedBy = createdBy;
response.CurrentPlan = _mapper.Map<SubscriptionPlanDetailsVM>(currentPlan);
response.CurrentPlan.PaymentDetail = paymentsDetails.FirstOrDefault(pd => currentPlan != null && pd.Id == currentPlan.PaymentDetailId);
response.CurrentPlanFeatures = await _featureDetailsHelper.GetFeatureDetails(currentPlan?.Plan?.FeaturesId ?? Guid.Empty);
// Map subscription history plans to DTO
response.SubscriptionHistery = _mapper.Map<List<SubscriptionPlanDetailsVM>>(plans);
response.SubscriptionHistery = plans.Select(ts =>
{
var result = _mapper.Map<SubscriptionPlanDetailsVM>(ts);
result.PaymentDetail = paymentsDetails.FirstOrDefault(pd => ts != null && pd.Id == ts.PaymentDetailId);
return result;
}).ToList();
_logger.LogInfo("Tenant details fetched successfully for TenantId: {TenantId}", tenant.Id);
@ -1574,6 +1584,24 @@ namespace Marco.Pms.Services.Controllers
}
}
[AllowAnonymous]
[HttpPost("self/subscription")]
public async Task<IActionResult> SelfSubscriptionAsync(SelfSubscriptionDto model)
{
try
{
using var scope = _serviceScopeFactory.CreateScope();
var _tenantService = scope.ServiceProvider.GetRequiredService<ITenantService>();
var tenant = await _tenantService.CreateTenantAsync(model.TenantEnquireId, model.PaymentDetailId, model.PlanId);
return Ok(ApiResponse<object>.SuccessResponse(tenant, "Tenant Registration Successfully", 201));
}
catch (Exception ex)
{
_logger.LogError(ex, "Error occured while add self subscription");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Error Occured while self subscription", "Error Occured while self subscription", 500));
}
}
#endregion
#region =================================================================== Subscription Plan APIs ===================================================================

View File

@ -240,6 +240,25 @@ namespace Marco.Pms.Services.Service
}
}
public async Task<List<PaymentDetailsVM>> GetPaymentDetailsListFromDataBase(List<Guid> paymentDetailsIds)
{
var projectDetails = await _context.PaymentDetails.Where(pd => paymentDetailsIds.Contains(pd.Id)).ToListAsync();
List<PaymentDetailsVM> response = new List<PaymentDetailsVM>();
foreach (var projectDetail in projectDetails)
{
string decrypedData = _aesEncryption.Decrypt(projectDetail.EncryptedDetails ?? new byte[32], projectDetail.Nonce ?? new byte[12], projectDetail.Tag ?? new byte[16], encryptionKey);
// Deserialize JSON string to a Department object
PaymentDetailsVM? vm = JsonConvert.DeserializeObject<PaymentDetailsVM>(decrypedData);
if (vm != null)
{
response.Add(vm);
}
}
return response;
}
/// <summary>
/// Extract card details from payment
/// </summary>

View File

@ -9,6 +9,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
string GetExpectedSignature(string payload);
Task<PaymentDetailsVM> GetPaymentDetails(string paymentId);
Task<PaymentDetailsVM> GetPaymentDetailsFromDataBase(Guid id);
Task<List<PaymentDetailsVM>> GetPaymentDetailsListFromDataBase(List<Guid> paymentDetailsIds);
RazorpayOrderDetails? GetOrderDetails(string orderId);
}
}