leandro 1fcd31080b
All checks were successful
CI/CD Pipeline / Build and Deploy with Docker Compose (pull_request) Successful in 9m37s
feat(sales): refine sales document creation from delivery notes
close #68
2026-06-06 13:54:41 -03:00

124 lines
4.9 KiB
C#

using Domain.Dtos.Sales;
using Domain.Generics;
using System.Net.Http.Json;
namespace phronCare.UIBlazor.Services.Sales.SalesDocuments
{
public sealed class SalesDocumentService : ISalesDocumentService
{
private readonly HttpClient _http;
public SalesDocumentService(HttpClient http)
{
_http = http;
}
public async Task<PagedResult<SalesDocumentSummaryDto>> SearchAsync(SalesDocumentSearchParams searchParams)
{
ArgumentNullException.ThrowIfNull(searchParams);
var queryParams = new List<string>();
void AddParam(string key, string? value)
{
if (!string.IsNullOrWhiteSpace(value))
queryParams.Add($"{key}={Uri.EscapeDataString(value)}");
}
AddParam("customerId", searchParams.CustomerId?.ToString());
AddParam("customerText", searchParams.CustomerText);
AddParam("quoteId", searchParams.QuoteId?.ToString());
AddParam("documentType", searchParams.DocumentType?.ToString());
AddParam("status", searchParams.Status?.ToString());
AddParam("issueDateFrom", searchParams.IssueDateFrom?.ToString("o"));
AddParam("issueDateTo", searchParams.IssueDateTo?.ToString("o"));
AddParam("page", searchParams.Page.ToString());
AddParam("pageSize", searchParams.PageSize.ToString());
var url = "/api/SalesDocument/search";
if (queryParams.Any())
url += "?" + string.Join("&", queryParams);
var result = await _http.GetFromJsonAsync<PagedResult<SalesDocumentSummaryDto>>(url);
return result ?? new PagedResult<SalesDocumentSummaryDto>();
}
public async Task<PagedResult<SalesDocumentDeliveryNoteCandidateDto>> SearchDeliveryNoteCandidatesAsync(
int? customerId,
string? customerText,
string? deliveryNoteNumber,
int? quoteId,
DateTime? issueDateFrom,
DateTime? issueDateTo,
int page = 1,
int pageSize = 50)
{
var queryParams = new List<string>();
void AddParam(string key, string? value)
{
if (!string.IsNullOrWhiteSpace(value))
queryParams.Add($"{key}={Uri.EscapeDataString(value)}");
}
AddParam("customerId", customerId?.ToString());
AddParam("customerText", customerText);
AddParam("deliveryNoteNumber", deliveryNoteNumber);
AddParam("quoteId", quoteId?.ToString());
AddParam("issueDateFrom", issueDateFrom?.ToString("o"));
AddParam("issueDateTo", issueDateTo?.ToString("o"));
AddParam("page", page.ToString());
AddParam("pageSize", pageSize.ToString());
var url = "/api/SalesDocument/delivery-note-candidates";
if (queryParams.Any())
url += "?" + string.Join("&", queryParams);
var result = await _http.GetFromJsonAsync<PagedResult<SalesDocumentDeliveryNoteCandidateDto>>(url);
return result ?? new PagedResult<SalesDocumentDeliveryNoteCandidateDto>();
}
public async Task<SalesDocumentDto> CreateFromDeliveryNotesAsync(SalesDocumentCreateFromDeliveryNotesRequest request)
{
ArgumentNullException.ThrowIfNull(request);
var response = await _http.PostAsJsonAsync("/api/SalesDocument/from-delivery-notes", request);
if (!response.IsSuccessStatusCode)
{
var serverMessage = await response.Content.ReadAsStringAsync();
throw new Exception(string.IsNullOrWhiteSpace(serverMessage)
? "No se pudo crear el Sales Document desde remitos."
: serverMessage);
}
var result = await response.Content.ReadFromJsonAsync<SalesDocumentDto>();
return result ?? throw new Exception("Respuesta vacía del servidor.");
}
public async Task<SalesDocumentDto?> GetByIdAsync(int id)
{
return await _http.GetFromJsonAsync<SalesDocumentDto>($"/api/SalesDocument/{id}");
}
public async Task<SalesDocumentDto> CreateAsync(SalesDocumentCreateRequest request)
{
ArgumentNullException.ThrowIfNull(request);
var response = await _http.PostAsJsonAsync("/api/SalesDocument", request);
if (!response.IsSuccessStatusCode)
{
var serverMessage = await response.Content.ReadAsStringAsync();
throw new Exception(string.IsNullOrWhiteSpace(serverMessage)
? "No se pudo crear el Sales Document."
: serverMessage);
}
var result = await response.Content.ReadFromJsonAsync<SalesDocumentDto>();
return result ?? throw new Exception("Respuesta vacía del servidor.");
}
}
}