diff --git a/Distribution/Features/Payment/PaymentDTOs.cs b/Distribution/Features/Payment/PaymentDTOs.cs index 20b886f..1a9eb55 100644 --- a/Distribution/Features/Payment/PaymentDTOs.cs +++ b/Distribution/Features/Payment/PaymentDTOs.cs @@ -5,6 +5,9 @@ namespace Distribution.Features.Payment; public record CreatePaymentRequest( decimal Amount, PaymentMethod Method, + EntryMode EntryMode = EntryMode.RealTime, + string? ChequeNumber = null, + DateTime? ChequeDate = null, Guid? CollectedByUserId = null); public record PaymentResponse( @@ -12,6 +15,10 @@ public record PaymentResponse( Guid InvoiceId, decimal Amount, PaymentMethod Method, + EntryMode EntryMode, + string? ChequeNumber, + DateTime? ChequeDate, DateTime CollectedAt, Guid CollectedBy, + Guid? RecordedBy, DateTime CreatedAt); diff --git a/Distribution/Features/Payment/PaymentService.cs b/Distribution/Features/Payment/PaymentService.cs index 43a9e5d..f20e7b0 100644 --- a/Distribution/Features/Payment/PaymentService.cs +++ b/Distribution/Features/Payment/PaymentService.cs @@ -12,7 +12,8 @@ public class PaymentService( ICurrentUserService currentUser) { private static PaymentResponse ToResponse(Models.Payment p) => - new(p.Id, p.FK_InvoiceId, p.Amount, p.Method, p.CollectedAt, p.CollectedBy, p.CreatedAt); + new(p.Id, p.FK_InvoiceId, p.Amount, p.Method, p.EntryMode, p.ChequeNumber, p.ChequeDate, + p.CollectedAt, p.CollectedBy, p.RecordedBy, p.CreatedAt); public async Task?> GetByInvoiceIdAsync(Guid invoiceId) { @@ -30,16 +31,28 @@ public class PaymentService( if (invoice.Status == InvoiceStatus.Finalized) throw new InvalidOperationException("Cannot record a payment against a finalized invoice"); - var userId = currentUser.UserId ?? request.CollectedByUserId + if (request.Method == PaymentMethod.Cheque && + (string.IsNullOrWhiteSpace(request.ChequeNumber) || request.ChequeDate is null)) + throw new InvalidOperationException("ChequeNumber and ChequeDate are required when Method is Cheque"); + + var recorderId = currentUser.UserId ?? request.CollectedByUserId ?? throw new InvalidOperationException("CollectedByUserId is required while auth is unavailable"); + var collectedBy = request.CollectedByUserId ?? recorderId; + var recordedBy = request.EntryMode == EntryMode.DayEndManual && collectedBy != recorderId + ? recorderId + : (Guid?)null; var payment = new Models.Payment { FK_InvoiceId = invoiceId, Amount = request.Amount, Method = request.Method, + EntryMode = request.EntryMode, + ChequeNumber = request.Method == PaymentMethod.Cheque ? request.ChequeNumber : null, + ChequeDate = request.Method == PaymentMethod.Cheque ? request.ChequeDate : null, CollectedAt = DateTime.Now, - CollectedBy = userId + CollectedBy = collectedBy, + RecordedBy = recordedBy }; await uow.BeginAsync(ct);