Added an API to get a list of Invoice attachment types

This commit is contained in:
ashutosh.nehete 2025-11-25 19:12:29 +05:30
parent 8aace3e1d9
commit c4653b557c
3 changed files with 91 additions and 0 deletions

View File

@ -71,16 +71,48 @@ namespace Marco.Pms.Services.Controllers
#endregion
#region =================================================================== Purchase Invoice Status APIs ===================================================================
/// <summary>
/// Retrieves the purchase invoice status.
/// </summary>
/// <param name="ct">The cancellation token.</param>
/// <returns>The HTTP response containing the purchase invoice status.</returns>
[HttpGet("purchase-invoice-status/list")]
public async Task<IActionResult> GetPurchaseInvoiceStatus(CancellationToken ct)
{
// Get the currently logged-in employee.
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
// Retrieve the purchase invoice status asynchronously.
var response = await _masterService.GetPurchaseInvoiceStatusAsync(loggedInEmployee, ct);
// Return the HTTP response with the purchase invoice status.
return StatusCode(response.StatusCode, response);
}
#endregion
#region =================================================================== Invoice Attachment Type APIs ===================================================================
/// <summary>
/// Retrieves the invoice attachment types.
/// </summary>
/// <param name="ct">The cancellation token.</param>
/// <returns>The HTTP response containing the invoice attachment types.</returns>
[HttpGet("purchase-attachment-type/list")]
public async Task<IActionResult> GetInvoiceAttachmentType(CancellationToken ct)
{
// Get the currently logged-in employee.
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
// Retrieve the invoice attachment types asynchronously.
var response = await _masterService.GetInvoiceAttachmentTypeAsync(loggedInEmployee, ct);
// Return the HTTP response with the invoice attachment types.
return StatusCode(response.StatusCode, response);
}
#endregion
#region =================================================================== Currency APIs ===================================================================
[HttpGet("currencies/list")]

View File

@ -244,6 +244,61 @@ namespace Marco.Pms.Services.Service
#endregion
#region =================================================================== Invoice Attachment Type APIs ===================================================================
/// <summary>
/// Asynchronously retrieves the list of valid Invoice Attachment Types.
/// </summary>
/// <param name="loggedInEmployee">The current user context for audit logging.</param>
/// <param name="cancellationToken">Token to propagate notification that operations should be canceled.</param>
/// <returns>A standardized API response containing a list of attachment type DTOs.</returns>
public async Task<ApiResponse<object>> GetInvoiceAttachmentTypeAsync(Employee loggedInEmployee, CancellationToken cancellationToken = default)
{
// 1. Structured Logging: Audit WHO is requesting the data
_logger.LogInfo("Initiating fetch of Invoice Attachment Types. Requested by User ID: {UserId}", loggedInEmployee.Id);
try
{
// 2. Database Optimization:
// - AsNoTracking(): Crucial for read-only lists. Bypasses change tracking overhead.
// - Select(): Projects directly to DTO. Fetches ONLY needed columns (SQL optimization).
var attachmentTypes = await _context.InvoiceAttachmentTypes
.AsNoTracking()
.OrderBy(type => type.Name)
.ToListAsync(cancellationToken); // 3. Pass the token to EF Core
_logger.LogInfo("Successfully retrieved {Count} Invoice Attachment Types.", attachmentTypes.Count);
// 4. Strong Typing: Return IEnumerable<Dto> instead of 'object'
return ApiResponse<object>.SuccessResponse(
attachmentTypes,
$"{attachmentTypes.Count} record(s) of invoice attachment type fetched successfully",
200
);
}
catch (OperationCanceledException)
{
// Handle request cancellation (e.g., user navigated away)
_logger.LogWarning("Invoice Attachment Type fetch operation was canceled by the client.");
return ApiResponse<object>.ErrorResponse("Operation canceled", "Request canceled by user", 499);
}
catch (Exception ex)
{
// 5. Security & Error Handling:
// Log the real error with stack trace internally.
_logger.LogError(ex, "Critical error fetching Invoice Attachment Types for User ID: {UserId}", loggedInEmployee.Id);
// Return a sanitized message to the client. Never expose raw SQL errors or Stack Traces.
return ApiResponse<object>.ErrorResponse(
"An unexpected error occurred while processing your request.",
"Internal Server Error",
500
);
}
}
#endregion
#region =================================================================== Currency APIs ===================================================================
public async Task<ApiResponse<object>> GetCurrencyAsync(Employee loggedInEmployee, Guid tenantId)

View File

@ -25,6 +25,10 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
#region =================================================================== Purchase Invoice Status APIs ===================================================================
Task<ApiResponse<object>> GetPurchaseInvoiceStatusAsync(Employee loggedInEmployee, CancellationToken cancellationToken);
#endregion
#region =================================================================== Invoice Attachment Type APIs ===================================================================
Task<ApiResponse<object>> GetInvoiceAttachmentTypeAsync(Employee loggedInEmployee, CancellationToken cancellationToken);
#endregion
#region =================================================================== Currency APIs ===================================================================
Task<ApiResponse<object>> GetCurrencyAsync(Employee loggedInEmployee, Guid tenantId);