/** * Most of the code in the Qalingo project is copyrighted Hoteia and licensed * under the Apache License Version 2.0 (release version 0.8.0) * http://www.apache.org/licenses/LICENSE-2.0 * * Copyright (c) Hoteia, 2012-2014 * http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com * */ package org.hoteia.qalingo.core.service; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.UUID; import javax.persistence.PersistenceException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.Hibernate; import org.hoteia.qalingo.core.domain.AbstractPaymentGateway; import org.hoteia.qalingo.core.domain.Asset; import org.hoteia.qalingo.core.domain.AttributeDefinition; import org.hoteia.qalingo.core.domain.Cart; import org.hoteia.qalingo.core.domain.CartItem; import org.hoteia.qalingo.core.domain.CartItemTax; import org.hoteia.qalingo.core.domain.CatalogCategoryMaster; import org.hoteia.qalingo.core.domain.CatalogCategoryMasterAttribute; import org.hoteia.qalingo.core.domain.CatalogCategoryVirtual; import org.hoteia.qalingo.core.domain.CatalogCategoryVirtualAttribute; import org.hoteia.qalingo.core.domain.CmsMenu; import org.hoteia.qalingo.core.domain.CmsMenuAttribute; import org.hoteia.qalingo.core.domain.Company; import org.hoteia.qalingo.core.domain.Customer; import org.hoteia.qalingo.core.domain.DeliveryMethod; import org.hoteia.qalingo.core.domain.Email; import org.hoteia.qalingo.core.domain.EngineSetting; import org.hoteia.qalingo.core.domain.EngineSettingValue; import org.hoteia.qalingo.core.domain.Localization; import org.hoteia.qalingo.core.domain.MarketArea; import org.hoteia.qalingo.core.domain.OrderAddress; import org.hoteia.qalingo.core.domain.OrderItem; import org.hoteia.qalingo.core.domain.OrderPurchase; import org.hoteia.qalingo.core.domain.OrderShipment; import org.hoteia.qalingo.core.domain.OrderTax; import org.hoteia.qalingo.core.domain.PaymentGatewayOption; import org.hoteia.qalingo.core.domain.ProductBrand; import org.hoteia.qalingo.core.domain.ProductBrandAttribute; import org.hoteia.qalingo.core.domain.ProductMarketing; import org.hoteia.qalingo.core.domain.ProductSku; import org.hoteia.qalingo.core.domain.Retailer; import org.hoteia.qalingo.core.domain.RetailerAddress; import org.hoteia.qalingo.core.domain.Store; import org.hoteia.qalingo.core.domain.Tax; import org.hoteia.qalingo.core.domain.User; import org.hoteia.qalingo.core.domain.UserCredential; import org.hoteia.qalingo.core.domain.Warehouse; import org.hoteia.qalingo.core.domain.WarehouseMarketAreaRel; import org.hoteia.qalingo.core.domain.Store_; import org.hoteia.qalingo.core.domain.CompanyStoreRel_; import org.hoteia.qalingo.core.domain.CompanyStorePk_; import org.hoteia.qalingo.core.domain.enumtype.BoUrls; import org.hoteia.qalingo.core.domain.enumtype.OrderStatus; import org.hoteia.qalingo.core.email.bean.OrderConfirmationEmailBean; import org.hoteia.qalingo.core.email.bean.OrderItemEmailBean; import org.hoteia.qalingo.core.email.bean.UserForgottenPasswordEmailBean; import org.hoteia.qalingo.core.email.bean.UserNewAccountConfirmationEmailBean; import org.hoteia.qalingo.core.email.bean.UserResetPasswordConfirmationEmailBean; import org.hoteia.qalingo.core.exception.UniqueConstraintCodeCategoryException; import org.hoteia.qalingo.core.fetchplan.FetchPlan; import org.hoteia.qalingo.core.fetchplan.SpecificFetchMode; import org.hoteia.qalingo.core.i18n.enumtype.ScopeWebMessage; import org.hoteia.qalingo.core.i18n.message.CoreMessageSource; import org.hoteia.qalingo.core.security.helper.SecurityUtil; import org.hoteia.qalingo.core.util.CoreUtil; import org.hoteia.qalingo.core.web.mvc.form.AssetForm; import org.hoteia.qalingo.core.web.mvc.form.AttributeContextBean; import org.hoteia.qalingo.core.web.mvc.form.CatalogCategoryForm; import org.hoteia.qalingo.core.web.mvc.form.CmsMenuForm; import org.hoteia.qalingo.core.web.mvc.form.CompanyForm; import org.hoteia.qalingo.core.web.mvc.form.CustomerForm; import org.hoteia.qalingo.core.web.mvc.form.DeliveryMethodForm; import org.hoteia.qalingo.core.web.mvc.form.EngineSettingForm; import org.hoteia.qalingo.core.web.mvc.form.EngineSettingValueForm; import org.hoteia.qalingo.core.web.mvc.form.ForgottenPasswordForm; import org.hoteia.qalingo.core.web.mvc.form.MultipleTextBean; import org.hoteia.qalingo.core.web.mvc.form.PaymentGatewayForm; import org.hoteia.qalingo.core.web.mvc.form.ProductBrandForm; import org.hoteia.qalingo.core.web.mvc.form.ProductMarketingForm; import org.hoteia.qalingo.core.web.mvc.form.ProductSkuForm; import org.hoteia.qalingo.core.web.mvc.form.ResetPasswordForm; import org.hoteia.qalingo.core.web.mvc.form.RetailerForm; import org.hoteia.qalingo.core.web.mvc.form.StoreForm; import org.hoteia.qalingo.core.web.mvc.form.TaxForm; import org.hoteia.qalingo.core.web.mvc.form.UserForm; import org.hoteia.qalingo.core.web.mvc.form.WarehouseForm; import org.hoteia.qalingo.core.web.resolver.RequestData; import org.hoteia.qalingo.core.web.util.RequestUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @Service("webBackofficeService") @Transactional public class WebBackofficeService { private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired protected MarketService marketService; @Autowired protected LocalizationService localizationService; @Autowired protected UserService userService; @Autowired protected CustomerService customerService; @Autowired protected CatalogCategoryService catalogCategoryService; @Autowired protected ProductService productService; @Autowired protected RetailerService retailerService; @Autowired protected WarehouseService warehouseService; @Autowired protected DeliveryMethodService deliveryMethodService; @Autowired protected CartService cartService; @Autowired protected OrderPurchaseService orderPurchaseService; @Autowired protected TaxService taxService; @Autowired protected AttributeService attributeService; @Autowired protected EngineSettingService engineSettingService; @Autowired protected PaymentGatewayService paymentGatewayService; @Autowired protected CmsContentService cmsContentService; @Autowired protected EmailService emailService; @Autowired protected CoreMessageSource coreMessageSource; @Autowired protected BackofficeUrlService backofficeUrlService; @Autowired protected ReferentialDataService referentialDataService; @Autowired protected RequestUtil requestUtil; @Autowired protected SecurityUtil securityUtil; public OrderPurchase checkoutB2B(final User user, final Cart cart) throws Exception { Long marketAreaId = cart.getMarketAreaId(); Set<DeliveryMethod> deliveryMethods = cart.getDeliveryMethods(); Set<CartItem> cartItems = cart.getCartItems(); OrderPurchase orderPurchase = new OrderPurchase(); // ORDER NUMBER IS CREATE BY DAO orderPurchase.setStatus(OrderStatus.ORDER_STATUS_PENDING.getPropertyKey()); orderPurchase.setType(cart.getType()); orderPurchase.setCurrency(cart.getCurrency()); orderPurchase.setMarketAreaId(cart.getMarketAreaId()); orderPurchase.setRetailerId(cart.getRetailerId()); orderPurchase.setLocalizationId(cart.getLocalizationId()); orderPurchase.setUser(user); List<SpecificFetchMode> storeSpecificFetchplans = new ArrayList<SpecificFetchMode>(); storeSpecificFetchplans.add(new SpecificFetchMode(Store_.attributes.getName())); storeSpecificFetchplans.add(new SpecificFetchMode(Store_.companyStoreRels.getName() )); storeSpecificFetchplans.add(new SpecificFetchMode(Store_.companyStoreRels.getName() + "." + CompanyStoreRel_.pk.getName())); storeSpecificFetchplans.add(new SpecificFetchMode(Store_.companyStoreRels.getName() + "." + CompanyStoreRel_.pk.getName() + "." + CompanyStorePk_.company.getName())); FetchPlan storeFetchPlan = new FetchPlan(storeSpecificFetchplans); List<Long> storeIds = retailerService.findStoreIdsByUserId(user.getId()); List<Store> stores = new ArrayList<Store>(); for (Long storeId : storeIds) { stores.add(retailerService.getStoreById(storeId, storeFetchPlan)); } // SANITY CHECK if(stores == null || stores.isEmpty()){ logger.error("Checkout an order with a user who has no stores! User id: " + user.getId() + ", Cart id: " + cart.getId()); } for (Store store : stores) { if (store.getId().equals(cart.getBillingAddressId())) { OrderAddress billingAddress = new OrderAddress(); BeanUtils.copyProperties(store, billingAddress); billingAddress.setId(null); billingAddress.setCompanyName(store.getName()); orderPurchase.setBillingAddress(billingAddress); orderPurchase.setUserStoreId(store.getId()); } if (store.getId().equals(cart.getShippingAddressId())) { OrderAddress shippingAddress = new OrderAddress(); BeanUtils.copyProperties(store, shippingAddress); shippingAddress.setId(null); shippingAddress.setCompanyName(store.getCompany().getName()); orderPurchase.setShippingAddress(shippingAddress); } } // SHIPMENT Set<OrderShipment> orderShipments = new HashSet<OrderShipment>(); // SANITY CHECK if(deliveryMethods == null || deliveryMethods.isEmpty()){ logger.error("Checkout an order with a cart who has no deliveryMethods! User id: " + user.getId() + ", Cart id: " + cart.getId()); } if (deliveryMethods != null) { for (DeliveryMethod deliveryMethod : deliveryMethods) { OrderShipment orderShipment = new OrderShipment(); orderShipment.setName(deliveryMethod.getName()); orderShipment.setExpectedDeliveryDate(null); orderShipment.setDeliveryMethodId(deliveryMethod.getId()); orderShipment.setPrice(deliveryMethod.getPrice(cart.getCurrency().getId())); Set<OrderItem> orderItems = new HashSet<OrderItem>(); for (CartItem cartItem : cartItems) { OrderItem orderItem = new OrderItem(); orderItem.setCurrency(cart.getCurrency()); orderItem.setProductSkuCode(cartItem.getProductSku().getCode()); orderItem.setProductSku(cartItem.getProductSku()); Boolean cartItemVATIncluded = cartService.isCartItemVATIncluded(cartItem, marketAreaId); orderItem.setVATIncluded(cartItemVATIncluded); // if(cartItemVATIncluded) { // orderItem.setPrice(cartService.getCartItemPriceWithTaxes(cartItem, marketAreaId, taxes)); // } else { // orderItem.setPrice(cartService.getCartItemPrice(cartItem, marketAreaId, taxes)); // } orderItem.setPrice(cartService.getCartItemPrice(cartItem, marketAreaId)); // cartItemPojo.setTotalPrice(cartService.getCartItemPriceWithStandardCurrencySign(cartItem, marketAreaId, cart.getTaxes())); orderItem.setQuantity(cartItem.getQuantity()); orderItem.setStoreId(cartItem.getStoreId()); // TAXES List<CartItemTax> cartItemTaxes = cartItem.getTaxes(); // SANITY CHECK if(cartItemTaxes == null || cartItemTaxes.isEmpty()){ logger.error("Checkout an order with an item who has no taxes! Cart id: " + cart.getId() + ", CartItem id: " + cartItem.getId()); } if (cartItemTaxes != null) { for (CartItemTax cartItemTax : cartItemTaxes) { Tax tax = cartItemTax.getTax(); OrderTax orderTax = new OrderTax(); orderTax.setTaxId(tax.getId()); orderTax.setName(tax.getName()); orderTax.setPercent(tax.getPercent()); orderTax.setAmount(cartService.getCartItemTaxesAmount(cartItem, marketAreaId)); orderItem.getTaxes().add(orderTax); } } orderItem.setShipment(orderShipment); orderItems.add(orderItem); } orderShipment.setOrderItems(orderItems); orderShipment.setOrderPurchase(orderPurchase); orderShipments.add(orderShipment); } } orderPurchase.setShipments(orderShipments); orderPurchase = orderPurchaseService.createNewOrder(orderPurchase); return orderPurchase; } // USER public User createOrUpdatePersonalUser(User user, final UserForm userForm) { if (user == null) { user = new User(); } user = handleUserForm(user, userForm); return userService.saveOrUpdateUser(user); } public User createOrUpdateUser(User user, final UserForm userForm) { if (user == null) { user = new User(); } user = handleUserForm(user, userForm); return userService.saveOrUpdateUser(user); } public User buildNewUser(final UserForm userForm) throws Exception { User user = new User(); user = handleUserForm(user, userForm); return user; } public User buildAndRegisterNewActiveUser(final RequestData requestData, final UserForm userForm) throws Exception { User user = buildNewUser(userForm); // FORCE TO ACTIVE A REGISTER USER user.setActive(true); return user; } public User validateNewUser(final RequestData requestData, User user) throws Exception { user.setValidated(true); return updateCurrentUser(requestData, user); } public User activeNewUser(final RequestData requestData, User user) throws Exception { user.setActive(true); return updateCurrentUser(requestData, user); } public User updateCurrentUser(final RequestData requestData, User user) throws Exception { final HttpServletRequest request = requestData.getRequest(); user.setDateUpdate(new Date()); // UPDATE CUSTOMER User savedUser = userService.saveOrUpdateUser(user); // UPDATE SESSION requestUtil.updateCurrentUser(request, savedUser); return savedUser; } protected User handleUserForm(User user, final UserForm userForm) { if (user == null) { user = new User(); } user.setTitle(userForm.getTitle()); user.setLastname(userForm.getLastname()); user.setFirstname(userForm.getFirstname()); user.setEmail(userForm.getEmail()); if (StringUtils.isNotEmpty(userForm.getLogin())) { user.setLogin(userForm.getLogin()); } else { String login = StringUtils.lowerCase(userForm.getFirstname().substring(0, 1) + userForm.getLastname()); User checkUserLogin = userService.getUserByLoginOrEmail(login); int i = 1; while (checkUserLogin != null) { login = StringUtils.lowerCase(userForm.getFirstname().substring(0, 1) + userForm.getLastname() + i); checkUserLogin = userService.getUserByLoginOrEmail(login); i++; } user.setLogin(login.toLowerCase()); } if (StringUtils.isNotEmpty(userForm.getPassword())) { // UPDATE PASSWORD user.setPassword(securityUtil.encodePassword(userForm.getPassword())); } else { if (StringUtils.isEmpty(user.getPassword())) { // SET A DEFAULT PASSWORD String password = securityUtil.generatePassword(); user.setPassword(securityUtil.encodePassword(password)); userForm.setPassword(password); } } user.setAddress1(userForm.getAddress1()); user.setAddress2(userForm.getAddress2()); user.setPostalCode(userForm.getPostalCode()); user.setCity(userForm.getCity()); user.setStateCode(userForm.getStateCode()); user.setAreaCode(userForm.getAreaCode()); user.setCountryCode(userForm.getCountryCode()); user.setActive(userForm.isActive()); return user; } // COMPANY /** * */ public Company createOrUpdateCompany(Company company, final CompanyForm companyForm) { if (company == null) { company = new Company(); } company = handleCompanyForm(company, companyForm); return userService.saveOrUpdateCompany(company); } /** * */ public Company updateCurrentCompany(final RequestData requestData, Company company) throws Exception { final HttpServletRequest request = requestData.getRequest(); company.setDateUpdate(new Date()); // UPDATE COMPANY Company savedCompany = userService.saveOrUpdateCompany(company); // UPDATE SESSION requestUtil.updateCurrentCompany(request, savedCompany); return savedCompany; } protected Company handleCompanyForm(Company company, final CompanyForm companyForm) { if (company == null) { company = new Company(); } company.setCode(CoreUtil.cleanEntityCode(companyForm.getCode())); company.setName(companyForm.getName()); company.setDescription(companyForm.getDescription()); company.setActive(companyForm.isActive()); company.setAddress1(companyForm.getAddress1()); company.setAddress2(companyForm.getAddress2()); company.setAddressAdditionalInformation(companyForm.getAddressAdditionalInformation()); company.setPostalCode(companyForm.getPostalCode()); company.setCity(companyForm.getCity()); company.setStateCode(companyForm.getStateCode()); company.setAreaCode(companyForm.getAreaCode()); company.setCountryCode(companyForm.getCountryCode()); return company; } // CUSTOMER public Customer createOrUpdateCustomer(Customer customer, final CustomerForm customerForm) throws Exception { if(customer == null){ customer = new Customer(); } customer.setLogin(customerForm.getLogin()); customer.setLastname(customerForm.getLastname()); customer.setFirstname(customerForm.getFirstname()); customer.setEmail(customerForm.getEmail()); customer.setActive(customerForm.isActive()); return customerService.saveOrUpdateCustomer(customer); } // CATALOG public ProductBrand createOrUpdateProductBrand(final MarketArea marketArea, final Localization localization, ProductBrand brand, final ProductBrandForm brandForm) throws Exception { if(brand == null){ brand = new ProductBrand(); } if(StringUtils.isNotEmpty(brandForm.getCode())){ brand.setCode(CoreUtil.cleanEntityCode(brandForm.getCode())); } if(StringUtils.isNotEmpty(brandForm.getName())){ brand.setName(brandForm.getName()); } if(StringUtils.isNotEmpty(brandForm.getDescription())){ brand.setDescription(brandForm.getDescription()); } brand.setEnabled(brandForm.isEnabled()); if(brandForm.getMarketAreaAttributes() != null) { Map<AttributeContextBean, String> attributes = brandForm.getMarketAreaAttributes(); for (AttributeContextBean attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { String marketAreaCode = attributeKey.getMarketAreaCode(); MarketArea marketAreaAttribute = null; if(StringUtils.isNotEmpty(marketAreaCode)){ marketAreaAttribute = marketService.getMarketAreaByCode(marketAreaCode); } String localizationCode = attributeKey.getLocalizationCode(); Localization localizationAttribute = null; if(StringUtils.isNotEmpty(localizationCode)){ localizationAttribute = localizationService.getLocalizationByCode(localizationCode); } ProductBrandAttribute brandAttribute = brand.getAttribute(attributeKey.getCode(), marketAreaAttribute.getId(), localizationAttribute.getCode()); if(brandAttribute != null){ // UPDATE brandAttribute.setValue(value); } else { // CREATE - ADD brand.getAttributes().add(buildProductBrandAttribute(marketAreaAttribute, localizationAttribute, attributeKey.getCode(), value, false)); } } } } if(brandForm.getGlobalAttributes() != null) { Map<AttributeContextBean, String> attributes = brandForm.getGlobalAttributes(); for (AttributeContextBean attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { String localizationCode = attributeKey.getLocalizationCode(); Localization localizationAttribute = null; if(StringUtils.isNotEmpty(localizationCode)){ localizationAttribute = localizationService.getLocalizationByCode(localizationCode); } ProductBrandAttribute brandAttribute = brand.getAttribute(attributeKey.getCode(), null, localizationAttribute.getCode()); if(brandAttribute != null){ // UPDATE brandAttribute.setValue(value); } else { // CREATE - ADD brand.getAttributes().add(buildProductBrandAttribute(null, localizationAttribute, attributeKey.getCode(), value, false)); } } } } return productService.saveOrUpdateProductBrand(brand); } public ProductBrand updateProductBrandDescriptions(final MarketArea marketArea, final Localization localization, ProductBrand brand, final List<MultipleTextBean> descriptions) throws Exception { String attributeCode = ProductBrandAttribute.PRODUCT_BRAND_ATTRIBUTE_I18N_LONG_DESCRIPTION; for (MultipleTextBean description : descriptions) { String value = description.getText(); if (StringUtils.isNotEmpty(value)) { String localizationCode = description.getCode(); Localization attributeLocalization = null; if(StringUtils.isNotEmpty(localizationCode)){ attributeLocalization = localizationService.getLocalizationByCode(localizationCode); } ProductBrandAttribute brandAttribute = brand.getAttribute(attributeCode, null, attributeLocalization.getCode()); if(brandAttribute != null){ // UPDATE brandAttribute.setValue(value); } else { // CREATE - ADD brand.getAttributes().add(buildProductBrandAttribute(null, attributeLocalization, attributeCode, value, false)); } } } return productService.saveOrUpdateProductBrand(brand); } public CatalogCategoryMaster createCatalogCategory(final RequestData requestData, final MarketArea marketArea, final Localization localization, final CatalogCategoryMaster parentCatalogCategory, final CatalogCategoryMaster catalogCategory, final CatalogCategoryForm catalogCategoryForm) throws UniqueConstraintCodeCategoryException, ParseException { String catalogCategoryCode = catalogCategoryForm.getCode(); if(StringUtils.isNotEmpty(catalogCategoryForm.getCode())){ catalogCategory.setCode(CoreUtil.cleanEntityCode(catalogCategoryForm.getCode())); } if(StringUtils.isNotEmpty(catalogCategoryForm.getName())){ catalogCategory.setName(catalogCategoryForm.getName()); } catalogCategory.setDescription(catalogCategoryForm.getDescription()); if(StringUtils.isNotEmpty(catalogCategoryForm.getRanking())){ try { catalogCategory.setRanking(Integer.parseInt(catalogCategoryForm.getRanking())); } catch (Exception e) { // NOTHING } } else { catalogCategory.setRanking(1); } catalogCategory.setParentCatalogCategory(parentCatalogCategory); catalogCategory.setCatalog(requestData.getMasterCatalog()); if(catalogCategoryForm.getMarketAreaAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getMarketAreaAttributes(); for (String attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getMarketAreaAttributes(marketArea.getId()).add(buildCatalogCategoryMasterAttribute(marketArea, localization, attributeKey, value, false)); } } } if(catalogCategoryForm.getGlobalAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getGlobalAttributes(); for (String attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getGlobalAttributes().add(buildCatalogCategoryMasterAttribute(marketArea, localization, attributeKey, value, true)); } } } try { CatalogCategoryMaster savedCatalogCategory = catalogCategoryService.saveOrUpdateCatalogCategory(catalogCategory); if(parentCatalogCategory != null) { if(!parentCatalogCategory.getCatalogCategories().contains(catalogCategory)) { // PARENT DOESN'T CONTAIN THE NEW CATEGORY - ADD IT IN THE MANY TO MANY CatalogCategoryMaster reloadedCatalogCategory = catalogCategoryService.getMasterCatalogCategoryByCode(catalogCategoryCode, requestData.getVirtualCatalogCode(), requestData.getMasterCatalogCode()); parentCatalogCategory.getCatalogCategories().add(reloadedCatalogCategory); catalogCategoryService.saveOrUpdateCatalogCategory(parentCatalogCategory); } } return savedCatalogCategory; } catch (PersistenceException e) { if(e.getMessage().contains("ConstraintViolationException")) { throw new UniqueConstraintCodeCategoryException(); } else { throw new UniqueConstraintCodeCategoryException(); } } } public CatalogCategoryMaster updateCatalogCategory(final RequestData requestData, final MarketArea marketArea, final Retailer retailer, final Localization localization, final CatalogCategoryMaster catalogCategory, final CatalogCategoryForm catalogCategoryForm) throws ParseException { if(StringUtils.isNotEmpty(catalogCategoryForm.getCode())){ catalogCategory.setCode(CoreUtil.cleanEntityCode(catalogCategoryForm.getCode())); } if(StringUtils.isNotEmpty(catalogCategoryForm.getName())){ catalogCategory.setName(catalogCategoryForm.getName()); } catalogCategory.setDescription(catalogCategoryForm.getDescription()); if(StringUtils.isNotEmpty(catalogCategoryForm.getRanking())){ try { catalogCategory.setRanking(Integer.parseInt(catalogCategoryForm.getRanking())); } catch (Exception e) { // NOTHING } } else { catalogCategory.setRanking(1); } if(StringUtils.isNotEmpty(catalogCategoryForm.getDefaultParentCategoryId())) { final CatalogCategoryMaster parentCatalogCategory = catalogCategoryService.getMasterCatalogCategoryById(catalogCategoryForm.getDefaultParentCategoryId()); catalogCategory.setParentCatalogCategory(parentCatalogCategory); } else { catalogCategory.setParentCatalogCategory(null); } if(catalogCategoryForm.getGlobalAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getGlobalAttributes(); boolean doesntExist = true; for (String attributeKey : attributes.keySet()) { for (CatalogCategoryMasterAttribute catalogCategoryMasterAttribute : catalogCategory.getGlobalAttributes()) { if (catalogCategoryMasterAttribute.getAttributeDefinition().getCode().equals(attributeKey)) { catalogCategoryMasterAttribute.setValue(catalogCategoryForm.getGlobalAttributes().get(attributeKey)); doesntExist = false; } } if (doesntExist) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getMarketAreaAttributes(marketArea.getId()).add(buildCatalogCategoryMasterAttribute(marketArea, localization, attributeKey, value, true)); } } } } if(catalogCategoryForm.getMarketAreaAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getMarketAreaAttributes(); boolean doesntExist = true; for (String attributeKey : attributes.keySet()) { for (CatalogCategoryMasterAttribute catalogCategoryMasterAttribute : catalogCategory.getMarketAreaAttributes(marketArea.getId())) { if (catalogCategoryMasterAttribute.getAttributeDefinition().getCode().equals(attributeKey)) { catalogCategoryMasterAttribute.setValue(catalogCategoryForm.getMarketAreaAttributes().get(attributeKey)); doesntExist = false; } } if (doesntExist) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getMarketAreaAttributes(marketArea.getId()).add(buildCatalogCategoryMasterAttribute(marketArea, localization, attributeKey, value, false)); } } } } return catalogCategoryService.saveOrUpdateCatalogCategory(catalogCategory); } public CatalogCategoryVirtual createCatalogCategory(final RequestData requestData, final MarketArea marketArea, final Localization localization, final CatalogCategoryVirtual parentCatalogCategory, final CatalogCategoryVirtual catalogCategory, final CatalogCategoryForm catalogCategoryForm) throws UniqueConstraintCodeCategoryException, ParseException { String catalogCategoryCode = catalogCategoryForm.getCode(); if(StringUtils.isNotEmpty(catalogCategoryForm.getCode())){ catalogCategory.setCode(CoreUtil.cleanEntityCode(catalogCategoryForm.getCode())); } if(StringUtils.isNotEmpty(catalogCategoryForm.getName())){ catalogCategory.setName(catalogCategoryForm.getName()); } catalogCategory.setDescription(catalogCategoryForm.getDescription()); if(StringUtils.isNotEmpty(catalogCategoryForm.getRanking())){ try { catalogCategory.setRanking(Integer.parseInt(catalogCategoryForm.getRanking())); } catch (Exception e) { // NOTHING } } else { catalogCategory.setRanking(1); } catalogCategory.setParentCatalogCategory(parentCatalogCategory); catalogCategory.setCatalog(marketArea.getCatalog()); if(catalogCategoryForm.getMarketAreaAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getMarketAreaAttributes(); for (String attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getMarketAreaAttributes(marketArea.getId()).add(buildCatalogCategoryVirtualAttribute(marketArea, localization, attributeKey, value, false)); } } } if(catalogCategoryForm.getGlobalAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getGlobalAttributes(); for (String attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getGlobalAttributes().add(buildCatalogCategoryVirtualAttribute(marketArea, localization, attributeKey, value, true)); } } } try { CatalogCategoryVirtual savedCatalogCategory = catalogCategoryService.saveOrUpdateCatalogCategory(catalogCategory); if(parentCatalogCategory != null) { if(!parentCatalogCategory.getCatalogCategories().contains(catalogCategory)) { // PARENT DOESN'T CONTAIN THE NEW CATEGORY - ADD IT IN THE MANY TO MANY CatalogCategoryVirtual reloadedCatalogCategory = catalogCategoryService.getVirtualCatalogCategoryByCode(catalogCategoryCode, requestData.getVirtualCatalogCode(), requestData.getVirtualCatalogCode()); parentCatalogCategory.getCatalogCategories().add(reloadedCatalogCategory); catalogCategoryService.saveOrUpdateCatalogCategory(parentCatalogCategory); } } return savedCatalogCategory; } catch (PersistenceException e) { if(e.getMessage().contains("ConstraintViolationException")) { throw new UniqueConstraintCodeCategoryException(); } else { throw new UniqueConstraintCodeCategoryException(); } } } public CatalogCategoryVirtual updateCatalogCategory(final RequestData requestData, final MarketArea marketArea, final Retailer retailer, final Localization localization, final CatalogCategoryVirtual catalogCategory, final CatalogCategoryForm catalogCategoryForm) throws ParseException { if(StringUtils.isNotEmpty(catalogCategoryForm.getCode())){ catalogCategory.setCode(CoreUtil.cleanEntityCode(catalogCategoryForm.getCode())); } if(StringUtils.isNotEmpty(catalogCategoryForm.getName())){ catalogCategory.setName(catalogCategoryForm.getName()); } catalogCategory.setDescription(catalogCategoryForm.getDescription()); if(StringUtils.isNotEmpty(catalogCategoryForm.getRanking())){ try { catalogCategory.setRanking(Integer.parseInt(catalogCategoryForm.getRanking())); } catch (Exception e) { // NOTHING } } else { catalogCategory.setRanking(1); } if(StringUtils.isNotEmpty(catalogCategoryForm.getDefaultParentCategoryId())) { final CatalogCategoryVirtual parentCatalogCategory = catalogCategoryService.getVirtualCatalogCategoryById(catalogCategoryForm.getDefaultParentCategoryId()); catalogCategory.setParentCatalogCategory(parentCatalogCategory); } else { catalogCategory.setParentCatalogCategory(null); } if (StringUtils.isNotEmpty(catalogCategoryForm.getMasterCategoryId())) { final CatalogCategoryMaster masterCatalogCategory = catalogCategoryService.getMasterCatalogCategoryById(catalogCategoryForm.getMasterCategoryId()); catalogCategory.setCategoryMaster(masterCatalogCategory); } else { catalogCategory.setCategoryMaster(null); } // for (Iterator<String> iterator = catalogCategoryForm.getGlobalAttributes().keySet().iterator(); iterator.hasNext();) { // String key = (String) iterator.next(); // for (Iterator<CatalogCategoryMasterAttribute> iteratorGlobalAttributes = catalogCategory.getCatalogCategoryGlobalAttributes().iterator(); iteratorGlobalAttributes.hasNext();) { // CatalogCategoryVirtualAttribute catalogCategoryVirtualAttribute = (CatalogCategoryVirtualAttribute) iteratorGlobalAttributes.next(); // if(catalogCategoryVirtualAttribute.getAttributeDefinition().getCode().equals(key)) { // updateCatalogCategoryVirtualAttribute(catalogCategoryVirtualAttribute, catalogCategoryForm.getGlobalAttributes().get(key)); // } // } // } // // for (Iterator<String> iterator = catalogCategoryForm.getMarketAreaAttributes().keySet().iterator(); iterator.hasNext();) { // String key = (String) iterator.next(); // for (Iterator<CatalogCategoryVirtualAttribute> iteratorMarketAreaAttribute = catalogCategory.getCatalogCategoryMarketAreaAttributes().iterator(); iteratorMarketAreaAttribute.hasNext();) { // CatalogCategoryVirtualAttribute catalogCategoryVirtualAttribute = (CatalogCategoryVirtualAttribute) iteratorMarketAreaAttribute.next(); // if(catalogCategoryVirtualAttribute.getAttributeDefinition().getCode().equals(key)) { // updateCatalogCategoryVirtualAttribute(catalogCategoryVirtualAttribute, catalogCategoryForm.getMarketAreaAttributes().get(key)); // } // } // } if(catalogCategoryForm.getGlobalAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getGlobalAttributes(); boolean doesntExist = true; for (String attributeKey : attributes.keySet()) { for (CatalogCategoryVirtualAttribute catalogCategoryVirtualAttribute : catalogCategory.getGlobalAttributes()) { if (catalogCategoryVirtualAttribute.getAttributeDefinition().getCode().equals(attributeKey)) { catalogCategoryVirtualAttribute.setValue(catalogCategoryForm.getGlobalAttributes().get(attributeKey)); doesntExist = false; } } if (doesntExist) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getMarketAreaAttributes(marketArea.getId()).add(buildCatalogCategoryVirtualAttribute(marketArea, localization, attributeKey, value, true)); } } } } if(catalogCategoryForm.getMarketAreaAttributes() != null) { Map<String, String> attributes = catalogCategoryForm.getMarketAreaAttributes(); boolean doesntExist = true; for (String attributeKey : attributes.keySet()) { for (CatalogCategoryVirtualAttribute catalogCategoryVirtualAttribute : catalogCategory.getMarketAreaAttributes(marketArea.getId())) { if (catalogCategoryVirtualAttribute.getAttributeDefinition().getCode().equals(attributeKey)) { catalogCategoryVirtualAttribute.setValue(catalogCategoryForm.getMarketAreaAttributes().get(attributeKey)); doesntExist = false; } } if (doesntExist) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { catalogCategory.getMarketAreaAttributes(marketArea.getId()).add(buildCatalogCategoryVirtualAttribute(marketArea, localization, attributeKey, value, false)); } } } } return catalogCategoryService.saveOrUpdateCatalogCategory(catalogCategory); } private ProductBrandAttribute buildProductBrandAttribute(final MarketArea marketArea, final Localization localization, final String attributeKey, final String attributeValue, boolean isGlobal) throws ParseException { AttributeDefinition attributeDefinition = attributeService.getAttributeDefinitionByCode(attributeKey); ProductBrandAttribute attribute = new ProductBrandAttribute(); attribute.setAttributeDefinition(attributeDefinition); if(localization != null){ attribute.setLocalizationCode(localization.getCode()); } if(marketArea != null){ attribute.setMarketAreaId(marketArea.getId()); } attribute.setStartDate(new Date()); attribute.setValue(attributeValue); return attribute; } private CatalogCategoryMasterAttribute buildCatalogCategoryMasterAttribute(final MarketArea marketArea, final Localization localization, final String attributeKey, final String attributeValue, boolean isGlobal) throws ParseException { AttributeDefinition attributeDefinition = attributeService.getAttributeDefinitionByCode(attributeKey); CatalogCategoryMasterAttribute catalogCategoryMasterAttribute = new CatalogCategoryMasterAttribute(); catalogCategoryMasterAttribute.setAttributeDefinition(attributeDefinition); if(localization != null){ catalogCategoryMasterAttribute.setLocalizationCode(localization.getCode()); } if(marketArea != null){ catalogCategoryMasterAttribute.setMarketAreaId(marketArea.getId()); } catalogCategoryMasterAttribute.setStartDate(new Date()); catalogCategoryMasterAttribute.setValue(attributeValue); return catalogCategoryMasterAttribute; } private CatalogCategoryVirtualAttribute buildCatalogCategoryVirtualAttribute(final MarketArea marketArea, final Localization localization, final String attributeKey, final String attributeValue, boolean isGlobal) throws ParseException { AttributeDefinition attributeDefinition = attributeService.getAttributeDefinitionByCode(attributeKey); CatalogCategoryVirtualAttribute catalogCategoryVirtualAttribute = new CatalogCategoryVirtualAttribute(); catalogCategoryVirtualAttribute.setAttributeDefinition(attributeDefinition); if(localization != null){ catalogCategoryVirtualAttribute.setLocalizationCode(localization.getCode()); } if(marketArea != null){ catalogCategoryVirtualAttribute.setMarketAreaId(marketArea.getId()); } catalogCategoryVirtualAttribute.setStartDate(new Date()); catalogCategoryVirtualAttribute.setValue(attributeValue); return catalogCategoryVirtualAttribute; } public ProductMarketing createOrUpdateProductMarketing(ProductMarketing productMarketing, final ProductMarketingForm productMarketingForm) { if(productMarketing == null){ productMarketing = new ProductMarketing(); } if (StringUtils.isNotEmpty(productMarketingForm.getCode())) { productMarketing.setCode(CoreUtil.cleanEntityCode(productMarketingForm.getCode())); } if (StringUtils.isNotEmpty(productMarketingForm.getName())) { productMarketing.setName(productMarketingForm.getName()); } productMarketing.setDescription(productMarketingForm.getDescription()); return productService.saveOrUpdateProductMarketing(productMarketing); } public ProductSku createOrUpdateProductSku(ProductSku productSku, final ProductSkuForm productSkuForm) { if(productSku == null){ productSku = new ProductSku(); } if (StringUtils.isNotEmpty(productSkuForm.getCode())) { productSku.setCode(CoreUtil.cleanEntityCode(productSkuForm.getCode())); } if (StringUtils.isNotEmpty(productSkuForm.getName())) { productSku.setName(productSkuForm.getName()); } productSku.setDescription(productSkuForm.getDescription()); ProductSku savedProductSku = null; if (StringUtils.isNotEmpty(productSkuForm.getProductMarketingId())) { ProductMarketing productMarketing = productService.getProductMarketingById(productSkuForm.getProductMarketingId()); productSku.setProductMarketing(productMarketing); savedProductSku = productService.saveOrUpdateProductSku(productSku); } return savedProductSku; } public Asset createOrUpdateProductMarketingAsset(final Asset asset, final AssetForm assetForm) { if (StringUtils.isNotEmpty(assetForm.getName())) { asset.setName(assetForm.getName()); } asset.setDescription(assetForm.getDescription()); // asset.setType(assetForm.getType); // private boolean isDefault; // private boolean isGlobal; // private Integer ordering; // private Long marketAreaId; return productService.saveOrUpdateProductMarketingAsset(asset); } public Retailer createOrUpdateRetailer(Retailer retailer, final RetailerForm retailerForm) throws Exception { if (retailer == null) { retailer = new Retailer(); } if (StringUtils.isNotEmpty(retailerForm.getCode())) { retailer.setCode(CoreUtil.cleanEntityCode(retailerForm.getCode())); } if (StringUtils.isNotEmpty(retailerForm.getName())) { retailer.setName(retailerForm.getName()); } retailer.setDescription(retailerForm.getDescription()); RetailerAddress retailerAddress = retailer.getDefaultAddress(); if (retailerAddress == null) { retailerAddress = new RetailerAddress(); retailer.getAddresses().add(retailerAddress); } retailerAddress.setAddress1(retailerForm.getAddress1()); retailerAddress.setAddress2(retailerForm.getAddress2()); retailerAddress.setAddressAdditionalInformation(retailerForm.getAddressAdditionalInformation()); retailerAddress.setPostalCode(retailerForm.getPostalCode()); retailerAddress.setCity(retailerForm.getCity()); retailerAddress.setStateCode(retailerForm.getStateCode()); retailerAddress.setCountryCode(retailerForm.getCountryCode()); retailerAddress.setPhone(retailerForm.getPhone()); retailerAddress.setFax(retailerForm.getFax()); retailerAddress.setMobile(retailerForm.getMobile()); retailerAddress.setEmail(retailerForm.getEmail()); retailerAddress.setWebsite(retailerForm.getWebsite()); retailer.setBrand(retailerForm.isBrand()); retailer.setCorner(retailerForm.isCorner()); retailer.setEcommerce(retailerForm.isEcommerce()); retailer.setOfficialRetailer(retailerForm.isOfficialRetailer()); // if(StringUtils.isNotBlank(retailerForm.getWarehouseId())){ // final Warehouse warehouse = warehouseService.getWarehouseById(retailerForm.getWarehouseId()); // if(warehouse != null){ // retailer.setWarehouse(warehouse); // } // } else { // retailer.setWarehouse(null); // } MultipartFile multipartFile = retailerForm.getFile(); if (multipartFile != null && multipartFile.getSize() > 0) { UUID uuid = UUID.randomUUID(); String pathRetailerLogoImage = new StringBuilder(uuid.toString()).append(System.getProperty ("file.separator")).append(FilenameUtils.getExtension(multipartFile.getOriginalFilename())).toString(); String absoluteFilePath = retailerService.buildRetailerLogoFilePath(retailer, pathRetailerLogoImage); String absoluteFolderPath = absoluteFilePath.replace(pathRetailerLogoImage, ""); InputStream inputStream = multipartFile.getInputStream(); File fileLogo = null; File folderLogo = null; try { folderLogo = new File(absoluteFolderPath); folderLogo.mkdirs(); fileLogo = new File(absoluteFilePath); } catch (Exception e) { // } if(fileLogo != null){ OutputStream outputStream = new FileOutputStream(fileLogo); int readBytes = 0; byte[] buffer = new byte[8192]; while ((readBytes = inputStream.read(buffer, 0, 8192)) != -1) { outputStream.write(buffer, 0, readBytes); } outputStream.close(); inputStream.close(); retailer.setLogo(pathRetailerLogoImage); } } return retailerService.saveOrUpdateRetailer(retailer); } public Warehouse createOrUpdateWarehouse(final RequestData requestData, Warehouse warehouse, final WarehouseForm warehouseForm) { if (warehouse == null) { warehouse = new Warehouse(); Set<WarehouseMarketAreaRel> warehouseMarketAreas = new HashSet<WarehouseMarketAreaRel>(); WarehouseMarketAreaRel warehouseMarketArea = new WarehouseMarketAreaRel(); warehouseMarketArea.setMarketArea(requestData.getMarketArea()); warehouseMarketAreas.add(warehouseMarketArea); warehouse.setWarehouseMarketAreaRels(warehouseMarketAreas); } if (StringUtils.isNotEmpty(warehouseForm.getCode())) { warehouse.setCode(CoreUtil.cleanEntityCode(warehouseForm.getCode())); } if (StringUtils.isNotEmpty(warehouseForm.getName())) { warehouse.setName(warehouseForm.getName()); } warehouse.setDescription(warehouseForm.getDescription()); warehouse.setAddress1(warehouseForm.getAddress1()); warehouse.setAddress2(warehouseForm.getAddress2()); warehouse.setAddressAdditionalInformation(warehouseForm.getAddressAdditionalInformation()); warehouse.setPostalCode(warehouseForm.getPostalCode()); warehouse.setCity(warehouseForm.getCity()); warehouse.setStateCode(warehouseForm.getStateCode()); warehouse.setCountryCode(warehouseForm.getCountryCode()); warehouse.setLatitude(warehouseForm.getLatitude()); warehouse.setLongitude(warehouseForm.getLongitude()); return warehouseService.saveOrUpdateWarehouse(warehouse); } public DeliveryMethod createOrUpdateDeliveryMethod(DeliveryMethod deliveryMethod, final DeliveryMethodForm deliveryMethodForm) { if (deliveryMethod == null) { deliveryMethod = new DeliveryMethod(); } if (StringUtils.isNotEmpty(deliveryMethodForm.getCode())) { deliveryMethod.setCode(CoreUtil.cleanEntityCode(deliveryMethodForm.getCode())); } if (StringUtils.isNotEmpty(deliveryMethodForm.getName())) { deliveryMethod.setName(deliveryMethodForm.getName()); } deliveryMethod.setDescription(deliveryMethodForm.getDescription()); return deliveryMethodService.saveOrUpdateDeliveryMethod(deliveryMethod); } public Tax createOrUpdateTax(Tax tax, final TaxForm taxForm) { if (tax == null) { tax = new Tax(); } if (StringUtils.isNotEmpty(taxForm.getCode())) { tax.setCode(CoreUtil.cleanEntityCode(taxForm.getCode())); } if (StringUtils.isNotEmpty(taxForm.getName())) { tax.setName(taxForm.getName()); } tax.setDescription(taxForm.getDescription()); tax.setPercent(new BigDecimal(taxForm.getPercent())); return taxService.saveOrUpdateTax(tax); } public EngineSettingValue updateEngineSettingValue(EngineSettingValue engineSettingValue, final EngineSettingValueForm engineSettingValueForm) { if (engineSettingValue == null) { engineSettingValue = new EngineSettingValue(); } engineSettingValue.setValue(engineSettingValueForm.getValue()); return engineSettingService.saveOrUpdateEngineSettingValue(engineSettingValue); } public AbstractPaymentGateway createOrUpdatePaymentGateway(final MarketArea marketArea, AbstractPaymentGateway paymentGateway, final PaymentGatewayForm paymentGatewayForm) throws ParseException { if (StringUtils.isNotEmpty(paymentGatewayForm.getCode())) { paymentGateway.setCode(CoreUtil.cleanEntityCode(paymentGatewayForm.getCode())); } if (StringUtils.isNotEmpty(paymentGatewayForm.getName())) { paymentGateway.setName(paymentGatewayForm.getName()); } paymentGateway.setDescription(paymentGatewayForm.getDescription()); if (paymentGatewayForm.isActive()) { if (paymentGateway.getMarketAreas() == null || !paymentGateway.getMarketAreas().contains(marketArea)) { paymentGateway.addMarketArea(marketArea); } } else { if (paymentGateway.getMarketAreas() != null && paymentGateway.getMarketAreas().contains(marketArea)) { paymentGateway.getMarketAreas().remove(marketArea); } } for (String key : paymentGatewayForm.getGlobalAttributeMap().keySet()) { String value = paymentGatewayForm.getGlobalAttributeMap().get(key); boolean success = paymentGateway.updateAttribute(key, value); if (!success) { // ATTRIBUTE DOESN'T EXIT - ADD AttributeDefinition attributeDefinition = attributeService.getAttributeDefinitionByCode(key); paymentGateway.addAttribute(null, attributeDefinition, value); } } for (String key : paymentGatewayForm.getMarketAreaAttributeMap().keySet()) { String value = paymentGatewayForm.getMarketAreaAttributeMap().get(key); boolean success = paymentGateway.updateAttribute(key, value); if (!success) { // ATTRIBUTE DOESN'T EXIT - ADD AttributeDefinition attributeDefinition = attributeService.getAttributeDefinitionByCode(key); paymentGateway.addAttribute(marketArea, attributeDefinition, value); } } List<PaymentGatewayOption> availableOptions = paymentGatewayService.findPaymentGatewayOptions(); Set<PaymentGatewayOption> options = new HashSet<PaymentGatewayOption>(); for (PaymentGatewayOption paymentGatewayOption : availableOptions) { if (paymentGatewayForm.getOptionMap().keySet().contains(paymentGatewayOption.getCode())) { options.add(paymentGatewayOption); } } paymentGateway.setOptions(options); return paymentGatewayService.saveOrUpdatePaymentGateway(paymentGateway); } public EngineSetting createOrUpdateEngineSetting(EngineSetting engineSetting, final EngineSettingForm engineSettingForm) { if (engineSetting == null) { engineSetting = new EngineSetting(); } engineSetting.setDefaultValue(engineSettingForm.getDefaultValue()); return engineSettingService.saveOrUpdateEngineSetting(engineSetting); } public EngineSettingValue createOrUpdateEngineSettingValue(EngineSettingValue engineSettingValue, final EngineSettingValueForm engineSettingValueForm) { if (engineSettingValue == null) { engineSettingValue = new EngineSettingValue(); } engineSettingValue.setContext(engineSettingValueForm.getContext()); engineSettingValue.setValue(engineSettingValueForm.getValue()); return engineSettingService.saveOrUpdateEngineSettingValue(engineSettingValue); } public Store createOrUpdateStore(Retailer retailer, Store store, StoreForm storeForm) throws Exception { if (store == null) { store = new Store(); } store.setPrimary(storeForm.isPrimary()); store.setActive(storeForm.isActive()); store.setB2b(storeForm.isB2b()); store.setB2c(storeForm.isB2c()); if (StringUtils.isNotEmpty(storeForm.getCode())) { store.setCode(CoreUtil.cleanEntityCode(storeForm.getCode())); } if (StringUtils.isNotEmpty(storeForm.getName())) { store.setName(storeForm.getName()); } store.setAddress1(storeForm.getAddress1()); store.setAddress2(storeForm.getAddress2()); store.setAddressAdditionalInformation(storeForm.getAddressAdditionalInformation()); store.setPostalCode(storeForm.getPostalCode()); store.setCity(storeForm.getCity()); store.setStateCode(storeForm.getStateCode()); store.setCountryCode(storeForm.getCountryCode()); store.setEmail(storeForm.getEmail()); store.setPhone(storeForm.getPhone()); store.setFax(storeForm.getFax()); store.setWebsite(storeForm.getWebsite()); store.setLegalGuid(storeForm.getLegalGuid()); store.setLatitude(storeForm.getLatitude()); store.setLongitude(storeForm.getLongitude()); if(retailer != null){ store.setRetailer(retailer); } return retailerService.saveOrUpdateStore(store); } /** * */ public void buildAndSaveNewOrderConfirmationMail(final RequestData requestData, final User user, final OrderPurchase order) throws Exception { final MarketArea marketArea = requestData.getMarketArea(); final String contextNameValue = requestData.getContextNameValue(); final String velocityPath = requestData.getVelocityEmailPrefix(); final Locale locale = requestData.getLocale(); final String localizationCode = requestData.getMarketAreaLocalization().getCode(); final OrderConfirmationEmailBean orderConfirmationEmailBean = new OrderConfirmationEmailBean(); orderConfirmationEmailBean.setFromAddress(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_ORDER_CONFIRMATION)); orderConfirmationEmailBean.setFromName(marketArea.getEmailFromName(contextNameValue, Email.EMAIl_TYPE_ORDER_CONFIRMATION)); orderConfirmationEmailBean.setReplyToEmail(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_ORDER_CONFIRMATION)); orderConfirmationEmailBean.setToEmail(user.getEmail()); if (order != null) { orderConfirmationEmailBean.setOrderNumber(order.getOrderNum()); DateFormat dateFormat = requestUtil.getCommonFormatDate(requestData, DateFormat.MEDIUM, DateFormat.MEDIUM); if (order.getExpectedDeliveryDate() != null) { orderConfirmationEmailBean.setExpectedDeliveryDate(dateFormat.format(order.getExpectedDeliveryDate())); } else { orderConfirmationEmailBean.setExpectedDeliveryDate("NA"); } if (Hibernate.isInitialized(order.getShippingAddress()) && order.getShippingAddress() != null) { orderConfirmationEmailBean.setCompanyName(order.getShippingAddress().getCompanyName()); orderConfirmationEmailBean.setTitleCode(order.getShippingAddress().getTitle()); String titleLabel = referentialDataService.getTitleByLocale(order.getShippingAddress().getTitle(), locale); orderConfirmationEmailBean.setTitleLabel(titleLabel); orderConfirmationEmailBean.setLastname(order.getShippingAddress().getLastname()); orderConfirmationEmailBean.setFirstname(order.getShippingAddress().getFirstname()); orderConfirmationEmailBean.setAddress1(order.getShippingAddress().getAddress1()); orderConfirmationEmailBean.setAddress2(order.getShippingAddress().getAddress2()); orderConfirmationEmailBean.setAddressAdditionalInformation(order.getShippingAddress().getAddressAdditionalInformation()); orderConfirmationEmailBean.setPostalCode(order.getShippingAddress().getPostalCode()); orderConfirmationEmailBean.setCity(order.getShippingAddress().getCity()); orderConfirmationEmailBean.setStateCode(order.getShippingAddress().getStateCode()); orderConfirmationEmailBean.setAreaCode(order.getShippingAddress().getAreaCode()); orderConfirmationEmailBean.setCountryCode(order.getShippingAddress().getCountryCode()); String coutryLabel = referentialDataService.getCountryByLocale(order.getShippingAddress().getCountryCode(), locale); orderConfirmationEmailBean.setCountry(coutryLabel); } if (Hibernate.isInitialized(order.getOrderItems()) && order.getOrderItems() != null) { for (OrderItem orderItem : order.getOrderItems()) { OrderItemEmailBean orderItemEmailBean = new OrderItemEmailBean(); orderItemEmailBean.setSkuCode(orderItem.getProductSkuCode()); if(StringUtils.isNotEmpty(orderItem.getProductSkuCode())){ ProductSku productSku = productService.getProductSkuByCode(orderItem.getProductSkuCode()); orderItemEmailBean.setEan(productSku.getEan()); orderItemEmailBean.setI18nName(productSku.getI18nName(localizationCode)); orderItemEmailBean.setI18nDescription(productSku.getI18nDescription(localizationCode)); if (Hibernate.isInitialized(productSku.getAssets()) && productSku.getAssets() != null) { for (Asset asset : productSku.getAssets()) { final String path = engineSettingService.getProductSkuImageWebPath(productSku.getCode(), asset); orderItemEmailBean.setDefaultAssetFullPath(backofficeUrlService.buildAbsoluteUrl(requestData, path)); } } } if(orderItem.getStoreId() != null){ Store store = retailerService.getStoreById(orderItem.getStoreId()); orderItemEmailBean.setStoreCode(store.getCode()); orderItemEmailBean.setStoreName(store.getName()); } orderItemEmailBean.setPrice(orderItem.getOrderItemPriceWithStandardCurrencySign()); orderItemEmailBean.setPriceWithTaxes(orderItem.getOrderItemPriceWithTaxesWithStandardCurrencySign()); orderItemEmailBean.setQuantity(orderItem.getQuantity()); orderItemEmailBean.setAmount(orderItem.getOrderItemTotalPriceWithTaxesWithStandardCurrencySign()); orderConfirmationEmailBean.getOrderItems().add(orderItemEmailBean); } } orderConfirmationEmailBean.setOrderItemsTotalWithCurrencySign(order.getOrderItemTotalWithTaxesWithStandardCurrencySign()); orderConfirmationEmailBean.setOrderShippingTotalWithCurrencySign(order.getDeliveryMethodTotalWithStandardCurrencySign()); if (BigDecimal.ZERO.compareTo(order.getDeliveryMethodTotal()) == 0) { orderConfirmationEmailBean.setOrderShippingTotalWithCurrencySign(coreMessageSource.getCommonMessage(ScopeWebMessage.LABEL.getPropertyKey(), "free", requestData.getLocale())); } orderConfirmationEmailBean.setOrderTaxesTotalWithCurrencySign(order.getTaxTotalWithStandardCurrencySign()); orderConfirmationEmailBean.setOrderTotalWithCurrencySign(order.getOrderTotalWithStandardCurrencySign()); } emailService.buildAndSaveNewOrderB2BConfirmationMail(requestData, user, velocityPath, orderConfirmationEmailBean); } /** * */ public void buildAndSaveUserNewAccountMail(final RequestData requestData, final User user) throws Exception { final MarketArea marketArea = requestData.getMarketArea(); final String contextNameValue = requestData.getContextNameValue(); final UserNewAccountConfirmationEmailBean userNewAccountConfirmationEmailBean = new UserNewAccountConfirmationEmailBean(); BeanUtils.copyProperties(user, userNewAccountConfirmationEmailBean); userNewAccountConfirmationEmailBean.setFromAddress(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_NEW_ACCOUNT_CONFIRMATION)); userNewAccountConfirmationEmailBean.setFromName(marketArea.getEmailFromName(contextNameValue, Email.EMAIl_TYPE_NEW_ACCOUNT_CONFIRMATION)); userNewAccountConfirmationEmailBean.setReplyToEmail(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_NEW_ACCOUNT_CONFIRMATION)); userNewAccountConfirmationEmailBean.setToEmail(user.getEmail()); userNewAccountConfirmationEmailBean.setTitle(user.getTitle()); userNewAccountConfirmationEmailBean.setFirstname(user.getFirstname()); userNewAccountConfirmationEmailBean.setLastname(user.getLastname()); userNewAccountConfirmationEmailBean.setEmail(user.getEmail()); userNewAccountConfirmationEmailBean.setUserDetailsUrl(backofficeUrlService.buildAbsoluteUrl(requestData, backofficeUrlService.generateUrl(BoUrls.PERSONAL_DETAILS, requestData))); buildAndSaveUserNewAccountMail(requestData, userNewAccountConfirmationEmailBean); } /** * */ public void buildAndSaveUserForgottenPasswordMail(final RequestData requestData, final User user, final UserCredential userCredential, final ForgottenPasswordForm forgottenPasswordForm) throws Exception { final MarketArea marketArea = requestData.getMarketArea(); final Locale locale = requestData.getLocale(); final String contextNameValue = requestData.getContextNameValue(); final UserForgottenPasswordEmailBean userForgottenPasswordEmailBean = new UserForgottenPasswordEmailBean(); userForgottenPasswordEmailBean.setFromAddress(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_FORGOTTEN_PASSWORD)); userForgottenPasswordEmailBean.setFromName(marketArea.getEmailFromName(contextNameValue, Email.EMAIl_TYPE_FORGOTTEN_PASSWORD)); userForgottenPasswordEmailBean.setReplyToEmail(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_FORGOTTEN_PASSWORD)); userForgottenPasswordEmailBean.setToEmail(user.getEmail()); userForgottenPasswordEmailBean.setToken(userCredential.getResetToken()); userForgottenPasswordEmailBean.setTitle(referentialDataService.getTitleByLocale(user.getTitle(), locale)); userForgottenPasswordEmailBean.setFirstname(user.getFirstname()); userForgottenPasswordEmailBean.setLastname(user.getLastname()); userForgottenPasswordEmailBean.setEmail(user.getEmail()); buildAndSaveUserForgottenPasswordMail(requestData, user, userCredential, userForgottenPasswordEmailBean); } /** * */ public void resetUserCredential(final RequestData requestData, final User user, final ResetPasswordForm resetPasswordForm) throws Exception { // FLAG LAST CURRENT CREDENTIEL UserCredential userCredential = user.getCurrentCredential(); if(userCredential != null){ userCredential.setDateUpdate(new Date()); userCredential.setResetProcessedDate(new Date()); } // ADD A NEW ONE addNewUserCredential(requestData, user, resetPasswordForm.getNewPassword()); } /** * */ public UserCredential flagUserCredentialWithToken(final RequestData requestData, final User user) throws Exception { if(user != null){ String token = UUID.randomUUID().toString(); UserCredential userCredential = user.getCurrentCredential(); if(userCredential == null){ userCredential = new UserCredential(); userCredential.setDateCreate(new Date()); user.getCredentials().add(userCredential); } userCredential.setDateUpdate(new Date()); userCredential.setResetToken(token); userCredential.setTokenTimestamp(new Timestamp(new Date().getTime())); // UPDATE CUSTOMER userService.saveOrUpdateUser(user); return userCredential; } return null; } /** * */ public void cancelUserCredentialToken(final RequestData requestData, final User user) throws Exception { if(user != null){ UserCredential userCredential = user.getCurrentCredential(); if(userCredential != null){ userCredential.setDateUpdate(new Date()); userCredential.setResetToken(""); userCredential.setTokenTimestamp(null); userService.saveOrUpdateUserCredential(userCredential); } } } /** * */ public void addNewUserCredential(final RequestData requestData, final User user, final String newPassword) throws Exception { if(user != null){ String clearPassword = newPassword; String encodePassword = securityUtil.encodePassword(clearPassword); UserCredential userCredential = new UserCredential(); userCredential.setPassword(encodePassword); userCredential.setDateCreate(new Date()); userCredential.setDateUpdate(new Date()); user.getCredentials().add(userCredential); user.setPassword(encodePassword); userService.saveOrUpdateUser(user); } } /** * */ public void buildAndSaveUserForgottenPasswordMail(final RequestData requestData, final User user, final UserCredential userCredential, final UserForgottenPasswordEmailBean userForgottenPasswordEmailBean) throws Exception { emailService.buildAndSaveUserForgottenPasswordMail(requestData, user, requestData.getVelocityEmailPrefix(), userForgottenPasswordEmailBean); } /** * */ public void buildAndSaveUserResetPasswordConfirmationMail(final RequestData requestData, final User user) throws Exception { final MarketArea marketArea = requestData.getMarketArea(); final Locale locale = requestData.getLocale(); final String contextNameValue = requestData.getContextNameValue(); final String velocityPath = requestData.getVelocityEmailPrefix(); final UserResetPasswordConfirmationEmailBean userResetPasswordConfirmationEmailBean = new UserResetPasswordConfirmationEmailBean(); userResetPasswordConfirmationEmailBean.setFromAddress(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_RESET_PASSWORD_CONFIRMATION)); userResetPasswordConfirmationEmailBean.setFromName(marketArea.getEmailFromName(contextNameValue, Email.EMAIl_TYPE_RESET_PASSWORD_CONFIRMATION)); userResetPasswordConfirmationEmailBean.setReplyToEmail(getEmailFromAddress(requestData, marketArea, contextNameValue, Email.EMAIl_TYPE_RESET_PASSWORD_CONFIRMATION)); userResetPasswordConfirmationEmailBean.setToEmail(user.getEmail()); userResetPasswordConfirmationEmailBean.setTitle(referentialDataService.getTitleByLocale(user.getTitle(), locale)); userResetPasswordConfirmationEmailBean.setFirstname(user.getFirstname()); userResetPasswordConfirmationEmailBean.setLastname(user.getLastname()); userResetPasswordConfirmationEmailBean.setEmail(user.getEmail()); userResetPasswordConfirmationEmailBean.setUserDetailsUrl(backofficeUrlService.buildAbsoluteUrl(requestData, backofficeUrlService.generateUrl(BoUrls.PERSONAL_DETAILS, requestData))); emailService.buildAndSaveUserResetPasswordConfirmationMail(requestData, user, velocityPath, userResetPasswordConfirmationEmailBean); } /** * */ public void buildAndSaveUserNewAccountMail(final RequestData requestData, final UserNewAccountConfirmationEmailBean userNewAccountConfirmationEmailBean) throws Exception { emailService.buildAndSaveUserNewAccountMail(requestData, requestData.getVelocityEmailPrefix(), userNewAccountConfirmationEmailBean); } protected String getEmailFromAddress(final RequestData requestData, final MarketArea marketArea, final String targetContextNameValue, final String emailType) throws Exception{ String currentContextNameValue = requestUtil.getCurrentContextNameValue(); return emailService.getEmailFromAddress(requestData, marketArea, currentContextNameValue, targetContextNameValue, emailType); } // CMS public CmsMenu createOrUpdateCmsMenu(final MarketArea marketArea, final Localization localization, CmsMenu menu, final CmsMenuForm menuForm) throws Exception { if(menu == null){ menu = new CmsMenu(); if(StringUtils.isEmpty(menuForm.getCode()) && StringUtils.isNotEmpty(menuForm.getName())){ String code = marketArea.getCode(); if(menuForm.getRootMenuId() != null){ CmsMenu parentMenu = cmsContentService.getCmsMenuById(menuForm.getRootMenuId()); code += "_" + parentMenu.getName(); } code += "_" + menuForm.getName(); menu.setCode(CoreUtil.cleanEntityCode(code)); } } if(StringUtils.isNotEmpty(menuForm.getName())){ menu.setName(menuForm.getName()); } if(StringUtils.isNotEmpty(menuForm.getPosition())){ menu.setPosition(menuForm.getPosition()); } if(StringUtils.isNotEmpty(menuForm.getType())){ menu.getLink().setType(menuForm.getType()); } if(StringUtils.isNotEmpty(menuForm.getParams())){ menu.getLink().setParams(menuForm.getParams()); } menu.setOrdering(menuForm.getOrdering()); menu.setActive(menuForm.isActive()); menu.getLink().setExternal(menuForm.isExternal()); if(StringUtils.isNotEmpty(menuForm.getFullUrlPath())){ menu.getLink().setFullUrlPath(menuForm.getFullUrlPath()); } if(menuForm.getMarketAreaAttributes() != null) { Map<AttributeContextBean, String> attributes = menuForm.getMarketAreaAttributes(); for (AttributeContextBean attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { String marketAreaCode = attributeKey.getMarketAreaCode(); MarketArea marketAreaAttribute = null; if(StringUtils.isNotEmpty(marketAreaCode)){ marketAreaAttribute = marketService.getMarketAreaByCode(marketAreaCode); } String localizationCode = attributeKey.getLocalizationCode(); Localization localizationAttribute = null; if(StringUtils.isNotEmpty(localizationCode)){ localizationAttribute = localizationService.getLocalizationByCode(localizationCode); } CmsMenuAttribute menuAttribute = menu.getAttribute(attributeKey.getCode(), marketAreaAttribute.getId(), localizationAttribute.getCode()); if(menuAttribute != null){ // UPDATE menuAttribute.setValue(value); } else { // CREATE - ADD menu.getAttributes().add(buildCmsMenuAttribute(marketAreaAttribute, localizationAttribute, attributeKey.getCode(), value, false)); } } } } if(menuForm.getGlobalAttributes() != null) { Map<AttributeContextBean, String> attributes = menuForm.getGlobalAttributes(); for (AttributeContextBean attributeKey : attributes.keySet()) { String value = attributes.get(attributeKey); if (StringUtils.isNotEmpty(value)) { String localizationCode = attributeKey.getLocalizationCode(); Localization localizationAttribute = null; if(StringUtils.isNotEmpty(localizationCode)){ localizationAttribute = localizationService.getLocalizationByCode(localizationCode); } CmsMenuAttribute menuAttribute = menu.getAttribute(attributeKey.getCode(), null, localizationAttribute.getCode()); if(menuAttribute != null){ // UPDATE menuAttribute.setValue(value); } else { // CREATE - ADD menu.getAttributes().add(buildCmsMenuAttribute(null, localizationAttribute, attributeKey.getCode(), value, false)); } } } } return cmsContentService.saveOrUpdateCmsMenu(menu); } public CmsMenu updateCmsMenuNameTranslations(final MarketArea marketArea, final Localization localization, CmsMenu menu, final List<MultipleTextBean> nameTranslations) throws Exception { String attributeCode = CmsMenuAttribute.CMS_MENU_ATTRIBUTE_I18N_NAME; for (MultipleTextBean nameTranslation : nameTranslations) { String value = nameTranslation.getText(); if (StringUtils.isNotEmpty(value)) { String localizationCode = nameTranslation.getCode(); Localization attributeLocalization = null; if(StringUtils.isNotEmpty(localizationCode)){ attributeLocalization = localizationService.getLocalizationByCode(localizationCode); } CmsMenuAttribute menuAttribute = menu.getAttribute(attributeCode, null, attributeLocalization.getCode()); if(menuAttribute != null){ // UPDATE menuAttribute.setValue(value); } else { // CREATE - ADD menu.getAttributes().add(buildCmsMenuAttribute(null, attributeLocalization, attributeCode, value, false)); } } } return cmsContentService.saveOrUpdateCmsMenu(menu); } private CmsMenuAttribute buildCmsMenuAttribute(final MarketArea marketArea, final Localization localization, final String attributeKey, final String attributeValue, boolean isGlobal) throws ParseException { AttributeDefinition attributeDefinition = attributeService.getAttributeDefinitionByCode(attributeKey); CmsMenuAttribute attribute = new CmsMenuAttribute(); attribute.setAttributeDefinition(attributeDefinition); if(localization != null){ attribute.setLocalizationCode(localization.getCode()); } if(marketArea != null){ attribute.setMarketAreaId(marketArea.getId()); } attribute.setStartDate(new Date()); attribute.setValue(attributeValue); return attribute; } }