public void Build_FeeCarrier(decimal totalPrice, decimal totalVat, decimal expectedPrice, decimal expectedVat)
        {
            var fee = new FeeCarrier
            {
                // We assume the TotalPrice was rounded by OrderTotalCalculator
                TotalAmount    = totalPrice,
                TotalVATAmount = totalVat
            };
            var paymentInfoID = Guid.NewGuid();

            var result = PaymentInfoRowBuilder.Build(fee, paymentInfoID, 1);

            Assert.Equal(expectedPrice, result.TotalPrice);
            Assert.Equal(expectedVat, result.TotalVatAmount);
        }
        public void Build_DeliveryCarrier_WithDescription(decimal totalPrice, decimal totalVat, decimal expectedPrice, decimal expectedVat)
        {
            var delivery = new DeliveryCarrier
            {
                // We assume the TotalPrice was rounded by OrderTotalCalculator
                TotalDeliveryCost = totalPrice,
                TotalVATAmount    = totalVat
            };
            var paymentInfoID = Guid.NewGuid();

            var result = PaymentInfoRowBuilder.Build(delivery, "description", paymentInfoID, 1);

            Assert.Equal(expectedPrice, result.TotalPrice);
            Assert.Equal(expectedVat, result.TotalVatAmount);
            Assert.Equal("description", result.Description);
        }
        public void Build_OrderRowCarrier(decimal totalPrice, decimal totalVat, decimal expectedPrice, decimal expectedVat)
        {
            var row = new OrderRowCarrier
            {
                // We assume the TotalPrice was rounded by OrderTotalCalculator
                TotalPrice     = totalPrice,
                TotalVATAmount = totalVat,
                VATPercentage  = 0.19m
            };
            var paymentInfoID = Guid.NewGuid();

            var result = PaymentInfoRowBuilder.Build(row, paymentInfoID, 1);

            Assert.Equal(expectedPrice, result.TotalPrice);
            Assert.Equal(expectedVat, result.TotalVatAmount);
        }
        public virtual IEnumerable <PaymentInfoCarrier> Create(OrderCarrier orderCarrier, SecurityToken token)
        {
            var pi = orderCarrier.PaymentInfo.Where(r => !r.CarrierState.IsMarkedForDeleting).FirstOrDefault();

            if (pi == null)
            {
                return(new PaymentInfoCarrier[0]);
            }

            foreach (var row in pi.Rows.Where(r => !r.CarrierState.IsMarkedForCreating))
            {
                row.CarrierState.IsMarkedForDeleting = true;
            }
            pi.Rows.RemoveAll(r => r.CarrierState.IsMarkedForCreating);

            int index = 1;

            pi.Rows.AddRange(orderCarrier.OrderRows.Select(r => PaymentInfoRowBuilder.Build(r, pi.ID, index++)));
            pi.Rows.AddRange(orderCarrier.Deliveries.Select(r => Build(r, pi.ID, index++, orderCarrier.ChannelID)));
            pi.Rows.AddRange(orderCarrier.Fees.Select(r => PaymentInfoRowBuilder.Build(r, pi.ID, index++)));

            var leftForDiscount = GetOrderTotal(orderCarrier);

            foreach (var discount in orderCarrier.OrderDiscounts)
            {
                var row = PaymentInfoRowBuilder.Build(discount, pi.ID, index++);

                decimal discountAmount = discount.DiscountAmount;
                if (discount.DiscountAmount > leftForDiscount)
                {
                    discountAmount     = Math.Min(leftForDiscount, discount.DiscountAmount);
                    row.TotalPrice     = Math.Abs(discountAmount) * -1;
                    row.TotalVatAmount = row.TotalPrice * discount.VATPercentage;
                }

                leftForDiscount = leftForDiscount + row.TotalPrice;

                pi.Rows.Add(row);
            }

            return(new PaymentInfoCarrier[] { pi });
        }
        private PaymentInfoRowCarrier Build(DeliveryCarrier delivery, Guid paymentInfoId, int index, Guid channelId)
        {
            var description = deliveryMethodService.GetPaymentInfoDescription(delivery.DeliveryMethodID, channelId);

            return(PaymentInfoRowBuilder.Build(delivery, description, paymentInfoId, index));
        }