using Marco.Pms.Model.Dtos.Expenses; 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(); } #region =================================================================== Expense Functions =================================================================== /// /// 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([FromQuery] string? searchString, [FromQuery] string? filter, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetExpensesListAsync(loggedInEmployee, tenantId, searchString, filter, pageSize, pageNumber); return StatusCode(response.StatusCode, response); } [HttpGet("details/{id?}")] public async Task GetExpenseDetails(Guid? id, [FromQuery] string? expenseUId) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetExpenseDetailsAsync(id, expenseUId, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpGet("suppler-name")] public async Task GetSupplerNameList() { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetSupplerNameListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpGet("filter")] public async Task GetFilterObject() { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetFilterObjectAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPost("create")] public async Task CreateExpense([FromBody] CreateExpensesDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.CreateExpenseAsync(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); } [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); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Expanse", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpDelete("delete/{id}")] public async Task DeleteExpanse(Guid id) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.DeleteExpanseAsync(id, 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); } #endregion #region =================================================================== Payment Request Functions =================================================================== [HttpGet("get/payment-requests/list")] public async Task GetPaymentRequestList([FromQuery] string? searchString, [FromQuery] string? filter, [FromQuery] bool isActive = true, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetPaymentRequestListAsync(searchString, filter, isActive, pageSize, pageNumber, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpGet("get/payment-request/details/{id?}")] public async Task GetPaymentRequestDetails(Guid? id, [FromQuery] string? paymentRequestUId) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetPaymentRequestDetailsAsync(id, paymentRequestUId, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpGet("payment-request/payee")] public async Task GetPayeeNameList() { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetPayeeNameListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpGet("payment-request/filter")] public async Task GetPaymentRequestFilterObject() { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetPaymentRequestFilterObjectAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPost("payment-request/create")] public async Task CreatePaymentRequest([FromBody] PaymentRequestDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.CreatePaymentRequestAsync(model, loggedInEmployee, tenantId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Payment_Request", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpPost("payment-request/action")] public async Task ChangePaymentRequestStatus([FromBody] PaymentRequestRecordDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.ChangePaymentRequestStatusAsync(model, loggedInEmployee, tenantId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Payment_Request", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpPost("payment-request/expense/create")] public async Task ChangeToExpanseFromPaymentRequest(ExpenseConversionDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.ChangeToExpanseFromPaymentRequestAsync(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("payment-request/edit/{id}")] public async Task EditPaymentRequest(Guid id, [FromBody] PaymentRequestDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.EditPaymentRequestAsync(id, model, loggedInEmployee, tenantId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Payment_Request", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpDelete("payment-request/delete/{id}")] public async Task DeletePaymentRequestAsync(Guid id) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.DeleteExpanseAsync(id, loggedInEmployee, tenantId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Payment_Request", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } #endregion #region =================================================================== Recurring Payment Functions =================================================================== [HttpGet("get/recurring-payment/list")] public async Task GetRecurringPaymentList([FromQuery] string? searchString, [FromQuery] string? filter, [FromQuery] bool isActive = true, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetRecurringPaymentListAsync(searchString, filter, isActive, pageSize, pageNumber, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpGet("get/recurring-payment/details/{id?}")] public async Task GetRecurringPaymentDetailsAsync(Guid? id, [FromQuery] string? recurringPaymentUId) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.GetRecurringPaymentDetailsAsync(id, recurringPaymentUId, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPost("recurring-payment/create")] public async Task CreateRecurringPayment([FromBody] CreateRecurringTemplateDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.CreateRecurringPaymentAsync(model, loggedInEmployee, tenantId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Payment_Request", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpPost("recurring-payment/convert/payment-request")] public async Task PaymentRequestConversion(PaymentRequestConversionDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.PaymentRequestConversionAsync(model.RecurringTemplateIds, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPut("recurring-payment/edit/{id}")] public async Task EditRecurringPaymentAsync(Guid id, [FromBody] UpdateRecurringTemplateDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.EditRecurringPaymentAsync(id, model, loggedInEmployee, tenantId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Payment_Request", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } #endregion #region =================================================================== Payment Request Functions =================================================================== #endregion } }