public IEnumerable <IEvent <ProjectTimeAggregateRoot, int> > Execute(DistributeEarningCommand command) { CheckUserBillingRights(command.ProjectId, command.ByUserId); if (command.EarningSum < 0) { throw new ArgumentException("Earning sum must be greater than zero."); } command.Result = new List <InvoiceRecalculationResult>(); var userInvoices = State.Invoices.Where(i => i.InvoiceNum == command.InvoiceNum); if (!userInvoices.Any()) { throw new ArgumentException("Invoice number is not valid: invoice either cancelled or not exists."); } var totalSum = userInvoices.Sum(i => i.Sum); if (command.EarningSum > totalSum) { throw new ArgumentException(String.Format("Sum must be less than or equal to {0}", totalSum)); } command.Result = userInvoices.Select(ui => new InvoiceRecalculationResult { UserId = ui.UserId, BillingHours = ui.Hours, MaxHours = ui.Hours, Sum = command.EarningSum * ui.Sum / totalSum }).ToList(); var events = userInvoices.Select(ui => new InvoiceEvent { At = DateTimeOffset.Now, EventType = InvoiceEventType.EarningDistribution, Hours = ui.Hours, InvoiceNum = ui.InvoiceNum, InvoiceSum = command.EarningSum * ui.Sum / totalSum, ProjectId = command.ProjectId, UserId = ui.UserId, RegisteredAt = DateTimeOffset.Now, RegisteredByUserId = command.ByUserId }); command.Result = events.Select(e => new InvoiceRecalculationResult { UserId = e.UserId, BillingHours = e.Hours, MaxHours = e.Hours, Sum = e.InvoiceSum }).ToList(); return(events); }
public List <InvoiceRecalculationResult> DistributeInvoiceEarnings(int projectId, string invoiceNum, decimal earningsSum) { var command = new DistributeEarningCommand { ByUserId = _currentUser.Id, EarningSum = earningsSum, InvoiceNum = invoiceNum, ProjectId = projectId }; _cqrs.Execute(command); return(command.Result); }