/* * Licensed to csti consulting * You may obtain a copy of the License at * * http://www.csticonsulting.com * Copyright (c) 2006-Aug 24, 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.core.module.impl.application.prices; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.Locale; import org.apache.commons.lang.StringUtils; import com.salesmanager.core.entity.catalog.ProductPrice; import com.salesmanager.core.entity.catalog.ProductPriceSpecial; import com.salesmanager.core.entity.orders.Order; import com.salesmanager.core.entity.orders.OrderProduct; import com.salesmanager.core.entity.orders.OrderProductPrice; import com.salesmanager.core.entity.orders.OrderTotalSummary; import com.salesmanager.core.entity.orders.OrderTotalLine; import com.salesmanager.core.module.model.application.PriceModule; import com.salesmanager.core.util.CurrencyUtil; import com.salesmanager.core.util.DateUtil; import com.salesmanager.core.util.LabelUtil; import com.salesmanager.core.util.LocaleUtil; import com.salesmanager.core.util.ProductUtil; public class OneTimePriceModule implements PriceModule { public OrderTotalSummary calculateOrderPrice(Order order, OrderTotalSummary orderSummary, OrderProduct orderProduct, OrderProductPrice productPrice, String currency) { // TODO Auto-generated method stub return orderSummary; } public OrderTotalSummary calculateOrderPrice(Order order, OrderTotalSummary orderSummary, OrderProduct orderProduct, OrderProductPrice productPrice, String currency, Locale locale) { // TODO Auto-generated method stub /** * activation price goes in the oneTime fees */ BigDecimal finalPrice = null; // BigDecimal discountPrice=null; // order price this type of price needs an upfront payment BigDecimal otprice = orderSummary.getOneTimeSubTotal(); if (otprice == null) { otprice = new BigDecimal(0); } // the final price is in the product price finalPrice = productPrice.getProductPriceAmount(); int quantity = orderProduct.getProductQuantity(); finalPrice = finalPrice.multiply(new BigDecimal(quantity)); otprice = otprice.add(finalPrice); orderSummary.setOneTimeSubTotal(otprice); ProductPriceSpecial pps = productPrice.getSpecial(); // Build text StringBuffer notes = new StringBuffer(); notes.append(quantity).append(" x "); notes.append(orderProduct.getProductName()); notes.append(" "); notes.append(CurrencyUtil.displayFormatedAmountWithCurrency( productPrice.getProductPriceAmount(), currency)); notes.append(" "); notes.append(productPrice.getProductPriceName()); BigDecimal originalPrice = orderProduct.getOriginalProductPrice(); if (!productPrice.isDefaultPrice()) { originalPrice = productPrice.getProductPriceAmount(); } if (pps != null) { if (pps.getProductPriceSpecialStartDate() != null && pps.getProductPriceSpecialEndDate() != null) { if (pps.getProductPriceSpecialStartDate().before( order.getDatePurchased()) && pps.getProductPriceSpecialEndDate().after( order.getDatePurchased())) { BigDecimal dPrice = new BigDecimal(ProductUtil .determinePrice(productPrice).floatValue()); if (dPrice.floatValue() < productPrice .getProductPriceAmount().floatValue()) { BigDecimal subTotal = originalPrice .multiply(new BigDecimal(orderProduct .getProductQuantity())); BigDecimal creditSubTotal = pps .getProductPriceSpecialAmount().multiply( new BigDecimal(orderProduct .getProductQuantity())); BigDecimal credit = subTotal.subtract(creditSubTotal); StringBuffer spacialNote = new StringBuffer(); spacialNote.append("<font color=\"red\">["); spacialNote.append(productPrice.getProductPriceName()); // spacialNote.append(getPriceText(currency,locale)); spacialNote.append(" "); spacialNote.append(CurrencyUtil .displayFormatedAmountWithCurrency(credit, currency)); spacialNote.append("]</font>"); if (productPrice.getProductPriceAmount().doubleValue() > pps .getProductPriceSpecialAmount().doubleValue()) { OrderTotalLine line = new OrderTotalLine(); line.setText(spacialNote.toString()); line.setCost(credit); line.setCostFormated(CurrencyUtil .displayFormatedAmountWithCurrency(credit, currency)); orderSummary.addDueNowCredits(line); BigDecimal oneTimeCredit = orderProduct .getApplicableCreditOneTimeCharge(); oneTimeCredit = oneTimeCredit.add(credit); orderProduct .setApplicableCreditOneTimeCharge(oneTimeCredit); } } } else if (pps.getProductPriceSpecialDurationDays() > -1) { Date dt = new Date(); int numDays = pps.getProductPriceSpecialDurationDays(); Date purchased = order.getDatePurchased(); Calendar c = Calendar.getInstance(); c.setTime(dt); c.add(Calendar.DATE, numDays); BigDecimal dPrice = new BigDecimal(ProductUtil .determinePrice(productPrice).floatValue()); if (dt.before(c.getTime()) && dPrice.floatValue() < productPrice .getProductPriceAmount().floatValue()) { BigDecimal subTotal = originalPrice .multiply(new BigDecimal(orderProduct .getProductQuantity())); BigDecimal creditSubTotal = pps .getProductPriceSpecialAmount().multiply( new BigDecimal(orderProduct .getProductQuantity())); BigDecimal credit = subTotal.subtract(creditSubTotal); StringBuffer spacialNote = new StringBuffer(); spacialNote.append("<font color=\"red\">["); spacialNote.append(productPrice.getProductPriceName()); // spacialNote.append(getPriceText(currency,locale)); spacialNote.append(" "); spacialNote.append(CurrencyUtil .displayFormatedAmountWithCurrency(credit, currency)); spacialNote.append("]</font>"); if (productPrice.getProductPriceAmount().doubleValue() > pps .getProductPriceSpecialAmount().doubleValue()) { OrderTotalLine line = new OrderTotalLine(); line.setText(spacialNote.toString()); line.setCost(credit); line.setCostFormated(CurrencyUtil .displayFormatedAmountWithCurrency(credit, currency)); orderSummary.addDueNowCredits(line); BigDecimal oneTimeCredit = orderProduct .getApplicableCreditOneTimeCharge(); oneTimeCredit = oneTimeCredit.add(credit); orderProduct .setApplicableCreditOneTimeCharge(oneTimeCredit); } } } } } if (!productPrice.isDefaultPrice()) { // add a price description OrderTotalLine scl = new OrderTotalLine(); scl.setText(notes.toString()); scl.setCost(finalPrice); scl.setCostFormated(CurrencyUtil.displayFormatedAmountWithCurrency( finalPrice, currency)); orderSummary.addOtherDueNowPrice(scl); } return orderSummary; } public boolean isTaxApplicable() { return true; } public BigDecimal getPrice(ProductPrice productPrice, String currency) { // TODO Auto-generated method stub return ProductUtil.determinePrice(productPrice); } public String getHtmlPriceFormated(String prefix, ProductPrice productPrice, Locale locale, String currency) { if (locale == null) locale = LocaleUtil.getDefaultLocale(); if (currency == null) currency = CurrencyUtil.getDefaultCurrency(); StringBuffer p = new StringBuffer(); p.append("<div class='product-price product-onetime-price'>"); if (!ProductUtil.hasDiscount(productPrice)) { p.append("<div class='product-price-price' style='width:50%;float:left;'>"); if (!StringUtils.isBlank(prefix)) { p.append("<div class='product-price-text'><strong>").append(prefix).append(" : </strong></div>"); } p.append(CurrencyUtil.displayFormatedAmountWithCurrency( productPrice.getProductPriceAmount(), currency)); p.append(getPriceSuffixText(currency, locale)); p.append("</div>"); p.append("<div class='product-line'> </div>"); } else { double arith = productPrice.getSpecial() .getProductPriceSpecialAmount().doubleValue() / productPrice.getProductPriceAmount().doubleValue(); double fsdiscount = 100 - arith * 100; Float percentagediscount = new Float(fsdiscount); String savediscount = String.valueOf(percentagediscount.intValue()); p.append("<div class='product-price-price' style='width:50%;float:left;'>"); if (!StringUtils.isBlank(prefix)) { p.append("<div class='product-price-text'><strong>").append(prefix).append(" : </strong></div>"); } p.append("<strike>").append( CurrencyUtil.displayFormatedAmountWithCurrency(productPrice .getProductPriceAmount(), currency)).append( getPriceSuffixText(currency, locale)).append("</strike>") .append("</div>").append( "<div style='width:50%;float:right;'>").append( "<font color='red'>").append( CurrencyUtil.displayFormatedAmountWithCurrency( ProductUtil.determinePrice(productPrice), currency)).append( getPriceSuffixText(currency, locale)).append( "</font>").append("<br>").append( "<font color='red' style='font-size:75%;'>") .append( LabelUtil.getInstance().getText(locale, "label.generic.save")).append(" :").append( savediscount).append( LabelUtil.getInstance().getText(locale, "label.generic.percentsign")).append(" ") .append( LabelUtil.getInstance().getText(locale, "label.generic.off")).append("</font>"); Date discountEndDate = ProductUtil.getDiscountEndDate(productPrice); if (discountEndDate != null) { p.append("<br>").append(" <font style='font-size:65%;'>") .append( LabelUtil.getInstance().getText(locale, "label.generic.until")) .append(" ").append( DateUtil.formatDate(discountEndDate)).append( "</font>"); } p.append("</div>"); } p.append("</div>"); return p.toString(); } public String getPricePrefixText(String currency, Locale locale) { // TODO Auto-generated method stub return null; } public String getPriceSuffixText(String currency, Locale locale) { // TODO Auto-generated method stub return ""; } public String getPriceText(String currency, Locale locale) { // TODO Auto-generated method stub if (locale == null) locale = LocaleUtil.getDefaultLocale(); return LabelUtil.getInstance().getText(locale, "module.description.onetime-price"); } }