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); }
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); }