Added the self subscription API
This commit is contained in:
parent
4916a95eb4
commit
3b0c958342
9
Marco.Pms.Model/Dtos/Tenant/SelfSubscriptionDto.cs
Normal file
9
Marco.Pms.Model/Dtos/Tenant/SelfSubscriptionDto.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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 ===================================================================
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user