public async Task <Bill> CreateDomainBill(BillInfoAM billInfo, BasketAM basket)
        {
            var bill = await CalculateBill(billInfo, basket);

            var domainBasket = await DomainBasketService.Create(
                basket.KmValue,
                basket.LoadingValue,
                basket.LockedSteeringValue,
                basket.LockedWheelsValue,
                basket.OverturnedValue,
                basket.DitchValue);

            var domainBill = await DomainBillService.Create(
                billInfo.PriceId,
                domainBasket.Id,
                billInfo.CommissionPercentage,
                billInfo.DegreeOfDifficulty);

            foreach (var item in bill.Items)
            {
                await CreateDomainBillItem(domainBill.Id, item);
            }

            // обновим счет, т.к. только после добавления элеметов счета у него появится итоговая стоимость
            domainBill = await DomainBillService.Get(domainBill.Id);

            if (domainBill.TotalCost != bill.TotalCost)
            {
                throw new ArgumentException(
                          $"TotalCost:{domainBill.TotalCost} of domain bill isn't equal TotalCost:{bill.TotalCost} of calculated bill",
                          "TotalCost");
            }

            return(domainBill);
        }
        public async Task <BillAM> CalculateBill(BillInfoAM billInfo, BasketAM basket)
        {
            var domainPrice = await PricelistService.GetDomainPrice(billInfo.PriceId);

            if (domainPrice == null)
            {
                throw new EntityNotFoundException($"PriceId:{billInfo.PriceId} doesn't exist", "Price");
            }

            var result = new BillAM
            {
                Info = billInfo
            };

            if (basket.KmValue > 0)
            {
                var billItem = await CalculateBillItem(BillItem.KmBillKey, basket.KmValue, domainPrice.PerKm, billInfo.DegreeOfDifficulty);

                result.Items.Add(billItem);
            }

            if (basket.LoadingValue > 0)
            {
                var billItem = await CalculateBillItem(BillItem.LoadingBillKey, basket.LoadingValue, domainPrice.Loading, billInfo.DegreeOfDifficulty);

                result.Items.Add(billItem);
            }

            if (basket.LockedSteeringValue > 0)
            {
                var billItem = await CalculateBillItem(BillItem.LockedSteeringKey, basket.LockedSteeringValue, domainPrice.LockedSteering, billInfo.DegreeOfDifficulty);

                result.Items.Add(billItem);
            }

            if (basket.LockedWheelsValue > 0)
            {
                var billItem = await CalculateBillItem(BillItem.LockedWheelsKey, basket.LockedWheelsValue, domainPrice.LockedWheel, billInfo.DegreeOfDifficulty);

                result.Items.Add(billItem);
            }

            if (basket.OverturnedValue > 0)
            {
                var billItem = await CalculateBillItem(BillItem.OverturnedKey, basket.OverturnedValue, domainPrice.Overturned, billInfo.DegreeOfDifficulty);

                result.Items.Add(billItem);
            }

            if (basket.DitchValue > 0)
            {
                var billItem = await CalculateBillItem(BillItem.DitchKey, basket.DitchValue, domainPrice.Ditch, billInfo.DegreeOfDifficulty);

                result.Items.Add(billItem);
            }

            result.TotalCost = result.Items.Select(i => i.Cost).Sum();

            return(result);
        }
Exemplo n.º 3
0
        public async Task CalculateBillWhenPriceDoesNotExist()
        {
            var domainPriceId = 1;

            var billInfo = new BillInfoAM
            {
                PriceId = domainPriceId
            };

            var basket = new BasketAM();

            Suite.PricelistServiceMock
            .Setup(m => m.GetDomainPrice(billInfo.PriceId))
            .Returns(Task.FromResult <Price>(null));

            await Assert.ThrowsAsync <EntityNotFoundException>("Price", () => Suite.BillService.CalculateBill(billInfo, basket));
        }
Exemplo n.º 4
0
        public async Task CalculateBillWhenInBasketOnlyKmAndLoading()
        {
            var domainPrice = new Price
            {
                Id             = 123,
                PerKm          = 40m,
                Loading        = 900m,
                LockedSteering = 400m,
                LockedWheel    = 300m,
                Overturned     = 1500m,
                Ditch          = 1000m
            };

            var billInfo = new BillInfoAM
            {
                PriceId = domainPrice.Id,
                CommissionPercentage = 10,
                DegreeOfDifficulty   = 1.2f
            };

            var basket = new BasketAM
            {
                LockedWheelsValue   = 0,
                KmValue             = 200,
                LoadingValue        = 1,
                DitchValue          = 0,
                OverturnedValue     = 0,
                LockedSteeringValue = 0
            };

            Suite.PricelistServiceMock
            .Setup(m => m.GetDomainPrice(billInfo.PriceId))
            .ReturnsAsync(domainPrice);

            var result = await Suite.BillService.CalculateBill(billInfo, basket);

            Assert.Equal(billInfo, result.Info);
            Assert.Equal(2, result.Items.Count);
        }
Exemplo n.º 5
0
        public async Task CreateDomainBill()
        {
            var commonId = 1;

            var billInfo = new BillInfoAM
            {
                PriceId = 123,
                CommissionPercentage = 10,
                DegreeOfDifficulty   = 1
            };

            var basket = new BasketAM
            {
                LockedWheelsValue   = 1,
                KmValue             = 200,
                DitchValue          = 1,
                LoadingValue        = 1,
                OverturnedValue     = 1,
                LockedSteeringValue = 1
            };

            var domainBasket = new Basket {
                Id = commonId++
            };
            var domainBill = new Bill
            {
                Id      = commonId++,
                PriceId = billInfo.PriceId,
                CommissionPercentage = billInfo.CommissionPercentage,
                DegreeOfDifficulty   = billInfo.DegreeOfDifficulty
            };
            var domainPrice = new Price
            {
                Id             = billInfo.PriceId,
                PerKm          = 40,
                Loading        = 900,
                LockedSteering = 300,
                LockedWheel    = 400,
                Ditch          = 1000,
                Overturned     = 1200
            };

            Suite.DomainBasketServiceMock
            .Setup(m => m.Create(
                       basket.KmValue,
                       basket.LoadingValue,
                       basket.LockedSteeringValue,
                       basket.LockedWheelsValue,
                       basket.OverturnedValue,
                       basket.DitchValue))
            .ReturnsAsync(domainBasket);

            Suite.PricelistServiceMock
            .Setup(m => m.GetDomainPrice(billInfo.PriceId))
            .ReturnsAsync(domainPrice);
            Suite.DomainBillServiceMock
            .Setup(m => m.Create(
                       billInfo.PriceId,
                       domainBasket.Id,
                       billInfo.CommissionPercentage,
                       billInfo.DegreeOfDifficulty))
            .ReturnsAsync(domainBill);
            Suite.DomainBillServiceMock
            .Setup(m => m.Get(domainBill.Id))
            .Returns(() => { domainBill.TotalCost = 11800; return(Task.FromResult(domainBill)); });

            var result = await Suite.BillService.CreateDomainBill(billInfo, basket);

            var perKmPrice = domainPrice.PerKm * (decimal)billInfo.DegreeOfDifficulty;
            var kmCost     = basket.KmValue * perKmPrice;

            Suite.DomainBillItemServiceMock
            .Verify(m => m.Create(
                        domainBill.Id,
                        BillItem.KmBillKey,
                        basket.KmValue,
                        perKmPrice,
                        kmCost));

            var loadingPrice = domainPrice.Loading * (decimal)billInfo.DegreeOfDifficulty;
            var loadingCost  = basket.LoadingValue * loadingPrice;

            Suite.DomainBillItemServiceMock
            .Verify(m => m.Create(
                        domainBill.Id,
                        BillItem.LoadingBillKey,
                        basket.LoadingValue,
                        loadingPrice,
                        loadingCost));

            var lockedSteeringPrice = domainPrice.LockedSteering * (decimal)billInfo.DegreeOfDifficulty;
            var lockedSteeringCost  = basket.LockedSteeringValue * lockedSteeringPrice;

            Suite.DomainBillItemServiceMock
            .Verify(m => m.Create(
                        domainBill.Id,
                        BillItem.LockedSteeringKey,
                        basket.LockedSteeringValue,
                        lockedSteeringPrice,
                        lockedSteeringCost));

            var lockedWheelPrice = domainPrice.LockedWheel * (decimal)billInfo.DegreeOfDifficulty;
            var lockedWheelsCost = basket.LockedWheelsValue * lockedWheelPrice;

            Suite.DomainBillItemServiceMock
            .Verify(m => m.Create(
                        domainBill.Id,
                        BillItem.LockedWheelsKey,
                        basket.LockedWheelsValue,
                        lockedWheelPrice,
                        lockedWheelsCost));

            var overturnedPrice = domainPrice.Overturned * (decimal)billInfo.DegreeOfDifficulty;
            var overturnedCost  = basket.OverturnedValue * overturnedPrice;

            Suite.DomainBillItemServiceMock
            .Verify(m => m.Create(
                        domainBill.Id,
                        BillItem.OverturnedKey,
                        basket.OverturnedValue,
                        overturnedPrice,
                        overturnedCost));

            var ditchPrice = domainPrice.Ditch * (decimal)billInfo.DegreeOfDifficulty;
            var ditchCost  = basket.DitchValue * ditchPrice;

            Suite.DomainBillItemServiceMock
            .Verify(m => m.Create(
                        domainBill.Id,
                        BillItem.DitchKey,
                        basket.DitchValue,
                        ditchPrice,
                        ditchCost));

            // Надо получить счет заного, чтобы в нем была итоговая сумма
            Suite.DomainBillServiceMock
            .Verify(m => m.Get(domainBill.Id));
        }
Exemplo n.º 6
0
        public async Task CalculateBill()
        {
            var domainPrice = new Price
            {
                Id             = 123,
                PerKm          = 40m,
                Loading        = 900m,
                LockedSteering = 400m,
                LockedWheel    = 300m,
                Overturned     = 1500m,
                Ditch          = 1000m
            };

            var billInfo = new BillInfoAM
            {
                PriceId = domainPrice.Id,
                CommissionPercentage = 10,
                DegreeOfDifficulty   = 1.2f
            };

            var basket = new BasketAM
            {
                LockedWheelsValue   = 1,
                KmValue             = 200,
                DitchValue          = 1,
                LoadingValue        = 1,
                OverturnedValue     = 1,
                LockedSteeringValue = 1
            };

            Suite.PricelistServiceMock
            .Setup(m => m.GetDomainPrice(billInfo.PriceId))
            .ReturnsAsync(domainPrice);

            var result = await Suite.BillService.CalculateBill(billInfo, basket);

            Assert.Equal(billInfo, result.Info);
            Assert.Equal(6, result.Items.Count);

            var kmBillItem = result.Items[0];
            var perKmPrice = domainPrice.PerKm * (decimal)billInfo.DegreeOfDifficulty;
            var kmCost     = basket.KmValue * perKmPrice;

            Assert.Equal(BillItem.KmBillKey, kmBillItem.Key);
            Assert.Equal(basket.KmValue, kmBillItem.Value);
            Assert.Equal(perKmPrice, kmBillItem.Price);
            Assert.Equal(kmCost, kmBillItem.Cost);

            var loadingBillItem = result.Items[1];
            var loadingPrice    = domainPrice.Loading * (decimal)billInfo.DegreeOfDifficulty;
            var loadingCost     = basket.LoadingValue * loadingPrice;

            Assert.Equal(BillItem.LoadingBillKey, loadingBillItem.Key);
            Assert.Equal(basket.LoadingValue, loadingBillItem.Value);
            Assert.Equal(loadingPrice, loadingBillItem.Price);
            Assert.Equal(loadingCost, loadingBillItem.Cost);

            var lockedSteeringBillItem = result.Items[2];
            var lockedSteeringPrice    = domainPrice.LockedSteering * (decimal)billInfo.DegreeOfDifficulty;
            var lockedSteeringCost     = basket.LockedSteeringValue * lockedSteeringPrice;

            Assert.Equal(BillItem.LockedSteeringKey, lockedSteeringBillItem.Key);
            Assert.Equal(basket.LockedSteeringValue, lockedSteeringBillItem.Value);
            Assert.Equal(lockedSteeringPrice, lockedSteeringBillItem.Price);
            Assert.Equal(lockedSteeringCost, lockedSteeringBillItem.Cost);

            var lockedWheelBillItem = result.Items[3];
            var lockedWheelPrice    = domainPrice.LockedWheel * (decimal)billInfo.DegreeOfDifficulty;
            var lockedWheelsCost    = basket.LockedWheelsValue * lockedWheelPrice;

            Assert.Equal(BillItem.LockedWheelsKey, lockedWheelBillItem.Key);
            Assert.Equal(basket.LockedWheelsValue, lockedWheelBillItem.Value);
            Assert.Equal(lockedWheelPrice, lockedWheelBillItem.Price);
            Assert.Equal(lockedWheelsCost, lockedWheelBillItem.Cost);

            var overturnedBillItem = result.Items[4];
            var overturnedPrice    = domainPrice.Overturned * (decimal)billInfo.DegreeOfDifficulty;
            var overturnedCost     = basket.OverturnedValue * overturnedPrice;

            Assert.Equal(BillItem.OverturnedKey, overturnedBillItem.Key);
            Assert.Equal(basket.OverturnedValue, overturnedBillItem.Value);
            Assert.Equal(overturnedPrice, overturnedBillItem.Price);
            Assert.Equal(overturnedCost, overturnedBillItem.Cost);

            var ditchBillItem = result.Items[5];
            var ditchPrice    = domainPrice.Ditch * (decimal)billInfo.DegreeOfDifficulty;
            var ditchCost     = basket.DitchValue * ditchPrice;

            Assert.Equal(BillItem.DitchKey, ditchBillItem.Key);
            Assert.Equal(basket.DitchValue, ditchBillItem.Value);
            Assert.Equal(ditchPrice, ditchBillItem.Price);
            Assert.Equal(ditchCost, ditchBillItem.Cost);

            var totalCost = kmCost + loadingCost + lockedSteeringCost + lockedWheelsCost + overturnedCost + ditchCost;

            Assert.Equal(totalCost, result.TotalCost);
        }
Exemplo n.º 7
0
        public async Task CalculateBookingRoute()
        {
            var commonId = 1;

            var rootAddress = new AddressAM
            {
                Locality  = "Ярославль",
                Latitude  = 11.1111,
                Longitude = 22.2222
            };

            var billInfo = new BillInfoAM
            {
                PriceId = commonId++,
                CommissionPercentage = 10,
                DegreeOfDifficulty   = 1
            };

            var basket = new BasketAM
            {
                KmValue             = 0,
                LoadingValue        = 1,
                LockedSteeringValue = 0,
                LockedWheelsValue   = 3,
                OverturnedValue     = 0,
                DitchValue          = 1
            };

            var cargo = new CargoAM
            {
                BrandCatalogItemId  = commonId++,
                KindCatalogItemId   = commonId++,
                RegistrationNumber  = "e111ey777",
                WeightCatalogItemId = commonId++
            };

            var route = new RouteAM
            {
                Legs =
                {
                    new RouteLegAM {
                        Kind = RouteLegKind.Feed, Distance = 3000, Duration = 1200
                    },
                    new RouteLegAM {
                        Kind = RouteLegKind.Transportation, Distance = 100000, Duration = 7200
                    },
                    new RouteLegAM {
                        Kind = RouteLegKind.WayBack, Distance = 103000, Duration = 8400
                    }
                }
            };

            var feedDistance  = route.Legs[0].Distance;
            var feedDuration  = route.Legs[0].Duration;
            var totalDistance = route.Legs.Select(l => l.Distance).Sum();

            var bill = new BillAM {
                TotalCost = 100
            };
            var title = $"{rootAddress.Locality} - {bill.TotalCost}₽";

            Suite.RouteServiceMock
            .Setup(m => m.GetRootAddress(route))
            .Returns(rootAddress);
            Suite.RouteServiceMock
            .Setup(m => m.GetFeedDistance(route))
            .Returns(feedDistance);
            Suite.RouteServiceMock
            .Setup(m => m.GetFeedDuration(route))
            .Returns(feedDuration);
            Suite.RouteServiceMock
            .Setup(m => m.GetTotalDistance(route))
            .Returns(totalDistance);

            Suite.BillServiceMock
            .Setup(m => m.GetBillInfo(
                       It.Is <Coordinate>(c => c.Latitude.Equals(rootAddress.Latitude) && c.Longitude.Equals(rootAddress.Longitude)),
                       cargo.WeightCatalogItemId))
            .ReturnsAsync(billInfo);
            Suite.BillServiceMock
            .Setup(m => m.CalculateBill(
                       billInfo,
                       It.Is <BasketAM>(b => (b != basket) && b.KmValue.Equals(totalDistance))))
            .ReturnsAsync(bill);

            var result = await Suite.BookingService.CalculateBookingRoute(route, cargo, basket);

            Assert.Equal(rootAddress, result.RootAddress);
            Assert.Equal(feedDistance, result.FeedDistance);
            Assert.Equal(feedDuration, result.FeedDuration);
            Assert.Equal(totalDistance, result.TotalDistance);
            Assert.Equal(bill, result.Bill);
            Assert.Equal(title, result.Title);
        }