use of com.salesmanager.core.model.order.OrderTotalVariation in project shopizer by shopizer-ecommerce.
the class OrderServiceImpl method caculateOrder.
private OrderTotalSummary caculateOrder(OrderSummary summary, Customer customer, final MerchantStore store, final Language language) throws Exception {
OrderTotalSummary totalSummary = new OrderTotalSummary();
List<OrderTotal> orderTotals = new ArrayList<OrderTotal>();
Map<String, OrderTotal> otherPricesTotals = new HashMap<String, OrderTotal>();
ShippingConfiguration shippingConfiguration = null;
BigDecimal grandTotal = new BigDecimal(0);
grandTotal.setScale(2, RoundingMode.HALF_UP);
// price by item
/**
* qty * price
* subtotal
*/
BigDecimal subTotal = new BigDecimal(0);
subTotal.setScale(2, RoundingMode.HALF_UP);
for (ShoppingCartItem item : summary.getProducts()) {
BigDecimal st = item.getItemPrice().multiply(new BigDecimal(item.getQuantity()));
item.setSubTotal(st);
subTotal = subTotal.add(st);
// Other prices
FinalPrice finalPrice = item.getFinalPrice();
if (finalPrice != null) {
List<FinalPrice> otherPrices = finalPrice.getAdditionalPrices();
if (otherPrices != null) {
for (FinalPrice price : otherPrices) {
if (!price.isDefaultPrice()) {
OrderTotal itemSubTotal = otherPricesTotals.get(price.getProductPrice().getCode());
if (itemSubTotal == null) {
itemSubTotal = new OrderTotal();
itemSubTotal.setModule(Constants.OT_ITEM_PRICE_MODULE_CODE);
itemSubTotal.setTitle(Constants.OT_ITEM_PRICE_MODULE_CODE);
itemSubTotal.setOrderTotalCode(price.getProductPrice().getCode());
itemSubTotal.setOrderTotalType(OrderTotalType.PRODUCT);
itemSubTotal.setSortOrder(0);
otherPricesTotals.put(price.getProductPrice().getCode(), itemSubTotal);
}
BigDecimal orderTotalValue = itemSubTotal.getValue();
if (orderTotalValue == null) {
orderTotalValue = new BigDecimal(0);
orderTotalValue.setScale(2, RoundingMode.HALF_UP);
}
orderTotalValue = orderTotalValue.add(price.getFinalPrice());
itemSubTotal.setValue(orderTotalValue);
if (price.getProductPrice().getProductPriceType().name().equals(OrderValueType.ONE_TIME)) {
subTotal = subTotal.add(price.getFinalPrice());
}
}
}
}
}
}
// only in order page, otherwise invokes too many processing
if (OrderSummaryType.ORDERTOTAL.name().equals(summary.getOrderSummaryType().name()) || OrderSummaryType.SHOPPINGCART.name().equals(summary.getOrderSummaryType().name())) {
// Post processing order total variation modules for sub total calculation - drools, custom modules
// may affect the sub total
OrderTotalVariation orderTotalVariation = orderTotalService.findOrderTotalVariation(summary, customer, store, language);
int currentCount = 10;
if (CollectionUtils.isNotEmpty(orderTotalVariation.getVariations())) {
for (OrderTotal variation : orderTotalVariation.getVariations()) {
variation.setSortOrder(currentCount++);
orderTotals.add(variation);
subTotal = subTotal.subtract(variation.getValue());
}
}
}
totalSummary.setSubTotal(subTotal);
grandTotal = grandTotal.add(subTotal);
OrderTotal orderTotalSubTotal = new OrderTotal();
orderTotalSubTotal.setModule(Constants.OT_SUBTOTAL_MODULE_CODE);
orderTotalSubTotal.setOrderTotalType(OrderTotalType.SUBTOTAL);
orderTotalSubTotal.setOrderTotalCode("order.total.subtotal");
orderTotalSubTotal.setTitle(Constants.OT_SUBTOTAL_MODULE_CODE);
orderTotalSubTotal.setSortOrder(5);
orderTotalSubTotal.setValue(subTotal);
orderTotals.add(orderTotalSubTotal);
// shipping
if (summary.getShippingSummary() != null) {
OrderTotal shippingSubTotal = new OrderTotal();
shippingSubTotal.setModule(Constants.OT_SHIPPING_MODULE_CODE);
shippingSubTotal.setOrderTotalType(OrderTotalType.SHIPPING);
shippingSubTotal.setOrderTotalCode("order.total.shipping");
shippingSubTotal.setTitle(Constants.OT_SHIPPING_MODULE_CODE);
shippingSubTotal.setSortOrder(100);
orderTotals.add(shippingSubTotal);
if (!summary.getShippingSummary().isFreeShipping()) {
shippingSubTotal.setValue(summary.getShippingSummary().getShipping());
grandTotal = grandTotal.add(summary.getShippingSummary().getShipping());
} else {
shippingSubTotal.setValue(new BigDecimal(0));
grandTotal = grandTotal.add(new BigDecimal(0));
}
// check handling fees
shippingConfiguration = shippingService.getShippingConfiguration(store);
if (summary.getShippingSummary().getHandling() != null && summary.getShippingSummary().getHandling().doubleValue() > 0) {
if (shippingConfiguration.getHandlingFees() != null && shippingConfiguration.getHandlingFees().doubleValue() > 0) {
OrderTotal handlingubTotal = new OrderTotal();
handlingubTotal.setModule(Constants.OT_HANDLING_MODULE_CODE);
handlingubTotal.setOrderTotalType(OrderTotalType.HANDLING);
handlingubTotal.setOrderTotalCode("order.total.handling");
handlingubTotal.setTitle(Constants.OT_HANDLING_MODULE_CODE);
// handlingubTotal.setText("order.total.handling");
handlingubTotal.setSortOrder(120);
handlingubTotal.setValue(summary.getShippingSummary().getHandling());
orderTotals.add(handlingubTotal);
grandTotal = grandTotal.add(summary.getShippingSummary().getHandling());
}
}
}
// tax
List<TaxItem> taxes = taxService.calculateTax(summary, customer, store, language);
if (taxes != null && taxes.size() > 0) {
BigDecimal totalTaxes = new BigDecimal(0);
totalTaxes.setScale(2, RoundingMode.HALF_UP);
int taxCount = 200;
for (TaxItem tax : taxes) {
OrderTotal taxLine = new OrderTotal();
taxLine.setModule(Constants.OT_TAX_MODULE_CODE);
taxLine.setOrderTotalType(OrderTotalType.TAX);
taxLine.setOrderTotalCode(tax.getLabel());
taxLine.setSortOrder(taxCount);
taxLine.setTitle(Constants.OT_TAX_MODULE_CODE);
taxLine.setText(tax.getLabel());
taxLine.setValue(tax.getItemPrice());
totalTaxes = totalTaxes.add(tax.getItemPrice());
orderTotals.add(taxLine);
// grandTotal=grandTotal.add(tax.getItemPrice());
taxCount++;
}
grandTotal = grandTotal.add(totalTaxes);
totalSummary.setTaxTotal(totalTaxes);
}
// grand total
OrderTotal orderTotal = new OrderTotal();
orderTotal.setModule(Constants.OT_TOTAL_MODULE_CODE);
orderTotal.setOrderTotalType(OrderTotalType.TOTAL);
orderTotal.setOrderTotalCode("order.total.total");
orderTotal.setTitle(Constants.OT_TOTAL_MODULE_CODE);
// orderTotal.setText("order.total.total");
orderTotal.setSortOrder(500);
orderTotal.setValue(grandTotal);
orderTotals.add(orderTotal);
totalSummary.setTotal(grandTotal);
totalSummary.setTotals(orderTotals);
return totalSummary;
}
Aggregations