Пример #1
0
        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);
        }