Added the edit recurring payment API template

This commit is contained in:
ashutosh.nehete 2025-11-04 17:02:56 +05:30
parent c285f2be03
commit e9175156e6
5 changed files with 141 additions and 8 deletions

View File

@ -0,0 +1,33 @@
using Marco.Pms.Model.Expenses;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.TenantModels;
using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.Master;
using Marco.Pms.Model.ViewModels.Projects;
namespace Marco.Pms.Model.ViewModels.Expenses
{
public class RecurringPaymentVM
{
public Guid Id { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public string? RecurringPaymentUId { get; set; }
public string? Payee { get; set; }
public string? NotifyTo { get; set; }
public CurrencyMaster? Currency { get; set; }
public double Amount { get; set; }
public DateTime StrikeDate { get; set; }
public DateTime? LatestPRGeneratedAt { get; set; }
public BasicProjectVM? Project { get; set; }
public int PaymentBufferDays { get; set; }
public int NumberOfIteration { get; set; }
public ExpensesCategoryMasterVM? ExpenseCategory { get; set; }
public RecurringPaymentStatus? Status { get; set; }
public PLAN_FREQUENCY Frequency { get; set; }
public bool IsVariable { get; set; }
public bool IsActive { get; set; }
public DateTime CreatedAt { get; set; }
public BasicEmployeeVM? CreatedBy { get; set; }
}
}

View File

@ -222,6 +222,16 @@ namespace Marco.Pms.Services.Controllers
return StatusCode(response.StatusCode, response);
}
[HttpPost("recurring-payment/edit/{id}")]
public async Task<IActionResult> EditRecurringPaymentAsync(Guid id, [FromBody] RecurringTemplateDto model)
{
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _expensesService.EditRecurringPaymentAsync(id, model, loggedInEmployee, tenantId);
return StatusCode(response.StatusCode, response);
}
#endregion

View File

@ -270,7 +270,7 @@ namespace Marco.Pms.Services.MappingProfiles
#region ======================================================= Recurring Request =======================================================
CreateMap<RecurringTemplateDto, RecurringPayment>();
//CreateMap<RecurringPayment, PaymentRequestVM>();
CreateMap<RecurringPayment, RecurringPaymentVM>();
//CreateMap<RecurringPayment, PaymentRequestDetailsVM>();
#endregion

View File

@ -1943,7 +1943,7 @@ namespace Marco.Pms.Services.Service
if (!hasAttachments && paymentRequest.ExpenseCategory!.IsAttachmentRequried)
{
_logger.LogWarning("Attachment is required for ExpenseCategory {ExpenseCategoryId} but no attachments provided.", paymentRequest.ExpenseCategoryId);
_logger.LogWarning("Attachment is required for ExpenseCategory {ExpenseCategoryId} but no attachments provided.", paymentRequest.ExpenseCategoryId!);
return ApiResponse<object>.ErrorResponse("Attachment is required.", "Attachment is required.", 400);
}
@ -1969,7 +1969,7 @@ namespace Marco.Pms.Services.Service
var expenseStatuses = expenseStatusTask.Result;
// Generate Expense UID with prefix for current period
string uIDPrefix = $"EX/{DateTime.Now:MM.yy}";
string uIDPrefix = $"EX/{DateTime.Now:MMyy}";
var lastExpense = await _context.Expenses
.Where(e => e.UIDPrefix == uIDPrefix)
@ -2067,7 +2067,6 @@ namespace Marco.Pms.Services.Service
_logger.LogInfo("End ChangeToExpanseFromPaymentRequestAsync called by EmployeeId: {EmployeeId}", loggedInEmployee.Id);
}
}
public async Task<ApiResponse<object>> EditPaymentRequestAsync(Guid id, PaymentRequestDto model, Employee loggedInEmployee, Guid tenantId)
{
_logger.LogInfo("Start EditPaymentRequestAsync for PaymentRequestId: {PaymentRequestId}, EmployeeId: {EmployeeId}", id, loggedInEmployee.Id);
@ -2311,8 +2310,98 @@ namespace Marco.Pms.Services.Service
#region =================================================================== Recurring Payment Functions ===================================================================
public async Task<ApiResponse<object>> CreateRecurringPaymentAsync(RecurringTemplateDto model, Employee loggedInEmployee, Guid tenantId)
{
using var scope = _serviceScopeFactory.CreateScope();
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
var hasPermission = await permissionService.HasPermission(PermissionsMaster.ManageRecurring, loggedInEmployee.Id);
if (!hasPermission)
{
_logger.LogWarning("Employee {EmployeeId} attempted to create recurring template", loggedInEmployee.Id);
return ApiResponse<object>.ErrorResponse("You do not have access to create recurring template", "You do not have access to create recurring template", 400);
}
var expenseCategoryTask = Task.Run(async () =>
{
await using var context = await _dbContextFactory.CreateDbContextAsync();
return await context.ExpenseCategoryMasters.FirstOrDefaultAsync(et => et.Id == model.ExpenseCategoryId && et.IsActive);
});
var currencyTask = Task.Run(async () =>
{
await using var context = await _dbContextFactory.CreateDbContextAsync();
return await context.CurrencyMaster.FirstOrDefaultAsync(c => c.Id == model.CurrencyId);
});
var projectTask = Task.Run(async () =>
{
await using var context = await _dbContextFactory.CreateDbContextAsync();
return await context.Projects.FirstOrDefaultAsync(P => model.ProjectId.HasValue && P.Id == model.ProjectId.Value);
});
await Task.WhenAll(expenseCategoryTask, currencyTask, projectTask);
var expenseCategory = await expenseCategoryTask;
if (expenseCategory == null)
{
_logger.LogWarning("Expense Category not found with Id: {ExpenseCategoryId}", model.ExpenseCategoryId);
return ApiResponse<object>.ErrorResponse("Expense Category not found.", "Expense Category not found.", 404);
}
var currency = await currencyTask;
if (currency == null)
{
_logger.LogWarning("Currency not found with Id: {CurrencyId}", model.CurrencyId);
return ApiResponse<object>.ErrorResponse("Currency not found.", "Currency not found.", 404);
}
var project = await projectTask;
string uIDPrefix = $"RP/{DateTime.Now:MMyy}";
var lastExpense = await _context.RecurringPayments
.Where(e => e.UIDPrefix == uIDPrefix)
.OrderByDescending(e => e.UIDPostfix)
.FirstOrDefaultAsync();
int uIDPostfix = lastExpense == null ? 1 : (lastExpense.UIDPostfix + 1);
var recurringPayment = _mapper.Map<RecurringPayment>(model);
return ApiResponse<object>.SuccessResponse(recurringPayment, "Recurring Payment Template created successfully", 201);
recurringPayment.UIDPrefix = uIDPrefix;
recurringPayment.UIDPostfix = uIDPostfix;
recurringPayment.IsActive = true;
recurringPayment.CreatedAt = DateTime.UtcNow;
recurringPayment.CreatedById = loggedInEmployee.Id;
recurringPayment.TenantId = tenantId;
await _context.SaveChangesAsync();
var response = _mapper.Map<RecurringPaymentVM>(recurringPayment);
response.RecurringPaymentUId = $"{recurringPayment.UIDPrefix}/{recurringPayment.UIDPostfix:D5}";
return ApiResponse<object>.SuccessResponse(response, "Recurring Payment Template created successfully", 201);
}
public async Task<ApiResponse<object>> EditRecurringPaymentAsync(Guid id, RecurringTemplateDto model, Employee loggedInEmployee, Guid tenantId)
{
string uIDPrefix = $"RP/{DateTime.Now:MMyy}";
var lastExpense = await _context.RecurringPayments
.Where(e => e.UIDPrefix == uIDPrefix)
.OrderByDescending(e => e.UIDPostfix)
.FirstOrDefaultAsync();
int uIDPostfix = lastExpense == null ? 1 : (lastExpense.UIDPostfix + 1);
var recurringPayment = _mapper.Map<RecurringPayment>(model);
recurringPayment.UIDPrefix = uIDPrefix;
recurringPayment.UIDPostfix = uIDPostfix;
recurringPayment.IsActive = true;
recurringPayment.CreatedAt = DateTime.UtcNow;
recurringPayment.CreatedById = loggedInEmployee.Id;
recurringPayment.TenantId = tenantId;
var response = _mapper.Map<RecurringPaymentVM>(recurringPayment);
response.RecurringPaymentUId = $"{recurringPayment.UIDPrefix}/{recurringPayment.UIDPostfix:D5}";
return ApiResponse<object>.SuccessResponse(response, "Recurring Payment Template created successfully", 201);
}
#endregion

View File

@ -28,13 +28,14 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
Task<ApiResponse<object>> EditPaymentRequestAsync(Guid id, PaymentRequestDto model, Employee loggedInEmployee, Guid tenantId);
#endregion
#region =================================================================== Recurring Payment Functions ===================================================================
Task<ApiResponse<object>> CreateRecurringPaymentAsync(RecurringTemplateDto model, Employee loggedInEmployee, Guid tenantId);
Task<ApiResponse<object>> EditRecurringPaymentAsync(Guid id, RecurringTemplateDto model, Employee loggedInEmployee, Guid tenantId);
#endregion
#region =================================================================== Advance Payment Functions ===================================================================
Task<ApiResponse<object>> GetAdvancePaymentTransactionAsync(Guid id);
#endregion
#region =================================================================== Recurring Payment Functions ===================================================================
Task<ApiResponse<object>> CreateRecurringPaymentAsync(RecurringTemplateDto model, Employee loggedInEmployee, Guid tenantId);
#endregion
}
}