using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers { [Route("api/[controller]")] [ApiController] [Authorize] public class ExpenseController : ControllerBase { private readonly UserHelper _userHelper; private readonly IExpensesService _expensesService; private readonly ISignalRService _signalR; private readonly Guid tenantId; public ExpenseController( UserHelper userHelper, IExpensesService expensesService, ISignalRService signalR ) { _userHelper = userHelper; _expensesService = expensesService; _signalR = signalR; tenantId = userHelper.GetTenantId(); } /// /// Retrieves a paginated list of expenses based on user permissions and optional filters. /// /// A URL-encoded JSON string containing filter criteria. See . /// The number of records to return per page. /// The page number to retrieve. /// A paginated list of expenses. [HttpGet("list")] public async Task GetExpensesList(string? filter, int pageSize = 20, int pageNumber = 1) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetExpensesListAsync(loggedInEmployee, tenantId, filter, pageSize, pageNumber); return StatusCode(response.StatusCode, response); } [HttpGet("details/{id}")] public string Get(int id) { return "value"; } /// /// Creates a new expense entry along with its bill attachments. /// This operation is transactional and performs validations and file uploads concurrently for optimal performance /// by leveraging async/await without unnecessary thread-pool switching via Task.Run. /// /// The data transfer object containing expense details and attachments. /// An IActionResult indicating the result of the creation operation. [HttpPost("create")] public async Task CreateExpense([FromBody] CreateExpensesDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.CreateExpenseAsync(model, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPost("action")] public async Task ChangeStatus([FromBody] ExpenseRecordDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.ChangeStatusAsync(model, loggedInEmployee, tenantId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Expanse", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpPut("edit/{id}")] public async Task UpdateExpanse(Guid id, [FromBody] UpdateExpensesDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.UpdateExpanseAsync(id, model, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpDelete("delete/{id}")] public void Delete(int id) { } } }