using Books.Api.Domain.Invoices; using EventFlow.Commands; namespace Books.Api.Commands.Invoices; public class CreateInvoiceCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, CreateInvoiceCommand command, CancellationToken cancellationToken) { aggregate.Create( command.CompanyId, command.FiscalYearId, command.CustomerId, command.CustomerName, command.CustomerNumber, command.InvoiceNumber, command.InvoiceDate, command.DueDate, command.PaymentTermsDays, command.Currency, command.VatCode, command.Notes, command.Reference, command.CreatedBy); return Task.CompletedTask; } } public class AddInvoiceLineCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, AddInvoiceLineCommand command, CancellationToken cancellationToken) { aggregate.AddLine( command.Description, command.Quantity, command.UnitPrice, command.VatCode, command.AccountId, command.Unit, command.DiscountPercent); return Task.CompletedTask; } } public class UpdateInvoiceLineCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, UpdateInvoiceLineCommand command, CancellationToken cancellationToken) { aggregate.UpdateLine( command.LineNumber, command.Description, command.Quantity, command.UnitPrice, command.VatCode, command.AccountId, command.Unit, command.DiscountPercent); return Task.CompletedTask; } } public class RemoveInvoiceLineCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, RemoveInvoiceLineCommand command, CancellationToken cancellationToken) { aggregate.RemoveLine(command.LineNumber); return Task.CompletedTask; } } public class MarkInvoiceSentCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, MarkInvoiceSentCommand command, CancellationToken cancellationToken) { aggregate.Send( command.LedgerTransactionId, command.SentBy); return Task.CompletedTask; } } public class ReceiveInvoicePaymentCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, ReceiveInvoicePaymentCommand command, CancellationToken cancellationToken) { aggregate.ReceivePayment( command.Amount, command.BankTransactionId, command.LedgerTransactionId, command.PaymentReference, command.PaymentDate, command.RecordedBy); return Task.CompletedTask; } } public class VoidInvoiceCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, VoidInvoiceCommand command, CancellationToken cancellationToken) { aggregate.Void( command.Reason, command.ReversalLedgerTransactionId, command.VoidedBy); return Task.CompletedTask; } } // ===================================================== // CREDIT NOTE COMMAND HANDLERS // ===================================================== public class CreateCreditNoteCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, CreateCreditNoteCommand command, CancellationToken cancellationToken) { aggregate.CreateCreditNote( command.CompanyId, command.FiscalYearId, command.CustomerId, command.CustomerName, command.CustomerNumber, command.CreditNoteNumber, command.CreditNoteDate, command.Currency, command.VatCode, command.Notes, command.Reference, command.CreatedBy, command.OriginalInvoiceId, command.OriginalInvoiceNumber, command.CreditReason); return Task.CompletedTask; } } public class IssueCreditNoteCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, IssueCreditNoteCommand command, CancellationToken cancellationToken) { aggregate.Issue( command.LedgerTransactionId, command.IssuedBy); return Task.CompletedTask; } } public class ApplyCreditNoteCommandHandler : CommandHandler { public override Task ExecuteAsync( InvoiceAggregate aggregate, ApplyCreditNoteCommand command, CancellationToken cancellationToken) { aggregate.ApplyCredit( command.TargetInvoiceId, command.TargetInvoiceNumber, command.Amount, command.AppliedDate, command.AppliedBy, command.LedgerTransactionId); return Task.CompletedTask; } }