Search in sources :

Example 1 with ShippingQuote

use of com.salesmanager.core.model.shipping.ShippingQuote in project shopizer by shopizer-ecommerce.

the class ShoppingOrderController method displayCheckout.

@SuppressWarnings("unused")
@RequestMapping("/checkout.html")
public String displayCheckout(@CookieValue("cart") String cookie, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
    Language language = (Language) request.getAttribute("LANGUAGE");
    MerchantStore store = (MerchantStore) request.getAttribute(Constants.MERCHANT_STORE);
    Customer customer = (Customer) request.getSession().getAttribute(Constants.CUSTOMER);
    model.addAttribute("googleMapsKey", googleMapsKey);
    /**
     * Shopping cart
     *
     * ShoppingCart should be in the HttpSession
     * Otherwise the cart id is in the cookie
     * Otherwise the customer is in the session and a cart exist in the DB
     * Else -> Nothing to display
     */
    // check if an existing order exist
    ShopOrder order = null;
    order = super.getSessionAttribute(Constants.ORDER, request);
    // Get the cart from the DB
    String shoppingCartCode = (String) request.getSession().getAttribute(Constants.SHOPPING_CART);
    com.salesmanager.core.model.shoppingcart.ShoppingCart cart = null;
    if (StringUtils.isBlank(shoppingCartCode)) {
        if (cookie == null) {
            // session expired and cookie null, nothing to do
            return "redirect:/shop/cart/shoppingCart.html";
        }
        String[] merchantCookie = cookie.split("_");
        String merchantStoreCode = merchantCookie[0];
        if (!merchantStoreCode.equals(store.getCode())) {
            return "redirect:/shop/cart/shoppingCart.html";
        }
        shoppingCartCode = merchantCookie[1];
    }
    cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
    if (cart == null && customer != null) {
        cart = shoppingCartFacade.getShoppingCartModel(customer, store);
    }
    boolean allAvailables = true;
    boolean requiresShipping = false;
    boolean freeShoppingCart = true;
    // Filter items, delete unavailable
    Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> availables = new HashSet<ShoppingCartItem>();
    if (cart == null) {
        return "redirect:/shop/cart/shoppingCart.html";
    }
    // Take out items no more available
    Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> items = cart.getLineItems();
    for (com.salesmanager.core.model.shoppingcart.ShoppingCartItem item : items) {
        Long id = item.getProduct().getId();
        Product p = productService.getById(id);
        if (p.isAvailable()) {
            availables.add(item);
        } else {
            allAvailables = false;
        }
        FinalPrice finalPrice = pricingService.calculateProductPrice(p);
        if (finalPrice.getFinalPrice().longValue() > 0) {
            freeShoppingCart = false;
        }
        if (p.isProductShipeable()) {
            requiresShipping = true;
        }
    }
    cart.setLineItems(availables);
    if (!allAvailables) {
        shoppingCartFacade.saveOrUpdateShoppingCart(cart);
    }
    super.setSessionAttribute(Constants.SHOPPING_CART, cart.getShoppingCartCode(), request);
    if (shoppingCartCode == null && cart == null) {
        // error
        return "redirect:/shop/cart/shoppingCart.html";
    }
    if (customer != null) {
        if (cart.getCustomerId() != customer.getId().longValue()) {
            return "redirect:/shop/shoppingCart.html";
        }
    } else {
        customer = orderFacade.initEmptyCustomer(store);
        AnonymousCustomer anonymousCustomer = (AnonymousCustomer) request.getAttribute(Constants.ANONYMOUS_CUSTOMER);
        if (anonymousCustomer != null && anonymousCustomer.getBilling() != null) {
            Billing billing = customer.getBilling();
            billing.setCity(anonymousCustomer.getBilling().getCity());
            Map<String, Country> countriesMap = countryService.getCountriesMap(language);
            Country anonymousCountry = countriesMap.get(anonymousCustomer.getBilling().getCountry());
            if (anonymousCountry != null) {
                billing.setCountry(anonymousCountry);
            }
            Map<String, Zone> zonesMap = zoneService.getZones(language);
            Zone anonymousZone = zonesMap.get(anonymousCustomer.getBilling().getZone());
            if (anonymousZone != null) {
                billing.setZone(anonymousZone);
            }
            if (anonymousCustomer.getBilling().getPostalCode() != null) {
                billing.setPostalCode(anonymousCustomer.getBilling().getPostalCode());
            }
            customer.setBilling(billing);
        }
    }
    if (CollectionUtils.isEmpty(items)) {
        return "redirect:/shop/shoppingCart.html";
    }
    if (order == null) {
        // TODO
        order = orderFacade.initializeOrder(store, customer, cart, language);
    }
    /**
     * hook for displaying or not delivery address configuration
     */
    ShippingMetaData shippingMetaData = shippingService.getShippingMetaData(store);
    model.addAttribute("shippingMetaData", shippingMetaData);
    /**
     * shipping *
     */
    ShippingQuote quote = null;
    if (requiresShipping) {
        // System.out.println("** Berfore default shipping quote **");
        // Get all applicable shipping quotes
        quote = orderFacade.getShippingQuote(customer, cart, order, store, language);
        model.addAttribute("shippingQuote", quote);
    }
    if (quote != null) {
        String shippingReturnCode = quote.getShippingReturnCode();
        if (StringUtils.isBlank(shippingReturnCode) || shippingReturnCode.equals(ShippingQuote.NO_POSTAL_CODE)) {
            if (order.getShippingSummary() == null) {
                ShippingSummary summary = orderFacade.getShippingSummary(quote, store, language);
                order.setShippingSummary(summary);
                // TODO DTO
                request.getSession().setAttribute(Constants.SHIPPING_SUMMARY, summary);
            }
            if (order.getSelectedShippingOption() == null) {
                order.setSelectedShippingOption(quote.getSelectedShippingOption());
            }
            // save quotes in HttpSession
            List<ShippingOption> options = quote.getShippingOptions();
            // TODO DTO
            request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);
            if (!CollectionUtils.isEmpty(options)) {
                for (ShippingOption shipOption : options) {
                    StringBuilder moduleName = new StringBuilder();
                    moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
                    String carrier = messages.getMessage(moduleName.toString(), locale);
                    String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
                    shipOption.setDescription(carrier);
                    shipOption.setNote(note);
                    // option name
                    if (!StringUtils.isBlank(shipOption.getOptionCode())) {
                        // try to get the translate
                        StringBuilder optionCodeBuilder = new StringBuilder();
                        try {
                            optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
                            String optionName = messages.getMessage(optionCodeBuilder.toString(), locale);
                            shipOption.setOptionName(optionName);
                        } catch (Exception e) {
                            // label not found
                            LOGGER.warn("displayCheckout No shipping code found for " + optionCodeBuilder.toString());
                        }
                    }
                }
            }
        }
        if (quote.getDeliveryAddress() != null) {
            ReadableCustomerDeliveryAddressPopulator addressPopulator = new ReadableCustomerDeliveryAddressPopulator();
            addressPopulator.setCountryService(countryService);
            addressPopulator.setZoneService(zoneService);
            ReadableDelivery deliveryAddress = new ReadableDelivery();
            addressPopulator.populate(quote.getDeliveryAddress(), deliveryAddress, store, language);
            model.addAttribute("deliveryAddress", deliveryAddress);
            super.setSessionAttribute(Constants.KEY_SESSION_ADDRESS, deliveryAddress, request);
        }
        // get shipping countries
        List<Country> shippingCountriesList = orderFacade.getShipToCountry(store, language);
        model.addAttribute("countries", shippingCountriesList);
    } else {
        // get all countries
        List<Country> countries = countryService.getCountries(language);
        model.addAttribute("countries", countries);
    }
    if (quote != null && quote.getShippingReturnCode() != null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED)) {
        LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
        model.addAttribute("errorMessages", messages.getMessage(quote.getShippingReturnCode(), locale, quote.getShippingReturnCode()));
    }
    if (quote != null && !StringUtils.isBlank(quote.getQuoteError())) {
        LOGGER.error("Shipping quote error " + quote.getQuoteError());
        model.addAttribute("errorMessages", quote.getQuoteError());
    }
    if (quote != null && quote.getShippingReturnCode() != null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY)) {
        LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
        model.addAttribute("errorMessages", quote.getShippingReturnCode());
    }
    /**
     * end shipping *
     */
    // get payment methods
    List<PaymentMethod> paymentMethods = paymentService.getAcceptedPaymentMethods(store);
    // not free and no payment methods
    if (CollectionUtils.isEmpty(paymentMethods) && !freeShoppingCart) {
        LOGGER.error("No payment method configured");
        model.addAttribute("errorMessages", messages.getMessage("payment.not.configured", locale, "No payments configured"));
    }
    if (!CollectionUtils.isEmpty(paymentMethods)) {
        // select default payment method
        PaymentMethod defaultPaymentSelected = null;
        for (PaymentMethod paymentMethod : paymentMethods) {
            if (paymentMethod.isDefaultSelected()) {
                defaultPaymentSelected = paymentMethod;
                break;
            }
        }
        if (defaultPaymentSelected == null) {
            // forced default selection
            defaultPaymentSelected = paymentMethods.get(0);
            defaultPaymentSelected.setDefaultSelected(true);
        }
        order.setDefaultPaymentMethodCode(defaultPaymentSelected.getPaymentMethodCode());
    }
    // readable shopping cart items for order summary box
    ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(cart, language);
    model.addAttribute("cart", shoppingCart);
    order.setCartCode(shoppingCart.getCode());
    // order total
    OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
    order.setOrderTotalSummary(orderTotalSummary);
    // if order summary has to be re-used
    super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
    // display hacks
    if (!StringUtils.isBlank(googleMapsKey)) {
        model.addAttribute("fieldDisabled", "true");
        model.addAttribute("cssClass", "");
    } else {
        model.addAttribute("fieldDisabled", "false");
        model.addAttribute("cssClass", "required");
    }
    model.addAttribute("order", order);
    model.addAttribute("paymentMethods", paymentMethods);
    /**
     * template *
     */
    StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.checkout).append(".").append(store.getStoreTemplate());
    return template.toString();
}
Also used : AnonymousCustomer(com.salesmanager.shop.model.customer.AnonymousCustomer) Customer(com.salesmanager.core.model.customer.Customer) PersistableCustomer(com.salesmanager.shop.model.customer.PersistableCustomer) OrderTotalSummary(com.salesmanager.core.model.order.OrderTotalSummary) AnonymousCustomer(com.salesmanager.shop.model.customer.AnonymousCustomer) Product(com.salesmanager.core.model.catalog.product.Product) ShoppingCartItem(com.salesmanager.core.model.shoppingcart.ShoppingCartItem) Language(com.salesmanager.core.model.reference.language.Language) ReadableCustomerDeliveryAddressPopulator(com.salesmanager.shop.populator.customer.ReadableCustomerDeliveryAddressPopulator) ShippingSummary(com.salesmanager.core.model.shipping.ShippingSummary) ReadableShippingSummary(com.salesmanager.shop.model.order.shipping.ReadableShippingSummary) MerchantStore(com.salesmanager.core.model.merchant.MerchantStore) HashSet(java.util.HashSet) FinalPrice(com.salesmanager.core.model.catalog.product.price.FinalPrice) Zone(com.salesmanager.core.model.reference.zone.Zone) ReadableDelivery(com.salesmanager.shop.model.customer.ReadableDelivery) ShoppingCartData(com.salesmanager.shop.model.shoppingcart.ShoppingCartData) ServiceException(com.salesmanager.core.business.exception.ServiceException) ShippingOption(com.salesmanager.core.model.shipping.ShippingOption) ShopOrder(com.salesmanager.shop.model.order.ShopOrder) ReadableShopOrder(com.salesmanager.shop.model.order.ReadableShopOrder) ShippingMetaData(com.salesmanager.core.model.shipping.ShippingMetaData) ShippingQuote(com.salesmanager.core.model.shipping.ShippingQuote) Billing(com.salesmanager.core.model.common.Billing) Country(com.salesmanager.core.model.reference.country.Country) PaymentMethod(com.salesmanager.core.model.payments.PaymentMethod) ShoppingCartItem(com.salesmanager.core.model.shoppingcart.ShoppingCartItem) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 2 with ShippingQuote

use of com.salesmanager.core.model.shipping.ShippingQuote in project shopizer by shopizer-ecommerce.

the class USPSParsedElements method getShippingQuotes.

@Override
public List<ShippingOption> getShippingQuotes(ShippingQuote shippingQuote, List<PackageDetails> packages, BigDecimal orderTotal, Delivery delivery, ShippingOrigin origin, MerchantStore store, IntegrationConfiguration configuration, IntegrationModule module, ShippingConfiguration shippingConfiguration, Locale locale) throws IntegrationException {
    if (packages == null) {
        return null;
    }
    if (StringUtils.isBlank(delivery.getPostalCode())) {
        return null;
    }
    // only applies to Canada and US
    /*		Country country = delivery.getCountry();
		if(!country.getIsoCode().equals("US") || !country.getIsoCode().equals("US")){
			throw new IntegrationException("USPS Not configured for shipping in country " + country.getIsoCode());
		}*/
    // supports en and fr
    String language = locale.getLanguage();
    if (!language.equals(Locale.FRENCH.getLanguage()) && !language.equals(Locale.ENGLISH.getLanguage())) {
        language = Locale.ENGLISH.getLanguage();
    }
    // if store is not CAD /** maintained in the currency **/
    /*		if (!store.getCurrency().equals(Constants.CURRENCY_CODE_CAD)) {
			total = CurrencyUtil.convertToCurrency(total, store.getCurrency(),
					Constants.CURRENCY_CODE_CAD);
		}*/
    Language lang = store.getDefaultLanguage();
    HttpGet httpget = null;
    Reader xmlreader = null;
    String pack = configuration.getIntegrationOptions().get("packages").get(0);
    try {
        Map<String, Country> countries = countryService.getCountriesMap(lang);
        Country destination = countries.get(delivery.getCountry().getIsoCode());
        Map<String, String> keys = configuration.getIntegrationKeys();
        if (keys == null || StringUtils.isBlank(keys.get("account"))) {
            // TODO can we return null
            return null;
        }
        String host = null;
        String protocol = null;
        String port = null;
        String url = null;
        // against which environment are we using the service
        String env = configuration.getEnvironment();
        // must be US
        if (!store.getCountry().getIsoCode().equals("US")) {
            throw new IntegrationException("Can't use the service for store country code ");
        }
        Map<String, ModuleConfig> moduleConfigsMap = module.getModuleConfigs();
        for (String key : moduleConfigsMap.keySet()) {
            ModuleConfig moduleConfig = moduleConfigsMap.get(key);
            if (moduleConfig.getEnv().equals(env)) {
                host = moduleConfig.getHost();
                protocol = moduleConfig.getScheme();
                port = moduleConfig.getPort();
                url = moduleConfig.getUri();
            }
        }
        StringBuilder xmlheader = new StringBuilder();
        if (store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
            xmlheader.append("<RateV3Request USERID=\"").append(keys.get("account")).append("\">");
        } else {
            xmlheader.append("<IntlRateRequest USERID=\"").append(keys.get("account")).append("\">");
        }
        StringBuilder xmldatabuffer = new StringBuilder();
        double totalW = 0;
        double totalH = 0;
        double totalL = 0;
        double totalG = 0;
        double totalP = 0;
        for (PackageDetails detail : packages) {
            // need size in inch
            double w = DataUtils.getMeasure(detail.getShippingWidth(), store, MeasureUnit.IN.name());
            double h = DataUtils.getMeasure(detail.getShippingHeight(), store, MeasureUnit.IN.name());
            double l = DataUtils.getMeasure(detail.getShippingLength(), store, MeasureUnit.IN.name());
            totalW = totalW + w;
            totalH = totalH + h;
            totalL = totalL + l;
            // Girth = Length + (Width x 2) + (Height x 2)
            double girth = l + (w * 2) + (h * 2);
            totalG = totalG + girth;
            // need weight in pounds
            double p = DataUtils.getWeight(detail.getShippingWeight(), store, MeasureUnit.LB.name());
            totalP = totalP + p;
        }
        /*			BigDecimal convertedOrderTotal = CurrencyUtil.convertToCurrency(
					orderTotal, store.getCurrency(),
					Constants.CURRENCY_CODE_USD);*/
        // calculate total shipping volume
        // ship date is 3 days from here
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.DATE, 3);
        Date newDate = c.getTime();
        SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
        String shipDate = format.format(newDate);
        int i = 1;
        // need pounds and ounces
        int pounds = (int) totalP;
        String ouncesString = String.valueOf(totalP - pounds);
        int ouncesIndex = ouncesString.indexOf(".");
        String ounces = "00";
        if (ouncesIndex > -1) {
            ounces = ouncesString.substring(ouncesIndex + 1);
        }
        String size = "REGULAR";
        if (totalL + totalG <= 64) {
            size = "REGULAR";
        } else if (totalL + totalG <= 108) {
            size = "LARGE";
        } else {
            size = "OVERSIZE";
        }
        /**
         * Domestic <Package ID="1ST"> <Service>ALL</Service>
         * <ZipOrigination>90210</ZipOrigination>
         * <ZipDestination>96698</ZipDestination> <Pounds>8</Pounds>
         * <Ounces>32</Ounces> <Container/> <Size>REGULAR</Size>
         * <Machinable>true</Machinable> </Package>
         *
         * //MAXWEIGHT=70 lbs
         *
         * //domestic container default=VARIABLE whiteSpace=collapse
         * enumeration=VARIABLE enumeration=FLAT RATE BOX enumeration=FLAT
         * RATE ENVELOPE enumeration=LG FLAT RATE BOX
         * enumeration=RECTANGULAR enumeration=NONRECTANGULAR
         *
         * //INTL enumeration=Package enumeration=Postcards or aerogrammes
         * enumeration=Matter for the blind enumeration=Envelope
         *
         * Size May be left blank in situations that do not Size. Defined as
         * follows: REGULAR: package plus girth is 84 inches or less; LARGE:
         * package length plus girth measure more than 84 inches not more
         * than 108 inches; OVERSIZE: package length plus girth is more than
         * 108 but not 130 inches. For example: <Size>REGULAR</Size>
         *
         * International <Package ID="1ST"> <Machinable>true</Machinable>
         * <MailType>Envelope</MailType> <Country>Canada</Country>
         * <Length>0</Length> <Width>0</Width> <Height>0</Height>
         * <ValueOfContents>250</ValueOfContents> </Package>
         *
         * <Package ID="2ND"> <Pounds>4</Pounds> <Ounces>3</Ounces>
         * <MailType>Package</MailType> <GXG> <Length>46</Length>
         * <Width>14</Width> <Height>15</Height> <POBoxFlag>N</POBoxFlag>
         * <GiftFlag>N</GiftFlag> </GXG>
         * <ValueOfContents>250</ValueOfContents> <Country>Japan</Country>
         * </Package>
         */
        xmldatabuffer.append("<Package ID=\"").append(i).append("\">");
        if (store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
            xmldatabuffer.append("<Service>");
            xmldatabuffer.append("ALL");
            xmldatabuffer.append("</Service>");
            xmldatabuffer.append("<ZipOrigination>");
            xmldatabuffer.append(DataUtils.trimPostalCode(store.getStorepostalcode()));
            xmldatabuffer.append("</ZipOrigination>");
            xmldatabuffer.append("<ZipDestination>");
            xmldatabuffer.append(DataUtils.trimPostalCode(delivery.getPostalCode()));
            xmldatabuffer.append("</ZipDestination>");
            xmldatabuffer.append("<Pounds>");
            xmldatabuffer.append(pounds);
            xmldatabuffer.append("</Pounds>");
            xmldatabuffer.append("<Ounces>");
            xmldatabuffer.append(ounces);
            xmldatabuffer.append("</Ounces>");
            xmldatabuffer.append("<Container>");
            xmldatabuffer.append(pack);
            xmldatabuffer.append("</Container>");
            xmldatabuffer.append("<Size>");
            xmldatabuffer.append(size);
            xmldatabuffer.append("</Size>");
            // TODO must be changed if not machinable
            xmldatabuffer.append("<Machinable>true</Machinable>");
            xmldatabuffer.append("<ShipDate>");
            xmldatabuffer.append(shipDate);
            xmldatabuffer.append("</ShipDate>");
        } else {
            // if international
            xmldatabuffer.append("<Pounds>");
            xmldatabuffer.append(pounds);
            xmldatabuffer.append("</Pounds>");
            xmldatabuffer.append("<Ounces>");
            xmldatabuffer.append(ounces);
            xmldatabuffer.append("</Ounces>");
            xmldatabuffer.append("<MailType>");
            xmldatabuffer.append(pack);
            xmldatabuffer.append("</MailType>");
            xmldatabuffer.append("<ValueOfContents>");
            xmldatabuffer.append(productPriceUtils.getAdminFormatedAmount(store, orderTotal));
            xmldatabuffer.append("</ValueOfContents>");
            xmldatabuffer.append("<Country>");
            xmldatabuffer.append(destination.getName());
            xmldatabuffer.append("</Country>");
        }
        // if international & CXG
        /*
			 * xmldatabuffer.append("<CXG>"); xmldatabuffer.append("<Length>");
			 * xmldatabuffer.append(""); xmldatabuffer.append("</Length>");
			 * xmldatabuffer.append("<Width>"); xmldatabuffer.append("");
			 * xmldatabuffer.append("</Width>");
			 * xmldatabuffer.append("<Height>"); xmldatabuffer.append("");
			 * xmldatabuffer.append("</Height>");
			 * xmldatabuffer.append("<POBoxFlag>"); xmldatabuffer.append("");
			 * xmldatabuffer.append("</POBoxFlag>");
			 * xmldatabuffer.append("<GiftFlag>"); xmldatabuffer.append("");
			 * xmldatabuffer.append("</GiftFlag>");
			 * xmldatabuffer.append("</CXG>");
			 */
        /*
			 * xmldatabuffer.append("<Width>"); xmldatabuffer.append(totalW);
			 * xmldatabuffer.append("</Width>");
			 * xmldatabuffer.append("<Length>"); xmldatabuffer.append(totalL);
			 * xmldatabuffer.append("</Length>");
			 * xmldatabuffer.append("<Height>"); xmldatabuffer.append(totalH);
			 * xmldatabuffer.append("</Height>");
			 * xmldatabuffer.append("<Girth>"); xmldatabuffer.append(totalG);
			 * xmldatabuffer.append("</Girth>");
			 */
        xmldatabuffer.append("</Package>");
        String xmlfooter = "</RateV3Request>";
        if (!store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
            xmlfooter = "</IntlRateRequest>";
        }
        StringBuilder xmlbuffer = new StringBuilder().append(xmlheader.toString()).append(xmldatabuffer.toString()).append(xmlfooter);
        LOGGER.debug("USPS QUOTE REQUEST " + xmlbuffer.toString());
        // HttpClient client = new HttpClient();
        try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
            @SuppressWarnings("deprecation") String encoded = java.net.URLEncoder.encode(xmlbuffer.toString());
            String completeUri = url + "?API=RateV3&XML=" + encoded;
            if (!store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
                completeUri = url + "?API=IntlRate&XML=" + encoded;
            }
            // ?API=RateV3
            httpget = new HttpGet(protocol + "://" + host + ":" + port + completeUri);
            // RequestEntity entity = new
            // StringRequestEntity(xmlbuffer.toString(),"text/plain","UTF-8");
            // httpget.setRequestEntity(entity);
            ResponseHandler<String> responseHandler = response -> {
                int status = response.getStatusLine().getStatusCode();
                if (status >= 200 && status < 300) {
                    HttpEntity entity = response.getEntity();
                    return entity != null ? EntityUtils.toString(entity) : null;
                } else {
                    LOGGER.error("Communication Error with ups quote " + status);
                    throw new ClientProtocolException("UPS quote communication error " + status);
                }
            };
            String data = httpclient.execute(httpget, responseHandler);
            /*			int result = client.executeMethod(httpget);
			if (result != 200) {
				LOGGER.error("Communication Error with usps quote " + result + " "
						+ protocol + "://" + host + ":" + port + url);
				throw new Exception("USPS quote communication error " + result);
			}*/
            // data = httpget.getResponseBodyAsString();
            LOGGER.debug("usps quote response " + data);
            USPSParsedElements parsed = new USPSParsedElements();
            /**
             * <RateV3Response> <Package ID="1ST">
             * <ZipOrigination>44106</ZipOrigination>
             * <ZipDestination>20770</ZipDestination>
             */
            Digester digester = new Digester();
            digester.push(parsed);
            if (store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
                digester.addCallMethod("Error/Description", "setError", 0);
                digester.addCallMethod("RateV3Response/Package/Error/Description", "setError", 0);
                digester.addObjectCreate("RateV3Response/Package/Postage", ShippingOption.class);
                digester.addSetProperties("RateV3Response/Package/Postage", "CLASSID", "optionId");
                digester.addCallMethod("RateV3Response/Package/Postage/MailService", "setOptionName", 0);
                digester.addCallMethod("RateV3Response/Package/Postage/MailService", "setOptionCode", 0);
                digester.addCallMethod("RateV3Response/Package/Postage/Rate", "setOptionPriceText", 0);
                // digester
                // .addCallMethod(
                // "RateV3Response/Package/Postage/Commitment/CommitmentDate",
                // "estimatedNumberOfDays", 0);
                digester.addSetNext("RateV3Response/Package/Postage", "addOption");
            } else {
                digester.addCallMethod("Error/Description", "setError", 0);
                digester.addCallMethod("IntlRateResponse/Package/Error/Description", "setError", 0);
                digester.addObjectCreate("IntlRateResponse/Package/Service", ShippingOption.class);
                digester.addSetProperties("IntlRateResponse/Package/Service", "ID", "optionId");
                digester.addCallMethod("IntlRateResponse/Package/Service/SvcDescription", "setOptionName", 0);
                digester.addCallMethod("IntlRateResponse/Package/Service/SvcDescription", "setOptionCode", 0);
                digester.addCallMethod("IntlRateResponse/Package/Service/Postage", "setOptionPriceText", 0);
                // digester.addCallMethod(
                // "IntlRateResponse/Package/Service/SvcCommitments",
                // "setEstimatedNumberOfDays", 0);
                digester.addSetNext("IntlRateResponse/Package/Service", "addOption");
            }
            // <?xml
            // version="1.0"?><AddressValidationResponse><Response><TransactionReference><CustomerContext>SalesManager
            // Data</CustomerContext><XpciVersion>1.0</XpciVersion></TransactionReference><ResponseStatusCode>0</ResponseStatusCode><ResponseStatusDescription>Failure</ResponseStatusDescription><Error><ErrorSeverity>Hard</ErrorSeverity><ErrorCode>10002</ErrorCode><ErrorDescription>The
            // XML document is well formed but the document is not
            // valid</ErrorDescription><ErrorLocation><ErrorLocationElementName>AddressValidationRequest</ErrorLocationElementName></ErrorLocation></Error></Response></AddressValidationResponse>
            // <?xml version="1.0"?>
            // <IntlRateResponse><Package ID="1"><Error><Number>-2147218046</Number>
            // <Source>IntlPostage;clsIntlPostage.GetCountryAndRestirctedServiceId;clsIntlPostage.CalcAllPostageDimensionsXML;IntlRate.ProcessRequest</Source>
            // <Description>Invalid Country Name</Description><HelpFile></HelpFile><HelpContext>1000440</HelpContext></Error></Package></IntlRateResponse>
            xmlreader = new StringReader(data);
            digester.parse(xmlreader);
            if (!StringUtils.isBlank(parsed.getError())) {
                LOGGER.error("Can't process USPS message= " + parsed.getError());
                throw new IntegrationException(parsed.getError());
            }
            if (!StringUtils.isBlank(parsed.getStatusCode()) && !parsed.getStatusCode().equals("1")) {
                LOGGER.error("Can't process USPS statusCode=" + parsed.getStatusCode() + " message= " + parsed.getError());
                throw new IntegrationException(parsed.getError());
            }
            if (parsed.getOptions() == null || parsed.getOptions().size() == 0) {
                LOGGER.warn("No options returned from USPS");
                throw new IntegrationException(parsed.getError());
            }
            /*			String carrier = getShippingMethodDescription(locale);
			// cost is in USD, need to do conversion

			MerchantConfiguration rtdetails = config
					.getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_DISPLAY_REALTIME_QUOTES);
			int displayQuoteDeliveryTime = ShippingConstants.NO_DISPLAY_RT_QUOTE_TIME;
			if (rtdetails != null) {

				if (!StringUtils.isBlank(rtdetails.getConfigurationValue1())) {// display
																				// or
																				// not
																				// quotes
					try {
						displayQuoteDeliveryTime = Integer.parseInt(rtdetails
								.getConfigurationValue1());

					} catch (Exception e) {
						log.error("Display quote is not an integer value ["
								+ rtdetails.getConfigurationValue1() + "]");
					}
				}
			}

			LabelUtil labelUtil = LabelUtil.getInstance();*/
            // Map serviceMap =
            // com.salesmanager.core.util.ShippingUtil.buildServiceMap("usps",locale);
            @SuppressWarnings("unchecked") List<ShippingOption> shippingOptions = parsed.getOptions();
            return shippingOptions;
        }
    } catch (Exception e1) {
        LOGGER.error("Error in USPS shipping quote ", e1);
        throw new IntegrationException(e1);
    } finally {
        if (xmlreader != null) {
            try {
                xmlreader.close();
            } catch (Exception ignore) {
            }
        }
        if (httpget != null) {
            httpget.releaseConnection();
        }
    }
}
Also used : ClientProtocolException(org.apache.http.client.ClientProtocolException) ShippingOrigin(com.salesmanager.core.model.shipping.ShippingOrigin) Date(java.util.Date) DataUtils(com.salesmanager.core.business.utils.DataUtils) LoggerFactory(org.slf4j.LoggerFactory) SimpleDateFormat(java.text.SimpleDateFormat) Delivery(com.salesmanager.core.model.common.Delivery) StringUtils(org.apache.commons.lang3.StringUtils) ShippingQuote(com.salesmanager.core.model.shipping.ShippingQuote) ArrayList(java.util.ArrayList) EntityUtils(org.apache.http.util.EntityUtils) Inject(javax.inject.Inject) Language(com.salesmanager.core.model.reference.language.Language) BigDecimal(java.math.BigDecimal) MerchantStore(com.salesmanager.core.model.merchant.MerchantStore) Calendar(java.util.Calendar) Locale(java.util.Locale) CustomIntegrationConfiguration(com.salesmanager.core.model.system.CustomIntegrationConfiguration) Map(java.util.Map) IntegrationModule(com.salesmanager.core.model.system.IntegrationModule) Constants(com.salesmanager.core.business.constants.Constants) MeasureUnit(com.salesmanager.core.constants.MeasureUnit) CountryService(com.salesmanager.core.business.services.reference.country.CountryService) CloseableHttpClient(org.apache.http.impl.client.CloseableHttpClient) ShippingOption(com.salesmanager.core.model.shipping.ShippingOption) Logger(org.slf4j.Logger) Country(com.salesmanager.core.model.reference.country.Country) Digester(org.apache.commons.digester.Digester) HttpEntity(org.apache.http.HttpEntity) ModuleConfig(com.salesmanager.core.model.system.ModuleConfig) IOException(java.io.IOException) Reader(java.io.Reader) IntegrationException(com.salesmanager.core.modules.integration.IntegrationException) List(java.util.List) StringReader(java.io.StringReader) PackageDetails(com.salesmanager.core.model.shipping.PackageDetails) IntegrationConfiguration(com.salesmanager.core.model.system.IntegrationConfiguration) HttpGet(org.apache.http.client.methods.HttpGet) HttpResponse(org.apache.http.HttpResponse) ShippingConfiguration(com.salesmanager.core.model.shipping.ShippingConfiguration) ResponseHandler(org.apache.http.client.ResponseHandler) ShippingQuoteModule(com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule) HttpClients(org.apache.http.impl.client.HttpClients) ProductPriceUtils(com.salesmanager.core.business.utils.ProductPriceUtils) HttpEntity(org.apache.http.HttpEntity) HttpGet(org.apache.http.client.methods.HttpGet) Reader(java.io.Reader) StringReader(java.io.StringReader) ClientProtocolException(org.apache.http.client.ClientProtocolException) Language(com.salesmanager.core.model.reference.language.Language) Digester(org.apache.commons.digester.Digester) StringReader(java.io.StringReader) CloseableHttpClient(org.apache.http.impl.client.CloseableHttpClient) IntegrationException(com.salesmanager.core.modules.integration.IntegrationException) Calendar(java.util.Calendar) ModuleConfig(com.salesmanager.core.model.system.ModuleConfig) Date(java.util.Date) ClientProtocolException(org.apache.http.client.ClientProtocolException) IOException(java.io.IOException) IntegrationException(com.salesmanager.core.modules.integration.IntegrationException) ShippingOption(com.salesmanager.core.model.shipping.ShippingOption) Country(com.salesmanager.core.model.reference.country.Country) SimpleDateFormat(java.text.SimpleDateFormat) PackageDetails(com.salesmanager.core.model.shipping.PackageDetails)

Example 3 with ShippingQuote

use of com.salesmanager.core.model.shipping.ShippingQuote in project shopizer by shopizer-ecommerce.

the class ShippingMethodDecisionTest method validateShippingMethod.

@Test
@Ignore
public void validateShippingMethod() throws Exception {
    ShippingQuote quote = new ShippingQuote();
    PackageDetails pDetail = new PackageDetails();
    pDetail.setShippingHeight(20);
    pDetail.setShippingLength(10);
    pDetail.setShippingWeight(70);
    pDetail.setShippingWidth(78);
    List<PackageDetails> details = new ArrayList<PackageDetails>();
    details.add(pDetail);
    Delivery delivery = new Delivery();
    delivery.setAddress("358 Du Languedoc");
    delivery.setCity("Boucherville");
    delivery.setPostalCode("J4B 8J9");
    Country country = new Country();
    country.setIsoCode("CA");
    country.setName("Canada");
    // country.setIsoCode("US");
    // country.setName("United States");
    delivery.setCountry(country);
    Zone zone = new Zone();
    zone.setCode("QC");
    zone.setName("Quebec");
    // zone.setCode("NY");
    // zone.setName("New York");
    delivery.setZone(zone);
    IntegrationModule currentModule = new IntegrationModule();
    currentModule.setCode("canadapost");
    quote.setCurrentShippingModule(currentModule);
    quote.setShippingModuleCode(currentModule.getCode());
    IntegrationModule canadapost = new IntegrationModule();
    canadapost.setCode("canadapost");
    IntegrationModule ups = new IntegrationModule();
    ups.setCode("ups");
    IntegrationModule inhouse = new IntegrationModule();
    inhouse.setCode("customQuotesRules");
    List<IntegrationModule> allModules = new ArrayList<IntegrationModule>();
    allModules.add(canadapost);
    allModules.add(ups);
    allModules.add(inhouse);
    shippingMethodDecisionProcess.prePostProcessShippingQuotes(quote, details, null, delivery, null, null, null, currentModule, null, allModules, Locale.CANADA);
    System.out.println("Done : " + quote.getCurrentShippingModule() != null ? quote.getCurrentShippingModule().getCode() : currentModule.getCode());
}
Also used : ShippingQuote(com.salesmanager.core.model.shipping.ShippingQuote) Zone(com.salesmanager.core.model.reference.zone.Zone) ArrayList(java.util.ArrayList) Country(com.salesmanager.core.model.reference.country.Country) Delivery(com.salesmanager.core.model.common.Delivery) PackageDetails(com.salesmanager.core.model.shipping.PackageDetails) IntegrationModule(com.salesmanager.core.model.system.IntegrationModule) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 4 with ShippingQuote

use of com.salesmanager.core.model.shipping.ShippingQuote in project shopizer by shopizer-ecommerce.

the class ShippingQuoteByWeightTest method testGetCustomShippingQuotesByWeight.

@Ignore
public // @Test
void testGetCustomShippingQuotesByWeight() throws ServiceException {
    Language en = languageService.getByCode("en");
    Country country = countryService.getByCode("CA");
    Zone zone = zoneService.getByCode("QC");
    MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
    ProductType generalType = productTypeService.getProductType(ProductType.GENERAL_TYPE);
    // set valid store postal code
    store.setStorepostalcode("J4B-9J9");
    Product product = new Product();
    product.setProductHeight(new BigDecimal(4));
    product.setProductLength(new BigDecimal(3));
    product.setProductWidth(new BigDecimal(5));
    product.setProductWeight(new BigDecimal(8));
    product.setSku("TESTSKU");
    product.setType(generalType);
    product.setMerchantStore(store);
    // Product description
    ProductDescription description = new ProductDescription();
    description.setName("Product 1");
    description.setLanguage(en);
    description.setProduct(product);
    product.getDescriptions().add(description);
    productService.create(product);
    // productService.saveOrUpdate(product);
    // Availability
    ProductAvailability availability = new ProductAvailability();
    availability.setProductDateAvailable(new Date());
    availability.setProductQuantity(100);
    availability.setRegion("*");
    // associate with product
    availability.setProduct(product);
    product.getAvailabilities().add(availability);
    productAvailabilityService.create(availability);
    ProductPrice dprice = new ProductPrice();
    dprice.setDefaultPrice(true);
    dprice.setProductPriceAmount(new BigDecimal(29.99));
    dprice.setProductAvailability(availability);
    ProductPriceDescription dpd = new ProductPriceDescription();
    dpd.setName("Base price");
    dpd.setProductPrice(dprice);
    dpd.setLanguage(en);
    dprice.getDescriptions().add(dpd);
    availability.getPrices().add(dprice);
    productPriceService.create(dprice);
    // get product
    product = productService.getByCode("TESTSKU", en);
    // check the product
    Set<ProductAvailability> avails = product.getAvailabilities();
    for (ProductAvailability as : avails) {
        Set<ProductPrice> availabilityPrices = as.getPrices();
        for (ProductPrice ps : availabilityPrices) {
            System.out.println(ps.getProductPriceAmount().toString());
        }
    }
    // check availability
    Set<ProductPrice> availabilityPrices = availability.getPrices();
    for (ProductPrice ps : availabilityPrices) {
        System.out.println(ps.getProductPriceAmount().toString());
    }
    // configure shipping
    ShippingConfiguration shippingConfiguration = new ShippingConfiguration();
    // based on shipping or billing address
    shippingConfiguration.setShippingBasisType(ShippingBasisType.SHIPPING);
    shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
    // individual item pricing or box packaging (see unit test above)
    shippingConfiguration.setShippingPackageType(ShippingPackageType.ITEM);
    // only if package type is package
    shippingConfiguration.setBoxHeight(5);
    shippingConfiguration.setBoxLength(5);
    shippingConfiguration.setBoxWidth(5);
    shippingConfiguration.setBoxWeight(1);
    shippingConfiguration.setMaxWeight(10);
    List<String> supportedCountries = new ArrayList<String>();
    supportedCountries.add("CA");
    supportedCountries.add("US");
    supportedCountries.add("UK");
    supportedCountries.add("FR");
    shippingService.setSupportedCountries(store, supportedCountries);
    CustomShippingQuotesConfiguration customConfiguration = new CustomShippingQuotesConfiguration();
    customConfiguration.setModuleCode("weightBased");
    customConfiguration.setActive(true);
    CustomShippingQuotesRegion northRegion = new CustomShippingQuotesRegion();
    northRegion.setCustomRegionName("NORTH");
    List<String> countries = new ArrayList<String>();
    countries.add("CA");
    countries.add("US");
    northRegion.setCountries(countries);
    CustomShippingQuoteWeightItem caQuote4 = new CustomShippingQuoteWeightItem();
    caQuote4.setMaximumWeight(4);
    caQuote4.setPrice(new BigDecimal(20));
    CustomShippingQuoteWeightItem caQuote10 = new CustomShippingQuoteWeightItem();
    caQuote10.setMaximumWeight(10);
    caQuote10.setPrice(new BigDecimal(50));
    CustomShippingQuoteWeightItem caQuote100 = new CustomShippingQuoteWeightItem();
    caQuote100.setMaximumWeight(100);
    caQuote100.setPrice(new BigDecimal(120));
    List<CustomShippingQuoteWeightItem> quotes = new ArrayList<CustomShippingQuoteWeightItem>();
    quotes.add(caQuote4);
    quotes.add(caQuote10);
    quotes.add(caQuote100);
    northRegion.setQuoteItems(quotes);
    customConfiguration.getRegions().add(northRegion);
    // create an integration configuration - USPS
    IntegrationConfiguration configuration = new IntegrationConfiguration();
    configuration.setActive(true);
    configuration.setEnvironment(Environment.TEST.name());
    configuration.setModuleCode("weightBased");
    // configure module
    shippingService.saveShippingConfiguration(shippingConfiguration, store);
    // create the basic configuration
    shippingService.saveShippingQuoteModuleConfiguration(configuration, store);
    // and the custom configuration
    shippingService.saveCustomShippingConfiguration("weightBased", customConfiguration, store);
    // now create ShippingProduct
    ShippingProduct shippingProduct1 = new ShippingProduct(product);
    FinalPrice price = pricingService.calculateProductPrice(product);
    shippingProduct1.setFinalPrice(price);
    List<ShippingProduct> shippingProducts = new ArrayList<ShippingProduct>();
    shippingProducts.add(shippingProduct1);
    Customer customer = new Customer();
    customer.setMerchantStore(store);
    customer.setEmailAddress("test@test.com");
    customer.setGender(CustomerGender.M);
    customer.setDefaultLanguage(en);
    customer.setAnonymous(true);
    customer.setCompany("ifactory");
    customer.setDateOfBirth(new Date());
    customer.setNick("My nick");
    customer.setPassword("123456");
    Delivery delivery = new Delivery();
    delivery.setAddress("Shipping address");
    delivery.setCity("Boucherville");
    delivery.setCountry(country);
    delivery.setZone(zone);
    delivery.setPostalCode("J5C-6J4");
    // overwrite delivery to US
    /*	    delivery.setPostalCode("90002");
	    delivery.setCountry(us);
	    Zone california = zoneService.getByCode("CA");
	    delivery.setZone(california);*/
    Billing billing = new Billing();
    billing.setAddress("Billing address");
    billing.setCountry(country);
    billing.setZone(zone);
    billing.setPostalCode("J4B-8J9");
    billing.setFirstName("Carl");
    billing.setLastName("Samson");
    customer.setBilling(billing);
    customer.setDelivery(delivery);
    customerService.create(customer);
    // for correlation
    Long dummyCartId = 0L;
    ShippingQuote shippingQuote = shippingService.getShippingQuote(dummyCartId, store, delivery, shippingProducts, en);
    Assert.notNull(shippingQuote);
}
Also used : Customer(com.salesmanager.core.model.customer.Customer) ArrayList(java.util.ArrayList) ShippingProduct(com.salesmanager.core.model.shipping.ShippingProduct) Product(com.salesmanager.core.model.catalog.product.Product) ProductPrice(com.salesmanager.core.model.catalog.product.price.ProductPrice) ShippingConfiguration(com.salesmanager.core.model.shipping.ShippingConfiguration) Language(com.salesmanager.core.model.reference.language.Language) ProductAvailability(com.salesmanager.core.model.catalog.product.availability.ProductAvailability) CustomShippingQuoteWeightItem(com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuoteWeightItem) MerchantStore(com.salesmanager.core.model.merchant.MerchantStore) ProductPriceDescription(com.salesmanager.core.model.catalog.product.price.ProductPriceDescription) FinalPrice(com.salesmanager.core.model.catalog.product.price.FinalPrice) CustomShippingQuotesConfiguration(com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration) Zone(com.salesmanager.core.model.reference.zone.Zone) CustomShippingQuotesRegion(com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesRegion) IntegrationConfiguration(com.salesmanager.core.model.system.IntegrationConfiguration) ProductType(com.salesmanager.core.model.catalog.product.type.ProductType) ShippingProduct(com.salesmanager.core.model.shipping.ShippingProduct) BigDecimal(java.math.BigDecimal) Date(java.util.Date) ShippingQuote(com.salesmanager.core.model.shipping.ShippingQuote) Billing(com.salesmanager.core.model.common.Billing) Country(com.salesmanager.core.model.reference.country.Country) ProductDescription(com.salesmanager.core.model.catalog.product.description.ProductDescription) Delivery(com.salesmanager.core.model.common.Delivery) Ignore(org.junit.Ignore)

Example 5 with ShippingQuote

use of com.salesmanager.core.model.shipping.ShippingQuote in project shopizer by shopizer-ecommerce.

the class ShippingServiceImpl method getShippingQuote.

@Override
public ShippingQuote getShippingQuote(Long shoppingCartId, MerchantStore store, Delivery delivery, List<ShippingProduct> products, Language language) throws ServiceException {
    // ShippingConfiguration -> Global configuration of a given store
    // IntegrationConfiguration -> Configuration of a given module
    // IntegrationModule -> The concrete module as defined in integrationmodules.properties
    // delivery without postal code is accepted
    Validate.notNull(store, "MerchantStore must not be null");
    Validate.notNull(delivery, "Delivery must not be null");
    Validate.notEmpty(products, "products must not be empty");
    Validate.notNull(language, "Language must not be null");
    ShippingQuote shippingQuote = new ShippingQuote();
    ShippingQuoteModule shippingQuoteModule = null;
    try {
        if (StringUtils.isBlank(delivery.getPostalCode())) {
            shippingQuote.getWarnings().add("No postal code in delivery address");
            shippingQuote.setShippingReturnCode(ShippingQuote.NO_POSTAL_CODE);
        }
        // get configuration
        ShippingConfiguration shippingConfiguration = getShippingConfiguration(store);
        ShippingType shippingType = ShippingType.INTERNATIONAL;
        /**
         * get shipping origin *
         */
        ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
        if (shippingOrigin == null || !shippingOrigin.isActive()) {
            shippingOrigin = new ShippingOrigin();
            shippingOrigin.setAddress(store.getStoreaddress());
            shippingOrigin.setCity(store.getStorecity());
            shippingOrigin.setCountry(store.getCountry());
            shippingOrigin.setPostalCode(store.getStorepostalcode());
            shippingOrigin.setState(store.getStorestateprovince());
            shippingOrigin.setZone(store.getZone());
        }
        if (shippingConfiguration == null) {
            shippingConfiguration = new ShippingConfiguration();
        }
        if (shippingConfiguration.getShippingType() != null) {
            shippingType = shippingConfiguration.getShippingType();
        }
        // look if customer country code excluded
        Country shipCountry = delivery.getCountry();
        // a ship to country is required
        Validate.notNull(shipCountry, "Ship to Country cannot be null");
        Validate.notNull(store.getCountry(), "Store Country canot be null");
        if (shippingType.name().equals(ShippingType.NATIONAL.name())) {
            // customer country must match store country
            if (!shipCountry.getIsoCode().equals(store.getCountry().getIsoCode())) {
                shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY + " " + shipCountry.getIsoCode());
                return shippingQuote;
            }
        } else if (shippingType.name().equals(ShippingType.INTERNATIONAL.name())) {
            // customer shipping country code must be in accepted list
            List<String> supportedCountries = this.getSupportedCountries(store);
            if (!supportedCountries.contains(shipCountry.getIsoCode())) {
                shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY + " " + shipCountry.getIsoCode());
                return shippingQuote;
            }
        }
        // must have a shipping module configured
        Map<String, IntegrationConfiguration> modules = this.getShippingModulesConfigured(store);
        if (modules == null) {
            shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
            return shippingQuote;
        }
        /**
         * uses this module name *
         */
        String moduleName = null;
        IntegrationConfiguration configuration = null;
        for (String module : modules.keySet()) {
            moduleName = module;
            configuration = modules.get(module);
            // use the first active module
            if (configuration.isActive()) {
                shippingQuoteModule = shippingModules.get(module);
                if (shippingQuoteModule instanceof ShippingQuotePrePostProcessModule) {
                    shippingQuoteModule = null;
                    continue;
                } else {
                    break;
                }
            }
        }
        if (shippingQuoteModule == null) {
            shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
            return shippingQuote;
        }
        /**
         * merchant module configs *
         */
        List<IntegrationModule> shippingMethods = this.getShippingMethods(store);
        IntegrationModule shippingModule = null;
        for (IntegrationModule mod : shippingMethods) {
            if (mod.getCode().equals(moduleName)) {
                shippingModule = mod;
                break;
            }
        }
        /**
         * general module configs *
         */
        if (shippingModule == null) {
            shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
            return shippingQuote;
        }
        // calculate order total
        BigDecimal orderTotal = calculateOrderTotal(products, store);
        List<PackageDetails> packages = getPackagesDetails(products, store);
        // free shipping ?
        boolean freeShipping = false;
        if (shippingConfiguration.isFreeShippingEnabled()) {
            BigDecimal freeShippingAmount = shippingConfiguration.getOrderTotalFreeShipping();
            if (freeShippingAmount != null) {
                if (orderTotal.doubleValue() > freeShippingAmount.doubleValue()) {
                    if (shippingConfiguration.getFreeShippingType() == ShippingType.NATIONAL) {
                        if (store.getCountry().getIsoCode().equals(shipCountry.getIsoCode())) {
                            freeShipping = true;
                            shippingQuote.setFreeShipping(true);
                            shippingQuote.setFreeShippingAmount(freeShippingAmount);
                            return shippingQuote;
                        }
                    } else {
                        // international all
                        freeShipping = true;
                        shippingQuote.setFreeShipping(true);
                        shippingQuote.setFreeShippingAmount(freeShippingAmount);
                        return shippingQuote;
                    }
                }
            }
        }
        // handling fees
        BigDecimal handlingFees = shippingConfiguration.getHandlingFees();
        if (handlingFees != null) {
            shippingQuote.setHandlingFees(handlingFees);
        }
        // tax basis
        shippingQuote.setApplyTaxOnShipping(shippingConfiguration.isTaxOnShipping());
        Locale locale = languageService.toLocale(language, store);
        // also available distance calculation
        if (!CollectionUtils.isEmpty(shippingModulePreProcessors)) {
            for (ShippingQuotePrePostProcessModule preProcessor : shippingModulePreProcessors) {
                // System.out.println("Using pre-processor " + preProcessor.getModuleCode());
                preProcessor.prePostProcessShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, configuration, shippingModule, shippingConfiguration, shippingMethods, locale);
                // TODO switch module if required
                if (shippingQuote.getCurrentShippingModule() != null && !shippingQuote.getCurrentShippingModule().getCode().equals(shippingModule.getCode())) {
                    // determines the shipping module
                    shippingModule = shippingQuote.getCurrentShippingModule();
                    configuration = modules.get(shippingModule.getCode());
                    if (configuration != null) {
                        if (configuration.isActive()) {
                            moduleName = shippingModule.getCode();
                            shippingQuoteModule = this.shippingModules.get(shippingModule.getCode());
                            configuration = modules.get(shippingModule.getCode());
                        }
                    // TODO use default
                    }
                }
            }
        }
        // invoke module
        List<ShippingOption> shippingOptions = null;
        try {
            shippingOptions = shippingQuoteModule.getShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, configuration, shippingModule, shippingConfiguration, locale);
        } catch (Exception e) {
            LOGGER.error("Error while calculating shipping : " + e.getMessage(), e);
        /*				merchantLogService.save(
						new MerchantLog(store,
								"Can't process " + shippingModule.getModule()
								+ " -> "
								+ e.getMessage()));
				shippingQuote.setQuoteError(e.getMessage());
				shippingQuote.setShippingReturnCode(ShippingQuote.ERROR);
				return shippingQuote;*/
        }
        if (shippingOptions == null && !StringUtils.isBlank(delivery.getPostalCode())) {
            // absolutely need to use in this case store pickup or other default shipping quote
            shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY);
        }
        shippingQuote.setShippingModuleCode(moduleName);
        // filter shipping options
        ShippingOptionPriceType shippingOptionPriceType = shippingConfiguration.getShippingOptionPriceType();
        ShippingOption selectedOption = null;
        if (shippingOptions != null) {
            for (ShippingOption option : shippingOptions) {
                if (selectedOption == null) {
                    selectedOption = option;
                }
                // set price text
                String priceText = pricingService.getDisplayAmount(option.getOptionPrice(), store);
                option.setOptionPriceText(priceText);
                option.setShippingModuleCode(moduleName);
                if (StringUtils.isBlank(option.getOptionName())) {
                    String countryName = delivery.getCountry().getName();
                    if (countryName == null) {
                        Map<String, Country> deliveryCountries = countryService.getCountriesMap(language);
                        Country dCountry = deliveryCountries.get(delivery.getCountry().getIsoCode());
                        if (dCountry != null) {
                            countryName = dCountry.getName();
                        } else {
                            countryName = delivery.getCountry().getIsoCode();
                        }
                    }
                    option.setOptionName(countryName);
                }
                if (shippingOptionPriceType.name().equals(ShippingOptionPriceType.HIGHEST.name())) {
                    if (option.getOptionPrice().longValue() > selectedOption.getOptionPrice().longValue()) {
                        selectedOption = option;
                    }
                }
                if (shippingOptionPriceType.name().equals(ShippingOptionPriceType.LEAST.name())) {
                    if (option.getOptionPrice().longValue() < selectedOption.getOptionPrice().longValue()) {
                        selectedOption = option;
                    }
                }
                if (shippingOptionPriceType.name().equals(ShippingOptionPriceType.ALL.name())) {
                    if (option.getOptionPrice().longValue() < selectedOption.getOptionPrice().longValue()) {
                        selectedOption = option;
                    }
                }
            }
            shippingQuote.setSelectedShippingOption(selectedOption);
            if (selectedOption != null && !shippingOptionPriceType.name().equals(ShippingOptionPriceType.ALL.name())) {
                shippingOptions = new ArrayList<ShippingOption>();
                shippingOptions.add(selectedOption);
            }
        }
        /**
         * set final delivery address *
         */
        shippingQuote.setDeliveryAddress(delivery);
        shippingQuote.setShippingOptions(shippingOptions);
        // invoke pre processors
        if (!CollectionUtils.isEmpty(shippingModulePostProcessors)) {
            for (ShippingQuotePrePostProcessModule postProcessor : shippingModulePostProcessors) {
                // get module info
                // get module configuration
                IntegrationConfiguration integrationConfiguration = modules.get(postProcessor.getModuleCode());
                IntegrationModule postProcessModule = null;
                for (IntegrationModule mod : shippingMethods) {
                    if (mod.getCode().equals(postProcessor.getModuleCode())) {
                        postProcessModule = mod;
                        break;
                    }
                }
                IntegrationModule module = postProcessModule;
                if (integrationConfiguration != null) {
                    postProcessor.prePostProcessShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, integrationConfiguration, module, shippingConfiguration, shippingMethods, locale);
                }
            }
        }
        String ipAddress = null;
        UserContext context = UserContext.getCurrentInstance();
        if (context != null) {
            ipAddress = context.getIpAddress();
        }
        if (shippingQuote != null && CollectionUtils.isNotEmpty(shippingQuote.getShippingOptions())) {
            // save SHIPPING OPTIONS
            List<ShippingOption> finalShippingOptions = shippingQuote.getShippingOptions();
            for (ShippingOption option : finalShippingOptions) {
                // transform to Quote
                Quote q = new Quote();
                q.setCartId(shoppingCartId);
                q.setDelivery(delivery);
                if (!StringUtils.isBlank(ipAddress)) {
                    q.setIpAddress(ipAddress);
                }
                if (!StringUtils.isBlank(option.getEstimatedNumberOfDays())) {
                    try {
                        q.setEstimatedNumberOfDays(Integer.valueOf(option.getEstimatedNumberOfDays()));
                    } catch (Exception e) {
                        LOGGER.error("Cannot cast to integer " + option.getEstimatedNumberOfDays());
                    }
                }
                if (freeShipping) {
                    q.setFreeShipping(true);
                    q.setPrice(new BigDecimal(0));
                    q.setModule("FREE");
                    q.setOptionCode("FREE");
                    q.setOptionName("FREE");
                } else {
                    q.setModule(option.getShippingModuleCode());
                    q.setOptionCode(option.getOptionCode());
                    if (!StringUtils.isBlank(option.getOptionDeliveryDate())) {
                        try {
                            q.setOptionDeliveryDate(DateUtil.formatDate(option.getOptionDeliveryDate()));
                        } catch (Exception e) {
                            LOGGER.error("Cannot transform to date " + option.getOptionDeliveryDate());
                        }
                    }
                    q.setOptionName(option.getOptionName());
                    q.setOptionShippingDate(new Date());
                    q.setPrice(option.getOptionPrice());
                }
                if (handlingFees != null) {
                    q.setHandling(handlingFees);
                }
                q.setQuoteDate(new Date());
                shippingQuoteService.save(q);
                option.setShippingQuoteOptionId(q.getId());
            }
        }
    } catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        throw new ServiceException(e);
    }
    return shippingQuote;
}
Also used : Locale(java.util.Locale) ShippingConfiguration(com.salesmanager.core.model.shipping.ShippingConfiguration) List(java.util.List) ArrayList(java.util.ArrayList) IntegrationModule(com.salesmanager.core.model.system.IntegrationModule) ShippingType(com.salesmanager.core.model.shipping.ShippingType) UserContext(com.salesmanager.core.model.common.UserContext) CustomIntegrationConfiguration(com.salesmanager.core.model.system.CustomIntegrationConfiguration) IntegrationConfiguration(com.salesmanager.core.model.system.IntegrationConfiguration) BigDecimal(java.math.BigDecimal) ServiceException(com.salesmanager.core.business.exception.ServiceException) IntegrationException(com.salesmanager.core.modules.integration.IntegrationException) Date(java.util.Date) ShippingOption(com.salesmanager.core.model.shipping.ShippingOption) Quote(com.salesmanager.core.model.shipping.Quote) ShippingQuote(com.salesmanager.core.model.shipping.ShippingQuote) ShippingOptionPriceType(com.salesmanager.core.model.shipping.ShippingOptionPriceType) ShippingQuote(com.salesmanager.core.model.shipping.ShippingQuote) ServiceException(com.salesmanager.core.business.exception.ServiceException) ShippingQuoteModule(com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule) Country(com.salesmanager.core.model.reference.country.Country) ShippingQuotePrePostProcessModule(com.salesmanager.core.modules.integration.shipping.model.ShippingQuotePrePostProcessModule) ShippingOrigin(com.salesmanager.core.model.shipping.ShippingOrigin) PackageDetails(com.salesmanager.core.model.shipping.PackageDetails)

Aggregations

ShippingQuote (com.salesmanager.core.model.shipping.ShippingQuote)14 Delivery (com.salesmanager.core.model.common.Delivery)9 Country (com.salesmanager.core.model.reference.country.Country)9 ShippingOption (com.salesmanager.core.model.shipping.ShippingOption)8 ArrayList (java.util.ArrayList)7 MerchantStore (com.salesmanager.core.model.merchant.MerchantStore)6 Billing (com.salesmanager.core.model.common.Billing)5 Customer (com.salesmanager.core.model.customer.Customer)5 Language (com.salesmanager.core.model.reference.language.Language)5 ShippingSummary (com.salesmanager.core.model.shipping.ShippingSummary)5 ReadableShippingSummary (com.salesmanager.shop.model.order.shipping.ReadableShippingSummary)5 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)5 ServiceException (com.salesmanager.core.business.exception.ServiceException)4 Zone (com.salesmanager.core.model.reference.zone.Zone)4 PackageDetails (com.salesmanager.core.model.shipping.PackageDetails)4 ShippingConfiguration (com.salesmanager.core.model.shipping.ShippingConfiguration)4 ShippingOrigin (com.salesmanager.core.model.shipping.ShippingOrigin)4 ShippingProduct (com.salesmanager.core.model.shipping.ShippingProduct)4 IntegrationConfiguration (com.salesmanager.core.model.system.IntegrationConfiguration)4 IntegrationModule (com.salesmanager.core.model.system.IntegrationModule)4