private void calculateShipping(FulfillmentGroup fulfillmentGroup) { if (!isValidModuleForService(fulfillmentGroup.getService()) && !isDefaultModule()) { LOG.info("fulfillment group (" + fulfillmentGroup.getId() + ") with a service type of (" + fulfillmentGroup.getService() + ") is not valid for this module service type (" + getServiceName() + ")"); return; if (fulfillmentGroup.getFulfillmentGroupItems().size() == 0) { LOG.warn("fulfillment group (" + fulfillmentGroup.getId() + ") does not contain any fulfillment group items. Unable to price banded shipping"); fulfillmentGroup.setShippingPrice(BroadleafCurrencyUtils.getMoney(BigDecimal.ZERO, fulfillmentGroup.getOrder().getCurrency())); fulfillmentGroup.setSaleShippingPrice(BroadleafCurrencyUtils.getMoney(BigDecimal.ZERO, fulfillmentGroup.getOrder().getCurrency())); fulfillmentGroup.setRetailShippingPrice(BroadleafCurrencyUtils.getMoney(BigDecimal.ZERO, fulfillmentGroup.getOrder().getCurrency())); return; Address address = fulfillmentGroup.getAddress(); String state = null; if (StringUtils.isNotBlank(address.getStateProvinceRegion())) { String feeType = feeTypeMapping.get(fulfillmentGroup.getMethod()); String feeSubType = ((feeSubTypeMapping.get(state) == null) ? feeSubTypeMapping.get("ALL") : feeSubTypeMapping.get(state)); for (FulfillmentGroupItem fulfillmentGroupItem : fulfillmentGroup.getFulfillmentGroupItems()) { BigDecimal price = (fulfillmentGroupItem.getRetailPrice() != null) ? fulfillmentGroupItem.getRetailPrice().getAmount().multiply(BigDecimal.valueOf(fulfillmentGroupItem.getQuantity())) : null; if (price == null) { throw new NotImplementedException("Shipping rate " + fulfillmentGroup.getMethod() + " not supported"); fulfillmentGroup.setShippingPrice(BroadleafCurrencyUtils.getMoney(shippingPrice, fulfillmentGroup.getOrder().getCurrency())); fulfillmentGroup.setSaleShippingPrice(fulfillmentGroup.getShippingPrice()); fulfillmentGroup.setRetailShippingPrice(fulfillmentGroup.getSaleShippingPrice());
@Test(groups = "createItemFulfillmentGroup", dataProvider = "basicFulfillmentGroup", dataProviderClass = FulfillmentGroupDataProvider.class, dependsOnGroups = { "createOrder", "createCustomerAddress" }) @Rollback(false) @Transactional public void createDefaultFulfillmentGroup(FulfillmentGroup fulfillmentGroup) { String userName = "customer1"; Customer customer = customerService.readCustomerByUsername(userName); Address address = (customerAddressDao.readActiveCustomerAddressesByCustomerId(customer.getId())).get(0).getAddress(); salesOrder = orderDao.createNewCartForCustomer(customer); FulfillmentGroup newFG = fulfillmentGroupDao.createDefault(); newFG.setAddress(address); newFG.setRetailShippingPrice(fulfillmentGroup.getRetailShippingPrice()); newFG.setMethod(fulfillmentGroup.getMethod()); newFG.setService(fulfillmentGroup.getService()); newFG.setOrder(salesOrder); newFG.setReferenceNumber(fulfillmentGroup.getReferenceNumber()); assert newFG.getId() == null; this.fulfillmentGroup = fulfillmentGroupService.save(newFG); assert this.fulfillmentGroup.getId() != null; }
@Override public FulfillmentGroup calculateCostForFulfillmentGroup(FulfillmentGroup fulfillmentGroup) throws FulfillmentPriceException { if (fulfillmentGroup.getFulfillmentGroupItems().size() == 0) { LOG.warn("fulfillment group (" + fulfillmentGroup.getId() + ") does not contain any fulfillment group items. Unable to price banded shipping"); fulfillmentGroup.setShippingPrice(Money.ZERO); fulfillmentGroup.setSaleShippingPrice(Money.ZERO); fulfillmentGroup.setRetailShippingPrice(Money.ZERO); return fulfillmentGroup; } if (canCalculateCostForFulfillmentGroup(fulfillmentGroup, fulfillmentGroup.getFulfillmentOption())) { //In this case, the estimation logic is the same as calculation logic. Call the estimation service to get the prices. HashSet<FulfillmentOption> options = new HashSet<FulfillmentOption>(); options.add(fulfillmentGroup.getFulfillmentOption()); FulfillmentEstimationResponse response = estimateCostForFulfillmentGroup(fulfillmentGroup, options); fulfillmentGroup.setSaleShippingPrice(response.getFulfillmentOptionPrices().get(fulfillmentGroup.getFulfillmentOption())); fulfillmentGroup.setRetailShippingPrice(response.getFulfillmentOptionPrices().get(fulfillmentGroup.getFulfillmentOption())); fulfillmentGroup.setShippingPrice(response.getFulfillmentOptionPrices().get(fulfillmentGroup.getFulfillmentOption())); return fulfillmentGroup; } throw new FulfillmentPriceException("An unsupported FulfillmentOption was passed to the calculateCostForFulfillmentGroup method"); }
@Override public FulfillmentGroup calculateCostForFulfillmentGroup(FulfillmentGroup fulfillmentGroup) throws FulfillmentPriceException { if (canCalculateCostForFulfillmentGroup(fulfillmentGroup, fulfillmentGroup.getFulfillmentOption())) { Money price = ((FixedPriceFulfillmentOption)fulfillmentGroup.getFulfillmentOption()).getPrice(); fulfillmentGroup.setRetailShippingPrice(price); fulfillmentGroup.setSaleShippingPrice(price); fulfillmentGroup.setShippingPrice(price); return fulfillmentGroup; } throw new IllegalArgumentException("Cannot estimate shipping cost for the fulfillment option: " + fulfillmentGroup.getFulfillmentOption().getClass().getName()); }
@Override public FulfillmentGroup calculateCostForFulfillmentGroup(FulfillmentGroup fulfillmentGroup) throws FulfillmentPriceException { if (fulfillmentGroup.getFulfillmentOption() == null) { //There is no shipping option yet. We'll simply set the shipping price to zero for now, and continue. fulfillmentGroup.setRetailFulfillmentPrice(Money.ZERO); fulfillmentGroup.setFulfillmentPrice(Money.ZERO); fulfillmentGroup.setSaleFulfillmentPrice(Money.ZERO); return fulfillmentGroup; } for (FulfillmentPricingProvider provider : providers) { if (provider.canCalculateCostForFulfillmentGroup(fulfillmentGroup, fulfillmentGroup.getFulfillmentOption())) { return provider.calculateCostForFulfillmentGroup(fulfillmentGroup); } } throw new FulfillmentPriceException("No valid processor was found to calculate the FulfillmentGroup cost with " + "FulfillmentOption id: " + fulfillmentGroup.getFulfillmentOption().getId() + " and name: " + fulfillmentGroup.getFulfillmentOption().getName()); }
cloned.setAddress(address == null ? null : address.createOrRetrieveCopyInstance(context).getClone()); cloned.setDeliveryInstruction(deliveryInstruction); cloned.setFulfillmentOption(fulfillmentOption); cloned.setFulfillmentPrice(fulfillmentPrice == null ? null : new Money(fulfillmentPrice)); cloned.setIsShippingPriceTaxable(isShippingPriceTaxable == null ? null : isShippingPriceTaxable); cloned.setMerchandiseTotal(merchandiseTotal == null ? null : new Money(merchandiseTotal)); cloned.setRetailFulfillmentPrice(fulfillmentPrice == null ? null : new Money(fulfillmentPrice)); cloneTaxDetails(context, cloned); cloned.setTotalItemTax(totalItemTax == null ? null : new Money(totalItemTax)); cloned.setTotalFulfillmentGroupTax(totalFulfillmentGroupTax == null ? null : new Money(totalFulfillmentGroupTax)); cloned.setTotalFeeTax(totalFeeTax == null ? null : new Money(totalFeeTax)); cloned.setTotalTax(totalTax == null ? null : new Money(totalTax)); cloned.setRetailFulfillmentPrice(retailFulfillmentPrice == null ? null : new Money(retailFulfillmentPrice)); cloned.setSaleFulfillmentPrice(saleFulfillmentPrice == null ? null : new Money(saleFulfillmentPrice)); cloned.setTotal(total == null ? null : new Money(total)); cloned.setOrder(order); cloned.setPrimary(primary); cloned.setType(getType()); for (FulfillmentGroupItem fgi: fulfillmentGroupItems) { FulfillmentGroupItem fulfillmentGroupItem = fgi.createOrRetrieveCopyInstance(context).getClone(); fulfillmentGroupItem.setFulfillmentGroup(cloned); cloned.getFulfillmentGroupItems().add(fulfillmentGroupItem);
fg1.setId(1L); Address address1 = new AddressImpl(); address1.setAddressLine1("123 Test Road"); fg1.setAddress(address1); fg1.setOrder(order); fg1.setPrimary(true); fg1.setRetailShippingPrice(new Money(10D)); fg1.setShippingPrice(new Money(10D)); fg1.setType(FulfillmentType.PHYSICAL_SHIP); fg1.setOrder(order); fg1.getFulfillmentGroupItems().add(fgItem1); fg2.setId(2L); Address address2 = new AddressImpl(); address2.setAddressLine1("124 Test Road"); fg2.setAddress(address2); fg2.setOrder(order); fg2.setPrimary(true); fg2.setRetailShippingPrice(new Money(20D)); fg2.setShippingPrice(new Money(20D)); fg2.setType(FulfillmentType.PHYSICAL_SHIP); fg2.setOrder(order); fg2.getFulfillmentGroupItems().add(fgItem2);
protected void getOiFgiMap(Order order, Map<OrderItem, List<FulfillmentGroupItem>> oiFgiMap, OrderItem oi) { List<FulfillmentGroupItem> fgis = new ArrayList<>(); for (FulfillmentGroup fg : order.getFulfillmentGroups()) { for (FulfillmentGroupItem fgi : fg.getFulfillmentGroupItems()) { if (fgi.getOrderItem().equals(oi)) { fgis.add(fgi); } } } oiFgiMap.put(oi, fgis); }
@Override public FulfillmentDto createDto(final FulfillmentGroup fulfillmentGroup, final boolean embed, final boolean link) { final FulfillmentDto fulfillmentDto = new FulfillmentDto(); Optional.ofNullable(fulfillmentGroup.getAddress()).ifPresent(address -> { fulfillmentDto.setAddress(addressConverter.createDto(address, embed, link)); }); fulfillmentDto.setItemHrefs( Optional.ofNullable(fulfillmentGroup.getFulfillmentGroupItems()).orElse(Collections.emptyList()).stream() .map(fulfillmentGroupItem -> linkTo(methodOn(OrderController.class) .getOneItemFromOrder(null, fulfillmentGroup.getOrder().getId(), fulfillmentGroupItem.getOrderItem().getId(), null, null)).toUri().toASCIIString()) .collect(Collectors.toList()) ); fulfillmentDto.setType(Optional.ofNullable(fulfillmentGroup.getType()).map(FulfillmentType::getFriendlyType).orElse(null)); Optional.ofNullable(fulfillmentGroup.getFulfillmentOption()) .map(selectedOption -> selectedOption.getName()) .ifPresent(fulfillmentDto::setSelectedFulfillmentOption); Optional.ofNullable(fulfillmentGroup.getFulfillmentPrice()) .map(Money::getAmount) .ifPresent(fulfillmentDto::setFulfillmentPrice); fulfillmentDto.setFulfillmentOptions(Try.of(() -> fulfillmentServiceProxy.readFulfillmentOptionsWithPricesAvailableForProductsInFulfillmentGroup(fulfillmentGroup)) .map(fulfillmentOptionsMapConverter::createDto) .get()); /* HATEOAS links */ fulfillmentDto.add(linkTo(methodOn(FulfillmentController.class).getOrderFulfillmentById(null, fulfillmentGroup.getOrder().getId(), fulfillmentGroup.getId(), null, null)).withSelfRel()); return fulfillmentDto; }
group1.setMethod("standard"); group1.setService(ShippingServiceType.BANDED_SHIPPING.getType()); address.setIsoCountrySubdivision("US-TX"); address.setIsoCountryAlpha2(isoCountry); group1.setAddress(address); group1.setOrder(order); group2.setMethod("truck"); group2.setService(ShippingServiceType.BANDED_SHIPPING.getType()); group2.setOrder(order); group1.setShippingPrice(total); group2.setShippingPrice(total); fgi.setFulfillmentGroup(group1); group1.addFulfillmentGroupItem(fgi);
group.setAddress(address); group.setIsShippingPriceTaxable(true); List<FulfillmentGroup> groups = new ArrayList<FulfillmentGroup>(); option.setPrice(new Money("8.50")); option.setFulfillmentType(FulfillmentType.PHYSICAL_SHIP); group.setFulfillmentOption(option); group.setFulfillmentOption(option); group.setOrder(order); groups.add(group); order.setFulfillmentGroups(groups); Money total = new Money(5D); group.setRetailShippingPrice(total); group.setShippingPrice(total); fgItem.setQuantity(2); group.addFulfillmentGroupItem(fgItem); fgItem.setQuantity(1); group.addFulfillmentGroupItem(fgItem); fgItem.setQuantity(1); group.addFulfillmentGroupItem(fgItem);
@Override public ProcessContext<CartOperationRequest> execute(ProcessContext<CartOperationRequest> context) throws Exception { CartOperationRequest request = context.getSeedData(); Long orderItemId = request.getItemRequest().getOrderItemId(); Integer orderItemQuantityDelta = request.getOrderItemQuantityDelta(); if (orderItemQuantityDelta < 0) { int numToDelete = -1 * orderItemQuantityDelta; //find the qty in the default fg OrderItem orderItem = request.getOrderItem(); int qty = 0; if (!CollectionUtils.isEmpty(orderItem.getOrder().getFulfillmentGroups())) { FulfillmentGroup fg = orderItem.getOrder().getFulfillmentGroups().get(0); if (fg.getAddress() == null && fg.getFulfillmentOption() == null) { for (FulfillmentGroupItem fgItem : fg.getFulfillmentGroupItems()) { if (fgItem.getOrderItem().getId().equals(orderItemId)) { qty += fgItem.getQuantity(); } } } } if (numToDelete >= qty) { request.getMultishipOptionsToDelete().add(new Long[] { orderItemId, (long) (numToDelete - qty) }); } } return context; }
private FulfillmentGroup buildFulfillmentGroup(Order order, Address address) { FulfillmentGroup group = new FulfillmentGroupImpl(); group.setIsShippingPriceTaxable(true); group.setOrder(order); group.setAddress(address); List<FulfillmentGroup> groups = new ArrayList<>(); groups.add(group); order.setFulfillmentGroups(groups); Money total = new Money(5D); group.setShippingPrice(total); FixedPriceFulfillmentOption option = new FixedPriceFulfillmentOptionImpl(); option.setPrice(new Money(0)); option.setFulfillmentType(FulfillmentType.PHYSICAL_SHIP); group.setFulfillmentOption(option); return group; }
private List<FulfillmentGroup> createFulfillmentGroups(FulfillmentOption option, Double shippingPrice, Order order) { List<FulfillmentGroup> groups = new ArrayList<FulfillmentGroup>(); FulfillmentGroup group = new FulfillmentGroupImpl(); group.setFulfillmentOption(option); groups.add(group); group.setRetailShippingPrice(new Money(shippingPrice)); group.setOrder(order); fgItem.setOrderItem(orderItem); fgItem.setQuantity(orderItem.getQuantity()); group.addFulfillmentGroupItem(fgItem); group.setAddress(address);
Map<String, FulfillmentGroup> multishipGroups = new HashMap<String, FulfillmentGroup>(); for (FulfillmentGroup fg : order.getFulfillmentGroups()) { if (!isShippable(fg.getType())) { continue; String key = getKey(fg.getAddress(), fg.getFulfillmentOption(), fg.getType()); multishipGroups.put(key, fg); for (FulfillmentGroupItem fgi : fg.getFulfillmentGroupItems()) { fgItemQuantityMap.put(fgi.getId(), fgi.getQuantity()); for (FulfillmentGroupItem fgi : fg.getFulfillmentGroupItems()) { if (fgi.getOrderItem().getId().equals(orderItem.getId())) { fulfillmentGroupItem = fgi; fulfillmentGroupItem.setQuantity(orderItem.getQuantity()); fulfillmentGroupItem = fulfillmentGroupItemDao.save(fulfillmentGroupItem); fg.getFulfillmentGroupItems().add(fulfillmentGroupItem); } else { if (fgi.getQuantity() == entry.getValue()) { FulfillmentGroup fg = fgi.getFulfillmentGroup(); fg.getFulfillmentGroupItems().remove(fgi); fulfillmentGroupItemDao.delete(fgi); if (fg.getFulfillmentGroupItems().size() == 0) { order.getFulfillmentGroups().remove(fg); fulfillmentGroupDao.delete(fg);
@Override public FulfillmentGroup addItemToFulfillmentGroup(Order order, OrderItem item, FulfillmentGroup fulfillmentGroup, int quantity, boolean priceOrder) throws PricingException { // 1) Find the item's existing fulfillment group, if any for (FulfillmentGroup fg : order.getFulfillmentGroups()) { Iterator<FulfillmentGroupItem> itr = fg.getFulfillmentGroupItems().iterator(); while (itr.hasNext()) { FulfillmentGroupItem fgItem = itr.next(); if (fgItem.getOrderItem().equals(item)) { // 2) remove item from it's existing fulfillment group itr.remove(); fulfillmentGroupItemDao.delete(fgItem); } } } if (fulfillmentGroup.getId() == null) { // API user is trying to add an item to a fulfillment group not created fulfillmentGroup = addFulfillmentGroupToOrder(order, fulfillmentGroup, priceOrder); } FulfillmentGroupItem fgi = createFulfillmentGroupItemFromOrderItem(item, fulfillmentGroup, quantity); fgi = fulfillmentGroupItemDao.save(fgi); // 3) add the item to the new fulfillment group fulfillmentGroup.addFulfillmentGroupItem(fgi); order = updateOrder(order, priceOrder); return fulfillmentGroup; }
@Override public FulfillmentGroup createDefaultFulfillmentGroup(Order order, Address address) { for (FulfillmentGroup fulfillmentGroup : order.getFulfillmentGroups()) { if (fulfillmentGroup.isPrimary()) { return fulfillmentGroup; } } FulfillmentGroup newFg = fulfillmentGroupService.createEmptyFulfillmentGroup(); newFg.setOrder(order); newFg.setPrimary(true); newFg.setAddress(address); for (OrderItem orderItem : order.getOrderItems()) { newFg.addFulfillmentGroupItem(createFulfillmentGroupItemFromOrderItem(orderItem, newFg, orderItem.getQuantity())); } return newFg; }
@Override @Transactional("blTransactionManager") public FulfillmentGroup addFulfillmentGroupToOrder(FulfillmentGroupRequest fulfillmentGroupRequest, boolean priceOrder) throws PricingException { FulfillmentGroup fg = fulfillmentGroupDao.create(); fg.setAddress(fulfillmentGroupRequest.getAddress()); fg.setOrder(fulfillmentGroupRequest.getOrder()); fg.setPhone(fulfillmentGroupRequest.getPhone()); fg.setFulfillmentOption(fulfillmentGroupRequest.getOption()); fg.setType(fulfillmentGroupRequest.getFulfillmentType()); for (int i = 0; i < fulfillmentGroupRequest.getFulfillmentGroupItemRequests().size(); i++) { FulfillmentGroupItemRequest request = fulfillmentGroupRequest.getFulfillmentGroupItemRequests().get(i); request.setFulfillmentGroup(fg); request.setOrder(fulfillmentGroupRequest.getOrder()); boolean shouldPriceOrder = (priceOrder && (i == (fulfillmentGroupRequest.getFulfillmentGroupItemRequests().size() - 1))); fg = addItemToFulfillmentGroup(request, shouldPriceOrder); } return fg; }
for (FulfillmentGroup fulfillmentGroup : order.getFulfillmentGroups()) { for (FulfillmentGroupItem fgItem : fulfillmentGroup.getFulfillmentGroupItems()) { if (isItemTaxable(fgItem)) { BigDecimal factor = determineItemTaxRate(fulfillmentGroup.getAddress()); if (factor != null && factor.compareTo(BigDecimal.ZERO) != 0) { TaxDetail tax; for (FulfillmentGroupFee fgFee : fulfillmentGroup.getFulfillmentGroupFees()) { if (isFeeTaxable(fgFee)) { BigDecimal factor = determineItemTaxRate(fulfillmentGroup.getAddress()); if (factor != null && factor.compareTo(BigDecimal.ZERO) != 0) { TaxDetail tax; TaxDetail tax; checkDetail: { for (TaxDetail detail : fulfillmentGroup.getTaxes()) { if (detail.getType().equals(TaxType.COMBINED)) { tax = detail; fulfillmentGroup.getTaxes().add(tax); tax.setAmount(fulfillmentGroup.getFulfillmentPrice().multiply(factor));
@Override public FulfillmentGroup addFulfillmentGroupToOrder(FulfillmentGroupRequest fulfillmentGroupRequest, boolean priceOrder) throws PricingException { FulfillmentGroup fg = fulfillmentGroupDao.create(); fg.setAddress(fulfillmentGroupRequest.getAddress()); fg.setOrder(fulfillmentGroupRequest.getOrder()); fg.setPhone(fulfillmentGroupRequest.getPhone()); fg.setMethod(fulfillmentGroupRequest.getMethod()); fg.setService(fulfillmentGroupRequest.getService()); for (int i=0; i< fulfillmentGroupRequest.getFulfillmentGroupItemRequests().size(); i++) { FulfillmentGroupItemRequest request = fulfillmentGroupRequest.getFulfillmentGroupItemRequests().get(i); boolean shouldPriceOrder = (priceOrder && (i == (fulfillmentGroupRequest.getFulfillmentGroupItemRequests().size() - 1))); fg = addItemToFulfillmentGroup(request.getOrderItem(), fg, request.getQuantity(), shouldPriceOrder); } return fg; }