use of com.salesmanager.core.model.shipping.ShippingConfiguration in project shopizer by shopizer-ecommerce.
the class PackingBox method getBoxPackagesDetails.
@Override
public List<PackageDetails> getBoxPackagesDetails(List<ShippingProduct> products, MerchantStore store) throws ServiceException {
if (products == null) {
throw new ServiceException("Product list cannot be null !!");
}
double width = 0;
double length = 0;
double height = 0;
double weight = 0;
double maxweight = 0;
// int treshold = 0;
ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
if (shippingConfiguration == null) {
throw new ServiceException("ShippingConfiguration not found for merchant " + store.getCode());
}
width = (double) shippingConfiguration.getBoxWidth();
length = (double) shippingConfiguration.getBoxLength();
height = (double) shippingConfiguration.getBoxHeight();
weight = shippingConfiguration.getBoxWeight();
maxweight = shippingConfiguration.getMaxWeight();
List<PackageDetails> boxes = new ArrayList<PackageDetails>();
// maximum number of boxes
int maxBox = 100;
int iterCount = 0;
List<Product> individualProducts = new ArrayList<Product>();
// need to put items individually
for (ShippingProduct shippingProduct : products) {
Product product = shippingProduct.getProduct();
if (product.isProductVirtual()) {
continue;
}
int qty = shippingProduct.getQuantity();
Set<ProductAttribute> attrs = shippingProduct.getProduct().getAttributes();
// set attributes values
BigDecimal w = product.getProductWeight();
BigDecimal h = product.getProductHeight();
BigDecimal l = product.getProductLength();
BigDecimal wd = product.getProductWidth();
if (w == null) {
w = new BigDecimal(defaultWeight);
}
if (h == null) {
h = new BigDecimal(defaultHeight);
}
if (l == null) {
l = new BigDecimal(defaultLength);
}
if (wd == null) {
wd = new BigDecimal(defaultWidth);
}
if (attrs != null && attrs.size() > 0) {
for (ProductAttribute attribute : attrs) {
if (attribute.getProductAttributeWeight() != null) {
w = w.add(attribute.getProductAttributeWeight());
}
}
}
if (qty > 1) {
for (int i = 1; i <= qty; i++) {
Product temp = new Product();
temp.setProductHeight(h);
temp.setProductLength(l);
temp.setProductWidth(wd);
temp.setProductWeight(w);
temp.setAttributes(product.getAttributes());
temp.setDescriptions(product.getDescriptions());
individualProducts.add(temp);
}
} else {
Product temp = new Product();
temp.setProductHeight(h);
temp.setProductLength(l);
temp.setProductWidth(wd);
temp.setProductWeight(w);
temp.setAttributes(product.getAttributes());
temp.setDescriptions(product.getDescriptions());
individualProducts.add(temp);
}
iterCount++;
}
if (iterCount == 0) {
return null;
}
int productCount = individualProducts.size();
List<PackingBox> boxesList = new ArrayList<PackingBox>();
// start the creation of boxes
PackingBox box = new PackingBox();
// set box max volume
double maxVolume = width * length * height;
if (maxVolume == 0 || maxweight == 0) {
merchantLogService.save(new MerchantLog(store, "shipping", "Check shipping box configuration, it has a volume of " + maxVolume + " and a maximum weight of " + maxweight + ". Those values must be greater than 0."));
throw new ServiceException("Product configuration exceeds box configuraton");
}
box.setVolumeLeft(maxVolume);
box.setWeightLeft(maxweight);
// assign first box
boxesList.add(box);
// int boxCount = 1;
List<Product> assignedProducts = new ArrayList<Product>();
// calculate the volume for the next object
if (assignedProducts.size() > 0) {
individualProducts.removeAll(assignedProducts);
assignedProducts = new ArrayList<Product>();
}
boolean productAssigned = false;
for (Product p : individualProducts) {
// Set<ProductAttribute> attributes = p.getAttributes();
productAssigned = false;
double productWeight = p.getProductWeight().doubleValue();
// validate if product fits in the box
if (p.getProductWidth().doubleValue() > width || p.getProductHeight().doubleValue() > height || p.getProductLength().doubleValue() > length) {
// log message to customer
merchantLogService.save(new MerchantLog(store, "shipping", "Product " + p.getSku() + " has a demension larger than the box size specified. Will use per item calculation."));
throw new ServiceException("Product configuration exceeds box configuraton");
}
if (productWeight > maxweight) {
merchantLogService.save(new MerchantLog(store, "shipping", "Product " + p.getSku() + " has a weight larger than the box maximum weight specified. Will use per item calculation."));
throw new ServiceException("Product configuration exceeds box configuraton");
}
double productVolume = (p.getProductWidth().doubleValue() * p.getProductHeight().doubleValue() * p.getProductLength().doubleValue());
if (productVolume == 0) {
merchantLogService.save(new MerchantLog(store, "shipping", "Product " + p.getSku() + " has one of the dimension set to 0 and therefore cannot calculate the volume"));
throw new ServiceException("Product configuration exceeds box configuraton");
}
if (productVolume > maxVolume) {
throw new ServiceException("Product configuration exceeds box configuraton");
}
// Iterator boxIter = boxesList.iterator();
for (PackingBox pbox : boxesList) {
double volumeLeft = pbox.getVolumeLeft();
double weightLeft = pbox.getWeightLeft();
if ((volumeLeft * .75) >= productVolume && pbox.getWeightLeft() >= productWeight) {
// fit the item
// in this
// box
// fit in the current box
volumeLeft = volumeLeft - productVolume;
pbox.setVolumeLeft(volumeLeft);
weightLeft = weightLeft - productWeight;
pbox.setWeightLeft(weightLeft);
assignedProducts.add(p);
productCount--;
double w = pbox.getWeight();
w = w + productWeight;
pbox.setWeight(w);
productAssigned = true;
maxBox--;
break;
}
}
if (!productAssigned) {
// create a new box
box = new PackingBox();
// set box max volume
box.setVolumeLeft(maxVolume);
box.setWeightLeft(maxweight);
boxesList.add(box);
double volumeLeft = box.getVolumeLeft() - productVolume;
box.setVolumeLeft(volumeLeft);
double weightLeft = box.getWeightLeft() - productWeight;
box.setWeightLeft(weightLeft);
assignedProducts.add(p);
productCount--;
double w = box.getWeight();
w = w + productWeight;
box.setWeight(w);
maxBox--;
}
}
// now prepare the shipping info
// number of boxes
// Iterator ubIt = usedBoxesList.iterator();
System.out.println("###################################");
System.out.println("Number of boxes " + boxesList.size());
System.out.println("###################################");
for (PackingBox pb : boxesList) {
PackageDetails details = new PackageDetails();
details.setShippingHeight(height);
details.setShippingLength(length);
details.setShippingWeight(weight + box.getWeight());
details.setShippingWidth(width);
details.setItemName(store.getCode());
boxes.add(details);
}
return boxes;
}
use of com.salesmanager.core.model.shipping.ShippingConfiguration 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();
}
}
}
use of com.salesmanager.core.model.shipping.ShippingConfiguration 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);
}
use of com.salesmanager.core.model.shipping.ShippingConfiguration 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;
}
use of com.salesmanager.core.model.shipping.ShippingConfiguration in project shopizer by shopizer-ecommerce.
the class ShippingFacadeImpl method getDbConfig.
private ShippingConfiguration getDbConfig(MerchantStore store) {
try {
// get original configuration
ShippingConfiguration config = shippingService.getShippingConfiguration(store);
if (config == null) {
config = new ShippingConfiguration();
config.setShippingType(ShippingType.INTERNATIONAL);
}
return config;
} catch (ServiceException e) {
LOGGER.error("Error while getting expedition configuration", e);
throw new ServiceRuntimeException("Error while getting Expedition configuration for store[" + store.getCode() + "]", e);
}
}
Aggregations