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