diff --git a/Core/Interfaces/IDeliveryNoteDom.cs b/Core/Interfaces/IDeliveryNoteDom.cs index e63f606..bbeff1e 100644 --- a/Core/Interfaces/IDeliveryNoteDom.cs +++ b/Core/Interfaces/IDeliveryNoteDom.cs @@ -49,4 +49,9 @@ public interface IDeliveryNoteDom /// Puede estar vacía si no existen registros. /// Task> GetDtosByQuoteIdAsync(int quoteId); + + /// + /// Valida y prepara la emisión de un Delivery Note. + /// + Task CreateAndIssueDeliveryNoteAsync(DeliveryNoteCreateRequest request); } diff --git a/Core/Services/DeliveryNoteService.cs b/Core/Services/DeliveryNoteService.cs index 6b4894b..75c7cd9 100644 --- a/Core/Services/DeliveryNoteService.cs +++ b/Core/Services/DeliveryNoteService.cs @@ -1,5 +1,6 @@ using Core.Interfaces; using Domain.Dtos.Sales; +using Domain.Entities; using Domain.Generics; using Models.Interfaces; @@ -60,5 +61,44 @@ namespace Core.Services return _deliveryNoteRepository.GetDtosByQuoteIdAsync(quoteId); } + + public Task CreateAndIssueDeliveryNoteAsync(DeliveryNoteCreateRequest request) + { + ArgumentNullException.ThrowIfNull(request); + + if (string.IsNullOrWhiteSpace(request.DeliveryNoteNumber)) + throw new ArgumentException("El número de remito es obligatorio.", nameof(request.DeliveryNoteNumber)); + + if (request.CustomerId <= 0) + throw new ArgumentException("Debe seleccionar un cliente.", nameof(request.CustomerId)); + + if (request.IssueDate == default) + throw new ArgumentException("La fecha de emisión es obligatoria.", nameof(request.IssueDate)); + + if (request.Items is null || request.Items.Count == 0) + throw new InvalidOperationException("Debe incluir al menos un ítem."); + + if (request.Items.Any(i => i.Quantity <= 0)) + throw new InvalidOperationException("Todas las cantidades deben ser mayores a cero."); + + if (request.Items.Any(i => string.IsNullOrWhiteSpace(i.Description))) + throw new InvalidOperationException("Todos los ítems deben incluir descripción."); + + var entity = new EDeliveryNote + { + DeliveryNoteNumber = request.DeliveryNoteNumber.Trim(), + QuoteId = request.QuoteId, + IssueDate = request.IssueDate, + CustomerId = request.CustomerId, + Observations = request.Observations, + ExtraInfoJson = request.ExtraInfoJson + }; + + return Task.FromResult(new DeliveryNoteCreateResponse + { + Id = entity.Id, + DeliveryNoteNumber = entity.DeliveryNoteNumber + }); + } } }