package com.salesmanager.shop.populator.customer; import java.util.Map; import com.salesmanager.core.business.exception.ConversionException; import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService; import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService; import com.salesmanager.core.business.services.reference.country.CountryService; import com.salesmanager.core.business.services.reference.language.LanguageService; import com.salesmanager.core.business.services.reference.zone.ZoneService; import com.salesmanager.core.business.utils.AbstractDataPopulator; import com.salesmanager.core.model.common.Billing; import com.salesmanager.core.model.common.Delivery; import com.salesmanager.core.model.customer.Customer; import com.salesmanager.core.model.customer.attribute.CustomerAttribute; import com.salesmanager.core.model.customer.attribute.CustomerOption; import com.salesmanager.core.model.customer.attribute.CustomerOptionValue; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.country.Country; import com.salesmanager.core.model.reference.language.Language; import com.salesmanager.core.model.reference.zone.Zone; import com.salesmanager.shop.model.customer.Address; import com.salesmanager.shop.model.customer.PersistableCustomer; import com.salesmanager.shop.model.customer.attribute.PersistableCustomerAttribute; import org.apache.commons.lang.Validate; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CustomerPopulator extends AbstractDataPopulator<PersistableCustomer, Customer> { protected static final Logger LOG=LoggerFactory.getLogger( CustomerPopulator.class ); private CountryService countryService; private ZoneService zoneService; private LanguageService languageService; private CustomerOptionService customerOptionService; private CustomerOptionValueService customerOptionValueService; /** * Creates a Customer entity ready to be saved */ @Override public Customer populate(PersistableCustomer source, Customer target, MerchantStore store, Language language) throws ConversionException { Validate.notNull(customerOptionService, "Requires to set CustomerOptionService"); Validate.notNull(customerOptionValueService, "Requires to set CustomerOptionValueService"); Validate.notNull(zoneService, "Requires to set ZoneService"); Validate.notNull(countryService, "Requires to set CountryService"); Validate.notNull(languageService, "Requires to set LanguageService"); try { if(source.getId() !=null && source.getId()>0){ target.setId( source.getId() ); } if(!StringUtils.isBlank(source.getEncodedPassword())) { target.setPassword(source.getEncodedPassword()); target.setAnonymous(false); } target.setEmailAddress(source.getEmailAddress()); target.setNick(source.getUserName()); if(source.getGender()!=null && target.getGender()==null) { target.setGender( com.salesmanager.core.model.customer.CustomerGender.valueOf( source.getGender() ) ); } if(target.getGender()==null) { target.setGender( com.salesmanager.core.model.customer.CustomerGender.M); } Map<String,Country> countries = countryService.getCountriesMap(language); Map<String,Zone> zones = zoneService.getZones(language); target.setMerchantStore( store ); Address sourceBilling = source.getBilling(); if(sourceBilling!=null) { Billing billing = new Billing(); billing.setAddress(sourceBilling.getAddress()); billing.setCity(sourceBilling.getCity()); billing.setCompany(sourceBilling.getCompany()); //billing.setCountry(country); billing.setFirstName(sourceBilling.getFirstName()); billing.setLastName(sourceBilling.getLastName()); billing.setTelephone(sourceBilling.getPhone()); billing.setPostalCode(sourceBilling.getPostalCode()); billing.setState(sourceBilling.getStateProvince()); Country billingCountry = null; if(!StringUtils.isBlank(sourceBilling.getCountry())) { billingCountry = countries.get(sourceBilling.getCountry()); if(billingCountry==null) { throw new ConversionException("Unsuported country code " + sourceBilling.getCountry()); } billing.setCountry(billingCountry); } if(billingCountry!=null && !StringUtils.isBlank(sourceBilling.getZone())) { Zone zone = zoneService.getByCode(sourceBilling.getZone(), billingCountry); if(zone==null) { throw new ConversionException("Unsuported zone code " + sourceBilling.getZone()); } Zone zoneDescription = zones.get(zone.getCode()); billing.setZone(zoneDescription); } target.setBilling(billing); } if(target.getBilling() ==null && source.getBilling()!=null){ LOG.info( "Setting default values for billing" ); Billing billing = new Billing(); Country billingCountry = null; if(StringUtils.isNotBlank( source.getBilling().getCountry() )) { billingCountry = countries.get(source.getBilling().getCountry()); if(billingCountry==null) { throw new ConversionException("Unsuported country code " + sourceBilling.getCountry()); } billing.setCountry(billingCountry); target.setBilling( billing ); } } Address sourceShipping = source.getDelivery(); if(sourceShipping!=null) { Delivery delivery = new Delivery(); delivery.setAddress(sourceShipping.getAddress()); delivery.setCity(sourceShipping.getCity()); delivery.setCompany(sourceShipping.getCompany()); delivery.setFirstName(sourceShipping.getFirstName()); delivery.setLastName(sourceShipping.getLastName()); delivery.setTelephone(sourceShipping.getPhone()); delivery.setPostalCode(sourceShipping.getPostalCode()); delivery.setState(sourceShipping.getStateProvince()); Country deliveryCountry = null; if(!StringUtils.isBlank(sourceShipping.getCountry())) { deliveryCountry = countries.get(sourceShipping.getCountry()); if(deliveryCountry==null) { throw new ConversionException("Unsuported country code " + sourceShipping.getCountry()); } delivery.setCountry(deliveryCountry); } if(deliveryCountry!=null && !StringUtils.isBlank(sourceShipping.getZone())) { Zone zone = zoneService.getByCode(sourceShipping.getZone(), deliveryCountry); if(zone==null) { throw new ConversionException("Unsuported zone code " + sourceShipping.getZone()); } Zone zoneDescription = zones.get(zone.getCode()); delivery.setZone(zoneDescription); } target.setDelivery(delivery); } if(target.getDelivery() ==null && source.getDelivery()!=null){ LOG.info( "Setting default value for delivery" ); Delivery delivery = new Delivery(); Country deliveryCountry = null; if(StringUtils.isNotBlank( source.getDelivery().getCountry() )) { deliveryCountry = countries.get(source.getDelivery().getCountry()); if(deliveryCountry==null) { throw new ConversionException("Unsuported country code " + sourceShipping.getCountry()); } delivery.setCountry(deliveryCountry); target.setDelivery( delivery ); } } if(source.getAttributes()!=null) { for(PersistableCustomerAttribute attr : source.getAttributes()) { CustomerOption customerOption = customerOptionService.getById(attr.getCustomerOption().getId()); if(customerOption==null) { throw new ConversionException("Customer option id " + attr.getCustomerOption().getId() + " does not exist"); } CustomerOptionValue customerOptionValue = customerOptionValueService.getById(attr.getCustomerOptionValue().getId()); if(customerOptionValue==null) { throw new ConversionException("Customer option value id " + attr.getCustomerOptionValue().getId() + " does not exist"); } if(customerOption.getMerchantStore().getId().intValue()!=store.getId().intValue()) { throw new ConversionException("Invalid customer option id "); } if(customerOptionValue.getMerchantStore().getId().intValue()!=store.getId().intValue()) { throw new ConversionException("Invalid customer option value id "); } CustomerAttribute attribute = new CustomerAttribute(); attribute.setCustomer(target); attribute.setCustomerOption(customerOption); attribute.setCustomerOptionValue(customerOptionValue); attribute.setTextValue(attr.getTextValue()); target.getAttributes().add(attribute); } } if(target.getDefaultLanguage()==null) { Language lang = languageService.getByCode(source.getLanguage()); if(lang==null) { lang = store.getDefaultLanguage(); } target.setDefaultLanguage(lang); } } catch (Exception e) { throw new ConversionException(e); } return target; } @Override protected Customer createTarget() { return new Customer(); } public void setCustomerOptionService(CustomerOptionService customerOptionService) { this.customerOptionService = customerOptionService; } public CustomerOptionService getCustomerOptionService() { return customerOptionService; } public void setCustomerOptionValueService(CustomerOptionValueService customerOptionValueService) { this.customerOptionValueService = customerOptionValueService; } public CustomerOptionValueService getCustomerOptionValueService() { return customerOptionValueService; } public CountryService getCountryService() { return countryService; } public void setCountryService(CountryService countryService) { this.countryService = countryService; } public ZoneService getZoneService() { return zoneService; } public void setZoneService(ZoneService zoneService) { this.zoneService = zoneService; } public LanguageService getLanguageService() { return languageService; } public void setLanguageService(LanguageService languageService) { this.languageService = languageService; } }