package com.salesmanager.core.business.modules.integration.shipping.impl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang.Validate;
import com.salesmanager.core.business.services.system.MerchantConfigurationService;
import com.salesmanager.core.business.utils.ProductPriceUtils;
import com.salesmanager.core.model.common.Delivery;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.shipping.PackageDetails;
import com.salesmanager.core.model.shipping.ShippingConfiguration;
import com.salesmanager.core.model.shipping.ShippingOption;
import com.salesmanager.core.model.shipping.ShippingOrigin;
import com.salesmanager.core.model.shipping.ShippingQuote;
import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
import com.salesmanager.core.model.system.IntegrationConfiguration;
import com.salesmanager.core.model.system.IntegrationModule;
import com.salesmanager.core.modules.integration.IntegrationException;
import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
import com.salesmanager.core.modules.integration.shipping.model.ShippingQuotePrePostProcessModule;
/**
* Store pick up shipping module
*
* Requires a configuration of a message note to be printed to the client
* and a price for calculation (should be configured to 0)
*
* Calculates a ShippingQuote with a price set to the price configured
* @author carlsamson
*
*/
public class StorePickupShippingQuote implements ShippingQuoteModule, ShippingQuotePrePostProcessModule {
public final static String MODULE_CODE = "storePickUp";
@Inject
private MerchantConfigurationService merchantConfigurationService;
@Inject
private ProductPriceUtils productPriceUtils;
@Override
public void validateModuleConfiguration(
IntegrationConfiguration integrationConfiguration,
MerchantStore store) throws IntegrationException {
List<String> errorFields = null;
//validate integrationKeys['account']
Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
//if(keys==null || StringUtils.isBlank(keys.get("price"))) {
if(keys==null) {
errorFields = new ArrayList<String>();
errorFields.add("price");
} else {
//validate it can be parsed to BigDecimal
try {
BigDecimal price = new BigDecimal(keys.get("price"));
} catch(Exception e) {
errorFields = new ArrayList<String>();
errorFields.add("price");
}
}
//if(keys==null || StringUtils.isBlank(keys.get("note"))) {
if(keys==null) {
errorFields = new ArrayList<String>();
errorFields.add("note");
}
if(errorFields!=null) {
IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
ex.setErrorFields(errorFields);
throw ex;
}
}
@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 {
// TODO Auto-generated method stub
return null;
}
@Override
public CustomIntegrationConfiguration getCustomModuleConfiguration(
MerchantStore store) throws IntegrationException {
// TODO Auto-generated method stub
return null;
}
@Override
public void prePostProcessShippingQuotes(ShippingQuote quote,
List<PackageDetails> packages, BigDecimal orderTotal,
Delivery delivery, ShippingOrigin origin, MerchantStore store,
IntegrationConfiguration globalShippingConfiguration,
IntegrationModule currentModule,
ShippingConfiguration shippingConfiguration,
List<IntegrationModule> allModules, Locale locale)
throws IntegrationException {
Validate.notNull(globalShippingConfiguration, "IntegrationConfiguration must not be null for StorePickUp");
try {
String region = null;
String price = globalShippingConfiguration.getIntegrationKeys().get("price");
if(delivery.getZone()!=null) {
region = delivery.getZone().getCode();
} else {
region = delivery.getState();
}
ShippingOption shippingOption = new ShippingOption();
shippingOption.setShippingModuleCode(MODULE_CODE);
shippingOption.setOptionCode(MODULE_CODE);
shippingOption.setOptionId(new StringBuilder().append(MODULE_CODE).append("_").append(region).toString());
shippingOption.setOptionPrice(productPriceUtils.getAmount(price));
shippingOption.setOptionPriceText(productPriceUtils.getStoreFormatedAmountWithCurrency(store, productPriceUtils.getAmount(price)));
List<ShippingOption> options = quote.getShippingOptions();
if(options == null) {
options = new ArrayList<ShippingOption>();
quote.setShippingOptions(options);
}
options.add(shippingOption);
if(quote.getSelectedShippingOption()==null) {
quote.setSelectedShippingOption(shippingOption);
}
} catch (Exception e) {
throw new IntegrationException(e);
}
}
@Override
public String getModuleCode() {
// TODO Auto-generated method stub
return MODULE_CODE;
}
}