use of com.ncedu.fooddelivery.api.v1.entities.productPosition.ProductPosition in project 2021-msk-food-delivery by netcracker-edu.
the class OrderServiceTest method getFakeProductPositions.
private List<ProductPosition> getFakeProductPositions() {
List<Product> fakeProducts = getFakeProducts();
Warehouse fakeWarehouse = getFakeWarehouse1();
Date d1 = new Date();
cal.setTime(d1);
cal.add(Calendar.DATE, -10);
d1.setTime(cal.getTime().getTime());
Date d2 = new Date();
cal.setTime(d2);
cal.add(Calendar.DATE, -1);
d2.setTime(cal.getTime().getTime());
Date d3 = new Date();
cal.setTime(d3);
cal.add(Calendar.DATE, -40);
d3.setTime(cal.getTime().getTime());
ProductPosition ps1 = new ProductPosition(1L, fakeProducts.get(0), fakeWarehouse, "AAA", 5, 3, d1, new BigDecimal(10000.0), "ИП ИВАНОВ", true, d1);
ps1.setId(1L);
ProductPosition ps2 = new ProductPosition(1L, fakeProducts.get(0), fakeWarehouse, "AAA", 5, 3, d2, new BigDecimal(10000.0), "ИП ИВАНОВ", true, d2);
ps2.setId(2L);
ProductPosition ps3 = new ProductPosition(2L, fakeProducts.get(1), fakeWarehouse, "AAA", 5, 3, d1, new BigDecimal(10000.0), "ИП ПЕТРОВ", true, d1);
ps3.setId(3L);
ProductPosition ps4 = new ProductPosition(2L, fakeProducts.get(1), fakeWarehouse, "AAA", 10, 8, d2, new BigDecimal(10000.0), "ИП ПЕТРОВ", true, d2);
ps4.setId(4L);
ProductPosition ps5 = new ProductPosition(3L, fakeProducts.get(2), fakeWarehouse, "AAA", 20, 20, d3, new BigDecimal(10000.0), "ИП ФЕДОРОВ", true, d3);
ps5.setId(5L);
ProductPosition ps6 = new ProductPosition(3L, fakeProducts.get(2), fakeWarehouse, "AAA", 15, 15, d1, new BigDecimal(10000.0), "ИП ФЕДОРОВ", true, d1);
ps6.setId(6L);
return new ArrayList<>(Arrays.asList(ps1, ps2, ps3, ps4, ps5, ps6));
}
use of com.ncedu.fooddelivery.api.v1.entities.productPosition.ProductPosition in project 2021-msk-food-delivery by netcracker-edu.
the class OrderServiceTest method countOrderCostSuccessfulTest.
@Test
public void countOrderCostSuccessfulTest() {
WarehouseInfoDTO fakeWarehouseInfoDTO = getFakeWarehouseInfoDTO();
List<Product> fakeProducts = getFakeProducts();
List<ProductPosition> fakePositions = getFakeProductPositions();
Mockito.when(courierRepo.countWorkingCouriersByWarehouse(Mockito.any(Long.class))).thenReturn((short) 100);
Mockito.when(courierRepo.countDeliveringCouriersByWarehouse(Mockito.any(Long.class))).thenReturn((short) 100);
Mockito.when(warehouseService.getNearestWarehouse(Mockito.any(BigDecimal.class), Mockito.any(BigDecimal.class))).thenReturn(fakeWarehouseInfoDTO);
Mockito.when(productPositionRepo.findByProductIdAndWarehouseIdWithLock(1L, 1L)).thenReturn(Arrays.asList(fakePositions.get(0), fakePositions.get(1)));
Mockito.when(productPositionRepo.findByProductIdAndWarehouseIdWithLock(2L, 1L)).thenReturn(Arrays.asList(fakePositions.get(2), fakePositions.get(3)));
Mockito.when(productPositionRepo.findByProductIdAndWarehouseIdWithLock(3L, 1L)).thenReturn(Arrays.asList(fakePositions.get(4), fakePositions.get(5)));
Mockito.when(productRepo.findById(1l)).thenReturn(Optional.of(fakeProducts.get(0)));
Mockito.when(productRepo.findById(2l)).thenReturn(Optional.of(fakeProducts.get(1)));
Mockito.when(productRepo.findById(3l)).thenReturn(Optional.of(fakeProducts.get(2)));
HashMap<Long, Integer> fakeHashMap = new HashMap<>();
fakeHashMap.put(1L, 2);
fakeHashMap.put(2L, 3);
fakeHashMap.put(3L, 5);
Double[] res = orderService.countOrderCost(getFakeCoordsDTO(), fakeHashMap, 1L);
Assertions.assertEquals(res[0], 760.0);
Assertions.assertEquals(res[1], 20.0);
Assertions.assertEquals(res[2], 2.0);
Mockito.verify(courierRepo, Mockito.times(1)).countWorkingCouriersByWarehouse(1L);
Mockito.verify(courierRepo, Mockito.times(1)).countDeliveringCouriersByWarehouse(1L);
Mockito.verify(productPositionRepo, Mockito.times(3)).findByProductIdAndWarehouseIdWithLock(Mockito.any(Long.class), Mockito.eq(1L));
Mockito.verify(warehouseService, Mockito.times(1)).getNearestWarehouse(Mockito.any(BigDecimal.class), Mockito.any(BigDecimal.class));
}
use of com.ncedu.fooddelivery.api.v1.entities.productPosition.ProductPosition in project 2021-msk-food-delivery by netcracker-edu.
the class ProductPositionServiceTest method updatePaymentStatusNullTest.
@Test
public void updatePaymentStatusNullTest() {
List<Long> mockIds = new ArrayList<>(Arrays.asList(1L, null, 3L));
ProductPosition mockProductPosition = Mockito.mock(ProductPosition.class);
when(productPositionRepo.findById(any(Long.class))).thenReturn(Optional.of(mockProductPosition));
boolean res = productPositionService.updatePaymentStatus(mockIds);
verify(productPositionRepo, times(1)).findById(any(Long.class));
verify(mockProductPosition, times(0)).setIsInvoicePaid(true);
verify(productPositionRepo, times(0)).save(mockProductPosition);
assertFalse(res);
}
use of com.ncedu.fooddelivery.api.v1.entities.productPosition.ProductPosition in project 2021-msk-food-delivery by netcracker-edu.
the class OrderServiceImpl1 method reserveProductPositions.
private void reserveProductPositions(List<ProductPosition> productPositions, Integer requestedAmount, Map<Long, Double> productPosPriceMap, Map<Long, Integer> productPosAmountMap) {
Product product = productPositions.get(0).getProduct();
Double productCost = product.getPrice() - product.getDiscount();
Integer ship = 0;
for (int i = 0; i < productPositions.size() && !ship.equals(requestedAmount); i++) {
ProductPosition currentPos = productPositions.get(i);
if ((requestedAmount - ship) <= currentPos.getCurrentAmount()) {
currentPos.setCurrentAmount(currentPos.getCurrentAmount() - (requestedAmount - ship));
productPositionRepo.save(currentPos);
productPosAmountMap.put(currentPos.getId(), requestedAmount - ship);
productPosPriceMap.put(currentPos.getId(), (requestedAmount - ship) * productCost);
break;
} else {
ship += currentPos.getCurrentAmount();
productPosAmountMap.put(currentPos.getId(), currentPos.getCurrentAmount());
productPosPriceMap.put(currentPos.getId(), productCost * (currentPos.getCurrentAmount()));
currentPos.setCurrentAmount(0);
productPositionRepo.save(currentPos);
}
}
}
use of com.ncedu.fooddelivery.api.v1.entities.productPosition.ProductPosition in project 2021-msk-food-delivery by netcracker-edu.
the class OrderServiceImpl1 method countOrderCost.
@Override
public CountOrderCostResponseDTO countOrderCost(CountOrderCostRequestDTO dto) {
WarehouseInfoDTO warehouse = warehouseService.getNearestWarehouse(dto.getGeo().getLat(), dto.getGeo().getLon());
if (warehouse == null)
throw new NotFoundEx(String.format("{Lat: %s; lon: %s}", dto.getGeo().getLat().toString(), dto.getGeo().getLon().toString()));
Long warehouseId = warehouse.getId();
if (!warehouseId.equals(dto.getWarehouseId()))
throw new WarehouseCoordsBindingEx();
Map<Long, Integer> productsAvailableAmounts = new HashMap<>();
Double overallOrderCost = 0.0;
Double overallOrderDiscount = 0.0;
Double orderHighDemandCoeff;
boolean enoughProductPositions = true;
for (Map.Entry<Long, Integer> pair : dto.getProductAmountPairs().entrySet()) {
Long productId = pair.getKey();
Integer requestedAmount = pair.getValue();
List<ProductPosition> productPositions = productPositionRepo.findByProductIdAndWarehouseId(productId, warehouseId);
// filtering expired product positions
productPositions = productPositions.stream().filter(new Predicate<ProductPosition>() {
@Override
public boolean test(ProductPosition productPosition) {
Short expirationDays = productPosition.getProduct().getExpirationDays();
Date manufactureDate = productPosition.getManufactureDate();
Calendar c = Calendar.getInstance();
c.setTime(manufactureDate);
c.add(Calendar.DATE, expirationDays);
if (c.before(Calendar.getInstance()))
return false;
return true;
}
}).collect(Collectors.toList());
Integer overallAmount = 0;
for (ProductPosition pos : productPositions) {
overallAmount += pos.getCurrentAmount();
}
if (overallAmount < requestedAmount) {
productsAvailableAmounts.put(productId, overallAmount);
enoughProductPositions = false;
}
if (enoughProductPositions) {
// product price count
Product product = productRepo.findById(productId).get();
Double productDiscount = product.getDiscount();
Double productPrice = product.getPrice();
overallOrderCost += requestedAmount * (productPrice - productDiscount);
overallOrderDiscount += productDiscount * requestedAmount;
}
}
if (!enoughProductPositions) {
throw new ProductAvailabilityEx(productsAvailableAmounts);
}
orderHighDemandCoeff = countHighDemandCoeff(warehouseId);
overallOrderCost = Math.round(overallOrderCost * orderHighDemandCoeff * 100.0) / 100.0;
return new CountOrderCostResponseDTO(overallOrderCost, overallOrderDiscount, orderHighDemandCoeff);
}
Aggregations