diff --git a/Marco.Pms.Model/ViewModels/Expenses/AdvancePaymentTransactionVM.cs b/Marco.Pms.Model/ViewModels/Expenses/AdvancePaymentTransactionVM.cs new file mode 100644 index 0000000..58665d4 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Expenses/AdvancePaymentTransactionVM.cs @@ -0,0 +1,24 @@ +using Marco.Pms.Model.ViewModels.Activities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Marco.Pms.Model.ViewModels.Expenses +{ + public class AdvancePaymentTransactionVM + { + public Guid Id { get; set; } + public string FinanceUId { get; set; } = default!; + public BasicEmployeeVM? Employee { get; set; } + public double Amount { get; set; } + public DateTime CreatedAt { get; set; } + + public BasicEmployeeVM? CreatedBy { get; set; } + public bool IsActive { get; set; } + + } +} diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 36b0f74..69cb911 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -46,11 +46,11 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } - [HttpGet("details/{id}")] - public async Task GetExpenseDetails(Guid id) + [HttpGet("details")] + public async Task GetExpenseDetails([FromQuery] Guid? id,[FromQuery] string? financeUId) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _expensesService.GetExpenseDetailsAsync(id, loggedInEmployee, tenantId); + var response = await _expensesService.GetExpenseDetailsAsync(id, financeUId, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } @@ -122,5 +122,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet("/get/transactions/{employeeId}")] + public async Task GetAdvancePaymentTransaction(Guid employeeId) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.GetAdvancePaymentTransactionAsync(employeeId); + + return StatusCode(response.StatusCode, response); + + } } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 5f4a1c9..e312056 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -258,6 +258,8 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + CreateMap(); + #endregion #region ======================================================= Collection ======================================================= diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index d5f943a..2b8a5f4 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -284,11 +284,23 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Error Occured", ExceptionMapper(ex), 500); } } - public async Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId) + public async Task> GetExpenseDetailsAsync(Guid? id,string? financeUId, Employee loggedInEmployee, Guid tenantId) { try { - //ExpenseDetailsMongoDB? expenseDetails = await _cache.GetExpenseDetailsById(id, tenantId); + + if(string.IsNullOrWhiteSpace(financeUId)) + return ApiResponse.ErrorResponse("Finance UID is required.", null, 400); + + var parts = financeUId.Split('-'); + if (parts.Length != 2) + return ApiResponse.ErrorResponse("Invalid Finance UID format.", null, 400); + + var prefix = parts[0]; + var postfixStr = parts[1]; + + if (!int.TryParse(postfixStr, out int postfix)) + return ApiResponse.ErrorResponse("Invalid Finance UID number format.", null, 400); ExpenseDetailsMongoDB? expenseDetails = null; if (expenseDetails == null) { @@ -303,7 +315,7 @@ namespace Marco.Pms.Services.Service .Include(e => e.PaymentMode) .Include(e => e.ExpensesType) .Include(e => e.Status) - .AsNoTracking().FirstOrDefaultAsync(e => e.Id == id && e.TenantId == tenantId); + .AsNoTracking().FirstOrDefaultAsync(e =>(e.Id == id || e.ExpenseUId == financeUId ) && e.TenantId == tenantId); if (expense == null) { @@ -422,6 +434,60 @@ namespace Marco.Pms.Services.Service } } + public async Task> GetAdvancePaymentTransactionAsync(Guid employeeId) + { + try + { + var transactions = await _context.AdvancePaymentTransactions + .Include(t => t.Employee) + .Include(t => t.CreatedBy) + .Where(t => t.EmployeeId == employeeId && t.IsActive) + .OrderByDescending(t => t.CreatedAt) + //.Select(t => new AdvancePaymentTransactionVM + //{ + // Id = t.Id, + // FinanceUId = t.FinanceUIdPrefix + "/" + t.FinanceUIdPostfix, + // Amount = t.Amount, + // CreatedAt = t.CreatedAt, + // IsActive = t.IsActive, + // Employee = t.Employee == null ? null : new BasicEmployeeVM + // { + // Id = t.Employee.Id, + // FirstName = t.Employee.FirstName, + // LastName = t.Employee.LastName, + // }, + // CreatedBy = t.CreatedBy == null ? null : new BasicEmployeeVM + // { + // Id = t.CreatedBy.Id, + // FirstName = t.Employee.FirstName, + // LastName = t.Employee.LastName, + // } + //}) + .ToListAsync(); + + if (transactions == null || !transactions.Any()) + return ApiResponse.ErrorResponse("No advance payment transactions found.", null, 404); + + var response = transactions.Select(transaction => + { + var result = _mapper.Map(transaction); + result.FinanceUId = transaction.FinanceUIdPrefix + "/" + transaction.FinanceUIdPostfix.ToString("D5"); + return result; + }).ToList(); + + + + return ApiResponse.SuccessResponse(response, "Advance payment transaction fetched successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occurred while fetching the list of Advance Payment Transactions."); + return ApiResponse.ErrorResponse("Internal exception occurred.", ExceptionMapper(ex), 500); + } + } + + + #endregion #region =================================================================== Post Functions =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 5d84eab..3decc38 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -7,12 +7,14 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces public interface IExpensesService { Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber); - Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId); + Task> GetExpenseDetailsAsync(Guid? id, string? financeUId, Employee loggedInEmployee, Guid tenantId); Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId); Task> GetFilterObjectAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId); Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId); Task> DeleteExpanseAsync(Guid id, Employee loggedInEmployee, Guid tenantId); + + Task> GetAdvancePaymentTransactionAsync(Guid id); } }