/*
* Provided by CSTI Consulting
* Following GNU LESSER GENERAL PUBLIC LICENSE
* You may obtain more details at
*
* http://www.csticonsulting.com
* Copyright (c) 2006-2010 Consultation CS-TI inc.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.salesmanager.central.catalog;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.salesmanager.central.AuthorizationException;
import com.salesmanager.central.BaseAction;
import com.salesmanager.central.profile.Context;
import com.salesmanager.core.constants.ProductConstants;
import com.salesmanager.core.entity.catalog.Product;
import com.salesmanager.core.entity.catalog.ProductDescription;
import com.salesmanager.core.entity.catalog.ProductPrice;
import com.salesmanager.core.entity.catalog.ProductPriceDescription;
import com.salesmanager.core.entity.catalog.ProductPriceDescriptionId;
import com.salesmanager.core.entity.reference.CoreModuleService;
import com.salesmanager.core.service.ServiceFactory;
import com.salesmanager.core.service.catalog.CatalogService;
import com.salesmanager.core.service.common.CommonService;
import com.salesmanager.core.util.CountryUtil;
import com.salesmanager.core.util.CurrencyUtil;
import com.salesmanager.core.util.LabelUtil;
import com.salesmanager.core.util.LanguageUtil;
import com.salesmanager.core.util.LocaleUtil;
import com.salesmanager.core.util.MessageUtil;
public class EditProductPriceAction extends BaseAction {
private static Logger log = Logger.getLogger(EditProductPriceAction.class);
private Product product;
private ProductPrice price;// submited
private Set<ProductPrice> prices;// available prices for a given product
private Collection pricesModules;// available prices modules
private String productPriceAmount;// amount submited
private String productName;
private List<String> priceNames = new ArrayList<String>();
private int action = -1;// actions -1 (add), 0 (modify) 1 (delete)
public String editProductPrice() {
try {
super.setPageTitle("label.product.productprices.title");
Context ctx = super.getContext();
super.prepareLanguages();
ProductPrice productPrice = this.getPrice();
Set prices = this.getProduct().getPrices();
CatalogService cservice = (CatalogService) ServiceFactory
.getService(ServiceFactory.CatalogService);
ProductPrice pprice = cservice.getProductPrice(this.getPrice()
.getProductPriceId());
if (this.getAction() == -1) {// add
// get core module service
CommonService cs = (CommonService) ServiceFactory
.getService(ServiceFactory.CommonService);
CoreModuleService cms = cs.getModule(CountryUtil
.getCountryIsoCodeById(ctx.getCountryid()), this
.getPrice().getProductPriceModuleName());
price.setProductPriceTypeId(cms.getCoreModuleServiceSubtype());// 1
// is
// one
// time,
// 2
// is
// recursive
}
if (this.getAction() == 1) {// delete
cservice.deleteProductPrice(pprice);
super.setSuccessMessage();
return SUCCESS;
}
if (pprice != null && this.getAction() == 0) {// modify
price.setProductPriceModuleName(pprice
.getProductPriceModuleName());
price.setProductPriceTypeId(pprice.getProductPriceTypeId());
}
boolean hasError = false;
// validate submitedamount
BigDecimal bdprice = null;
try {
bdprice = CurrencyUtil.validateCurrency(this
.getProductPriceAmount(), ctx.getCurrency());
price.setProductPriceAmount(bdprice);
} catch (Exception e) {
if (this.getAction() == -1) {
super.addFieldError("productPriceAmount",
getText("error.message.price.format"));
} else {
MessageUtil.addMessage(getServletRequest(), LabelUtil
.getInstance()
.getText("error.message.price.format"));
}
hasError = true;
}
if (this.getAction() == -1) {// add
Iterator i = reflanguages.keySet().iterator();
while (i.hasNext()) {
int langcount = (Integer) i.next();
String priceName = (String) this.getPriceNames().get(
langcount);
if (StringUtils.isBlank(priceName)) {
super
.addFieldError(
"priceName[" + langcount + "]",
getText("error.message.storefront.contentpagetitlerequired"));
hasError = true;
}
int submitedlangid = (Integer) reflanguages.get(langcount);
// create
ProductPriceDescriptionId id = new ProductPriceDescriptionId();
id.setLanguageId(submitedlangid);
id.setProductPriceId(price.getProductPriceId());
ProductPriceDescription pdescription = new ProductPriceDescription();
pdescription.setId(id);
pdescription.setProductPriceName(priceName);
Set descs = price.getPriceDescriptions();
if (descs == null) {
descs = new HashSet();
}
descs.add(pdescription);
price.setPriceDescriptions(descs);
}
}
if (hasError) {
return INPUT;
}
price.setProductId(product.getProductId());
cservice.saveOrUpdateProductPrice(price);
if (price.isDefaultPrice()) {
List updatePrices = new ArrayList();
// set all other one to false
if (prices != null) {
Iterator pricesIterator = prices.iterator();
while (pricesIterator.hasNext()) {
ProductPrice pp = (ProductPrice) pricesIterator.next();
if (pp.getProductPriceId() != price.getProductPriceId()) {
pp.setDefaultPrice(false);
updatePrices.add(pp);
}
}
}
if (updatePrices.size() > 0) {
cservice.saveOrUpdateProductPrices(updatePrices);
}
}
this.preparePriceDetails();
super.setSuccessMessage();
} catch (AuthorizationException ae) {
super.setAuthorizationMessage();
return "AUTHORIZATIONEXCEPTION";
} catch (Exception e) {
log.error(e);
super.setTechnicalMessage();
}
return SUCCESS;
}
private void preparePriceDetails() throws Exception {
super.setPageTitle("label.product.productprices.title");
Context ctx = super.getContext();
super.prepareLanguages();
// get all modules
CommonService commonService = (CommonService) ServiceFactory
.getService(ServiceFactory.CommonService);
pricesModules = commonService.getModules(
super.getLocale().getCountry(),
ProductConstants.PRICE_MODULE_TYPE);
Map modulesMap = new HashMap();
if (pricesModules != null) {
Iterator i = pricesModules.iterator();
while (i.hasNext()) {
CoreModuleService cms = (CoreModuleService) i.next();
modulesMap.put(cms.getCoreModuleName(), cms.getDescription());
}
}
super.getServletRequest().setAttribute("pricedescriptions", modulesMap);
LocaleUtil
.setLocaleToEntityCollection(pricesModules, super.getLocale());
// get all ProductPrice for a Product
CatalogService cservice = (CatalogService) ServiceFactory
.getService(ServiceFactory.CatalogService);
product = cservice.getProduct(this.getProduct().getProductId());
super.authorize(product);
Set prices = product.getPrices();
LocaleUtil.setLocaleToEntityCollection(prices, super.getLocale());
super.getServletRequest().setAttribute("prices", prices);
Set descriptionset = product.getDescriptions();
int lang = LanguageUtil.getLanguageNumberCode(ctx.getLang());
if (descriptionset != null) {
Iterator i = descriptionset.iterator();
while (i.hasNext()) {
ProductDescription desc = (ProductDescription) i.next();
if (desc.getId().getLanguageId() == lang) {
productName = desc.getProductName();
break;
}
}
}
}
public String displayProductPrice() {
super.setPageTitle("label.product.productprices.title");
try {
this.preparePriceDetails();
return SUCCESS;
} catch (AuthorizationException ae) {
super.setAuthorizationMessage();
return "AUTHORIZATIONEXCEPTION";
} catch (Exception e) {
super.setTechnicalMessage();
log.error(e);
return ERROR;
}
}
public ProductPrice getPrice() {
return price;
}
public void setPrice(ProductPrice price) {
this.price = price;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Set<ProductPrice> getPrices() {
return prices;
}
public void setPrices(Set<ProductPrice> prices) {
this.prices = prices;
}
public Collection<CoreModuleService> getPricesModules() {
return pricesModules;
}
public void setPricesModules(Collection<CoreModuleService> pricesModules) {
this.pricesModules = pricesModules;
}
public String getProductPriceAmount() {
return productPriceAmount;
}
public void setProductPriceAmount(String productPriceAmount) {
this.productPriceAmount = productPriceAmount;
}
public int getAction() {
return action;
}
public void setAction(int action) {
this.action = action;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public List<String> getPriceNames() {
return priceNames;
}
public void setPriceNames(List<String> priceNames) {
this.priceNames = priceNames;
}
}