Change the ExpanseController to ExpenseController

This commit is contained in:
ashutosh.nehete 2025-07-19 19:05:07 +05:30
parent 741acb194e
commit c1845dd8b7
6 changed files with 140 additions and 9 deletions

View File

@ -0,0 +1,23 @@
using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.Master;
using Marco.Pms.Model.ViewModels.Projects;
namespace Marco.Pms.Model.ViewModels.Expanses
{
public class ExpenseList
{
public Guid Id { get; set; }
public ProjectInfoVM? Project { get; set; }
public ExpensesTypeMasterVM? ExpensesType { get; set; }
public PaymentModeMatserVM? PaymentMode { get; set; }
public BasicEmployeeVM? PaidBy { get; set; }
public BasicEmployeeVM? CreatedBy { get; set; }
public DateTime TransactionDate { get; set; }
public DateTime CreatedAt { get; set; }
public string SupplerName { get; set; } = string.Empty;
public double Amount { get; set; }
public ExpensesStatusMasterVM? Status { get; set; }
public List<ExpensesStatusMasterVM>? NextStatus { get; set; }
public bool PreApproved { get; set; } = false;
}
}

View File

@ -0,0 +1,10 @@
namespace Marco.Pms.Model.ViewModels.Master
{
public class ExpensesStatusMasterVM
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public bool IsSystem { get; set; } = false;
}
}

View File

@ -0,0 +1,10 @@
namespace Marco.Pms.Model.ViewModels.Master
{
public class ExpensesTypeMasterVM
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;
public bool NoOfPersonsRequired { get; set; }
public string Description { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,9 @@
namespace Marco.Pms.Model.ViewModels.Master
{
public class PaymentModeMatserVM
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
}
}

View File

@ -1,8 +1,11 @@
using Marco.Pms.DataAccess.Data;
using AutoMapper;
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Dtos.Expenses;
using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.Expenses;
using Marco.Pms.Model.Utilities;
using Marco.Pms.Model.ViewModels.Expanses;
using Marco.Pms.Model.ViewModels.Master;
using Marco.Pms.Services.Service;
using MarcoBMS.Services.Helpers;
using MarcoBMS.Services.Service;
@ -18,42 +21,100 @@ namespace Marco.Pms.Services.Controllers
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class ExpanseController : ControllerBase
public class ExpenseController : ControllerBase
{
private readonly ApplicationDbContext _context;
private readonly UserHelper _userHelper;
private readonly PermissionServices _permission;
private readonly ILoggingService _logger;
private readonly S3UploadService _s3Service;
private readonly IMapper _mapper;
private readonly Guid tenantId;
public ExpanseController(
public ExpenseController(
ApplicationDbContext context,
UserHelper userHelper,
PermissionServices permission,
ILoggingService logger,
S3UploadService s3Service)
S3UploadService s3Service,
IMapper mapper)
{
_context = context;
_userHelper = userHelper;
_permission = permission;
_logger = logger;
tenantId = userHelper.GetTenantId();
_s3Service = s3Service;
_mapper = mapper;
tenantId = userHelper.GetTenantId();
}
[HttpGet("list")]
public async Task<IActionResult> Get()
public async Task<IActionResult> GetExpensesList()
{
var expensesList = await _context.Expenses
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var loggedInEmployeeId = loggedInEmployee.Id;
List<Expenses>? expensesList = null;
var expensesListQuery = _context.Expenses
.Include(e => e.ExpensesType)
.Include(e => e.Project)
.Include(e => e.PaidBy)
.ThenInclude(e => e!.JobRole)
.Include(e => e.PaymentMode)
.Include(e => e.Status)
.Include(e => e.CreatedBy)
.Where(e => e.TenantId == tenantId)
.Where(e => e.TenantId == tenantId);
var HasViewAllPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId);
var HasViewSelfPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId);
if (HasViewAllPermission)
{
expensesList = await expensesListQuery.ToListAsync();
}
else if (HasViewSelfPermission)
{
expensesList = await expensesListQuery.Where(e => e.CreatedById == loggedInEmployeeId).ToListAsync();
}
if (expensesList == null)
{
_logger.LogInfo("No Expense found for employee {EmployeeId}", loggedInEmployeeId);
return Ok(ApiResponse<object>.SuccessResponse(new List<ExpenseList>(), "No Expense found for current user", 200));
}
//ImageFilter? imageFilter = null;
//if (!string.IsNullOrWhiteSpace(filter))
//{
// try
// {
// var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
// //string unescapedJsonString = JsonSerializer.Deserialize<string>(filter, options) ?? "";
// //imageFilter = JsonSerializer.Deserialize<ImageFilter>(unescapedJsonString, options);
// imageFilter = JsonSerializer.Deserialize<ImageFilter>(filter, options);
// }
// catch (Exception ex)
// {
// _logger.LogWarning("[GetImageList] Failed to parse filter: {Message}", ex.Message);
// }
//}
var response = _mapper.Map<List<ExpenseList>>(expensesList);
var statusIds = expensesList.Select(e => e.StatusId).ToList();
var statusMappings = await _context.ExpensesStatusMapping
.Include(sm => sm.NextStatus)
.Where(sm => statusIds.Contains(sm.StatusId))
.ToListAsync();
return StatusCode(200, ApiResponse<object>.SuccessResponse(expensesList));
foreach (var expense in response)
{
var statusMapping = statusMappings.Where(sm => sm.StatusId == expense.Status?.Id).Select(sm => _mapper.Map<ExpensesStatusMasterVM>(sm.NextStatus)).ToList();
expense.NextStatus = statusMapping;
}
return StatusCode(200, ApiResponse<object>.SuccessResponse(response, $"{response.Count} records of expenses for you fetched successfully", 200));
}
[HttpGet("details/{id}")]

View File

@ -2,10 +2,14 @@ using AutoMapper;
using Marco.Pms.Model.Dtos.Master;
using Marco.Pms.Model.Dtos.Project;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Expenses;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.MongoDBModels;
using Marco.Pms.Model.Projects;
using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.Employee;
using Marco.Pms.Model.ViewModels.Expanses;
using Marco.Pms.Model.ViewModels.Master;
using Marco.Pms.Model.ViewModels.Projects;
namespace Marco.Pms.Services.MappingProfiles
@ -63,6 +67,17 @@ namespace Marco.Pms.Services.MappingProfiles
#region ======================================================= Employee =======================================================
CreateMap<Employee, EmployeeVM>();
CreateMap<Employee, BasicEmployeeVM>()
.ForMember(
dest => dest.JobRoleName,
opt => opt.MapFrom(src => src.JobRole != null ? src.JobRole.Name : ""));
#endregion
#region ======================================================= Expenses =======================================================
CreateMap<Expenses, ExpenseList>();
#endregion
#region ======================================================= Master =======================================================
@ -72,6 +87,9 @@ namespace Marco.Pms.Services.MappingProfiles
// Explicitly and safely convert nullable Guid to non-nullable Guid
opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty)
);
CreateMap<ExpensesTypeMaster, ExpensesTypeMasterVM>();
CreateMap<ExpensesStatusMaster, ExpensesStatusMasterVM>();
CreateMap<PaymentModeMatser, PaymentModeMatserVM>();
#endregion
}
}