public async Task CreatePayment(Guid paymentId, Guid addressId, IEnumerable <RegisteredUsage> registeredUsages) { var payment = _aggregateFactory.Create(new PaymentFactoryInput() { AddressId = addressId, PaymentId = paymentId }); var lastUsage = (await _serviceClient.GetLastUsageForAddress(payment.AddressId))?.ToList(); var address = await _addresRepository.Get(addressId); if (address == null) { throw new AddressNotFoundException(addressId.ToString()); } if (address.RentId.HasValue) { var rent = await _rentRepository.Get(address.RentId.Value); if (rent == null) { throw new RentNotFoundException(address.RentId.ToString()); } foreach (var rentItem in rent.RentItems) { switch (rentItem.RentUnit) { case RentUnit.Person: payment.AddPaymentItem(new PaymentItem(rentItem.Description, rentItem.AmountPerUnit * address.Persons)); break; case RentUnit.SquareMeter: payment.AddPaymentItem(new PaymentItem(rentItem.Description, rentItem.AmountPerUnit * new decimal(address.SquareMeters))); break; case RentUnit.Constant: payment.AddPaymentItem(new PaymentItem(rentItem.Description, rentItem.AmountPerUnit)); break; } } } foreach (var registeredUsage in registeredUsages) { var registrator = await _registratorRepository.Get(registeredUsage.MeterId); var registratorDetails = lastUsage.Single(i => i.MeterId == registrator.Id); // TODO autonomy !! if (!registrator.TariffId.HasValue) { throw new TariffNotAssignedException(registrator.Id.ToString()); } var tariff = await _tariffRepository.Get(registrator.TariffId.Value); if (tariff.Revoked) { throw new TariffRevokedException(tariff.Id.ToString()); } if (tariff.ValidTo.HasValue && DateTime.Now >= tariff.ValidTo) { throw new TariffExpiredException(tariff.Id.ToString()); } var amountToPay = new decimal(registeredUsage.Value) * tariff.TariffValue; PaymentItem item = new PaymentItem($"Stan licznika: {registratorDetails.CurrentRead} m3 ({tariff.Description}) {registrator.Description} - Zużycie : {registratorDetails.Value} m3", amountToPay); //TODO m3 :( payment.AddPaymentItem(item); } _paymentRepository.Add(payment); }