@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()); }
@Override public <G extends FulfillmentOption> CreateResponse<G> createOrRetrieveCopyInstance(MultiTenantCopyContext context) throws CloneNotSupportedException { CreateResponse<G> createResponse = context.createOrRetrieveCopyInstance(this); if (createResponse.isAlreadyPopulated()) { return createResponse; } FulfillmentOption cloned = createResponse.getClone(); cloned.setFulfillmentType(getFulfillmentType()); cloned.setName(name); cloned.setTaxCode(taxCode); cloned.setUseFlatRates(useFlatRates); cloned.setTaxable(taxable); cloned.setLongDescription(longDescription); return createResponse; }
+ option.getId()); if (sku != null && option.getUseFlatRates()) { BigDecimal rate = sku.getFulfillmentFlatRates().get(option); if (rate != null) {
return moneyPerOptionMap.entrySet().stream() .collect(Collectors.toMap( e -> e.getKey().getName(), e -> FulfillmentOptionDto.builder() .description(e.getKey().getLongDescription()) .price(e.getValue().getAmount()).build(), (a, b) -> {
protected String getKey(Address address, FulfillmentOption option, FulfillmentType fulfillmentType) { Long addressKey = (address == null) ? -1 : address.getId(); Long fulfillmentOptionKey = (option == null) ? -1 : option.getId(); String fulfillmentTypeKey = (fulfillmentType == null) ? "-1" : fulfillmentType.getType(); return addressKey + ":" + fulfillmentOptionKey + ":" + fulfillmentTypeKey; }
@Override public FulfillmentGroup updateEntity(final FulfillmentGroup fulfillmentGroup, final FulfillmentDto fulfillmentDto) { fulfillmentGroup.setAddress(Optional.ofNullable(fulfillmentDto.getAddress()).map(addressConverter::createEntity).orElse(null)); Set<FulfillmentOption> availableFulfillmentOptions = fulfillmentServiceProxy.findFulfillmentOptionsForProductsInFulfillmentGroup(fulfillmentGroup); Optional<FulfillmentOption> matchOption = availableFulfillmentOptions.stream() .filter(o -> o.getName().equals(fulfillmentDto.getSelectedFulfillmentOption())) .findFirst(); if(matchOption.isPresent()) { fulfillmentGroup.setFulfillmentOption(matchOption.get()); } //TODO nullcheck because someone migh want to order first, then see prices of postage, should it be like this? else if(fulfillmentDto.getSelectedFulfillmentOption() != null) { throw new NoFulfillmentOptionException(String.format("No such fulfillment: %s", fulfillmentDto.getSelectedFulfillmentOption())); } return fulfillmentGroup; }
FulfillmentOption clonedEntry = entry.createOrRetrieveCopyInstance(context).getClone(); cloned.getExcludedFulfillmentOptions().add(clonedEntry); FulfillmentOption clonedEntry = entry.getKey().createOrRetrieveCopyInstance(context).getClone(); cloned.getFulfillmentFlatRates().put(clonedEntry,entry.getValue());
@Override public ShippingInfoForm prePopulateShippingInfoForm(ShippingInfoForm shippingInfoForm, Order cart) { FulfillmentGroup firstShippableFulfillmentGroup = fulfillmentGroupService.getFirstShippableFulfillmentGroup(cart); if (firstShippableFulfillmentGroup != null) { //if the cart has already has fulfillment information if (firstShippableFulfillmentGroup.getAddress() != null) { shippingInfoForm.setAddress(firstShippableFulfillmentGroup.getAddress()); } else { //check for a default address for the customer CustomerAddress defaultAddress = customerAddressService.findDefaultCustomerAddress(CustomerState.getCustomer().getId()); if (defaultAddress != null) { shippingInfoForm.setAddress(defaultAddress.getAddress()); shippingInfoForm.setAddressName(defaultAddress.getAddressName()); } } FulfillmentOption fulfillmentOption = firstShippableFulfillmentGroup.getFulfillmentOption(); if (fulfillmentOption != null) { shippingInfoForm.setFulfillmentOption(fulfillmentOption); shippingInfoForm.setFulfillmentOptionId(fulfillmentOption.getId()); } } return shippingInfoForm; }
@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; }
@Override public CreateResponse<OrderMultishipOption> createOrRetrieveCopyInstance(MultiTenantCopyContext context) throws CloneNotSupportedException { CreateResponse<OrderMultishipOption> createResponse = context.createOrRetrieveCopyInstance(this); if (createResponse.isAlreadyPopulated()) { return createResponse; } OrderMultishipOption cloned = createResponse.getClone(); cloned.setAddress(address.createOrRetrieveCopyInstance(context).getClone()); cloned.setFulfillmentOption(fulfillmentOption.createOrRetrieveCopyInstance(context).getClone()); cloned.setOrder(order); cloned.setOrderItem(orderItem.createOrRetrieveCopyInstance(context).getClone()); return createResponse; } }