package org.beesden.shop.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.beesden.shop.model.Basket;
import org.beesden.shop.model.BasketItem;
import org.beesden.shop.model.Customer;
import org.beesden.shop.model.DeliveryCharge;
import org.beesden.utils.Utils;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public class BasketService extends Service<Basket> {
public static Basket setTotals(Basket basket) {
Double total = new Double(0);
// Calculate the item sub-total
if (basket.getItems() != null) {
for (BasketItem item : basket.getItems()) {
total = total + item.getPrice() * item.getQuantity();
}
}
basket.setSubTotal(total);
// Add the delivery charge
if (basket.getDeliveryCharge() != null) {
double delivery = basket.getDeliveryCharge().getCharge();
if (delivery > 0) {
total = total + delivery;
}
}
// Set the total basket price
basket.setTotal(total);
return basket;
}
public static Basket updateBasket(HttpServletRequest request, Basket basket) {
// Get the parameters and check they're valid
String targetItem = request.getParameter("productId");
String quantity = request.getParameter("quantity");
if (!Utils.isNumeric(quantity) || targetItem.equals("") || quantity.equals("")) {
return basket;
}
;
// Get the basket items and update the requested item
List<BasketItem> currentItems = basket.getItems(), updateItems = new ArrayList<BasketItem>();
for (BasketItem item : currentItems) {
if (item.getVariant().getName().toLowerCase().equals(targetItem.toLowerCase())) {
Integer quant = Integer.parseInt(quantity);
if (quant > 0) {
item.setQuantity(quant);
updateItems.add(item);
}
} else {
updateItems.add(item);
}
}
// Update the basket and recalculate the totals
basket.setItems(updateItems);
basket = setTotals(basket);
return basket;
}
public BasketService() {
super(Basket.class.getName());
}
public Basket addProduct(HttpServletRequest request, Basket basket, BasketItem basketItem) {
// Adding item to basket
List<BasketItem> items = basket.getItems();
BasketItem match = null;
if (items == null) {
items = new ArrayList<BasketItem>();
} else {
for (BasketItem item : items) {
if (item.getVariant().getId().equals(basketItem.getVariant().getId())) {
match = item;
}
}
}
if (!items.contains(match)) {
basketItem.setPrice(basketItem.getVariant().getPrice());
items.add(basketItem);
} else {
items.remove(match);
match.setQuantity(basketItem.getQuantity() + match.getQuantity());
items.add(match);
}
basket.setItems(items);
basket = setTotals(basket);
return basket;
}
public Basket assembleOrder(Basket basket, Customer customer) {
Basket order = new Basket();
DeliveryCharge charge = basket.getDeliveryCharge();
// Customer information
order.setCustomer(customer);
order.setDeliveryAddress(basket.getDeliveryAddress());
order.setPaymentDetails(basket.getPaymentDetails());
// Delivery charge information
if (charge != null) {
order.setDeliveryChargePrice(charge.getCharge());
order.setDeliveryChargeName(charge.getName());
}
// Basket items
order.setItems(basket.getItems());
order.setOrderPlaced(new Date());
order.setSubTotal(basket.getSubTotal());
order.setTotal(basket.getTotal());
return order;
}
public String getQueryCustomer(String orderId, String customerId, String sort) {
// Generate dbQuery string
String dbQuery = " WHERE p.customer.id = " + customerId;
if (orderId != null && !orderId.isEmpty()) {
dbQuery += " AND p.id = '" + orderId + "'";
}
if (sort != null && !sort.isEmpty()) {
dbQuery += " ORDER BY p." + sort.replaceAll("_", " ");
}
return dbQuery;
}
}