Пример #1
0
        /// <summary>
        /// Creert een order uit het gegeven viewmodel
        /// </summary>
        /// <param name="dto">Viewmodel met de nodige data voor het aanmaken van een nieuw order</param>
        /// <returns>Nieuw aangemaakt order</returns>
        /// <exception cref="EntityNotFoundException">Wordt gegooid wanneer een persoon in het order of in een orderline niet gevonden werd.</exception>
        public async Task <Order> CreateOrder(CreateOrderDTO dto, string userEmail)
        {
            var orderedBy = await _leidingRepository.FindByEmailAsync(userEmail);

            if (orderedBy == null)
            {
                throw new EntityNotFoundException($"Besteller '{userEmail}' werd niet gevonden.");
            }

            var newOrder = Order.Create(orderedBy);

            await _orderRepository.AddAsync(newOrder);

            foreach (var lineModel in dto.Orderlines)
            {
                var drank = await _drankRepository.FindByIdAsync(lineModel.DrankId);

                if (drank == null)
                {
                    throw new EntityNotFoundException($"Drank met id {lineModel.DrankId} werd niet gevonden");
                }

                var orderedFor = await _leidingRepository.FindByIdAsync(lineModel.OrderedForId);

                if (orderedFor == null)
                {
                    throw new EntityNotFoundException($"Persoon met id {lineModel.OrderedForId} werd niet gevonden.");
                }

                var personCanOrder = orderedFor.Tak.TabIsAllowed;

                if (!personCanOrder)
                {
                    throw new InvalidOperationException($"Leden van {orderedFor.Tak.Naam} kunnen geen gebruik maken van de Poef.");
                }

                var orderline = Orderline.Create(drank, orderedFor, newOrder, lineModel.Quantity);


                await _orderlineRepository.AddAsync(orderline);

                //Create a transaction for the submitted order
                var amount = orderline.DrinkPrice * orderline.Quantity;
                amount = -amount;
                var transaction = new Transaction(amount, $"{orderline.Quantity}x {orderline.Drank.Naam}");

                var account = await _accountRepository.FindAccountAsync(orderedFor.Id, AccountType.Tab);

                if (account == null)
                {
                    account = await _accountService.CreateAccountAsync(orderedFor.Id);
                }

                account.AddTransaction(transaction);
            }

            await _orderRepository.SaveChangesAsync();

            return(newOrder);
        }
Пример #2
0
        public async Task <Drank> GetDrankById(int drankId)
        {
            var drank = await _drankRepository.FindByIdAsync(drankId);

            if (drank == null)
            {
                throw new EntityNotFoundException($"Drank met id {drankId} werd niet gevonden.");
            }

            return(drank);
        }