From e0bc38d62604d8092ea2660edf711fc56218547c Mon Sep 17 00:00:00 2001 From: leandro Date: Mon, 23 Mar 2026 12:08:57 -0300 Subject: [PATCH] feat(sales): add delivery note issue core method closes #35 --- Core/Interfaces/IDeliveryNoteDom.cs | 5 ++++ Core/Services/DeliveryNoteService.cs | 40 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) 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 + }); + } } }