package com.salesmanager.shop.store.controller.order; import com.salesmanager.core.business.services.catalog.product.PricingService; import com.salesmanager.core.business.services.catalog.product.ProductService; import com.salesmanager.core.business.services.order.OrderService; import com.salesmanager.core.business.services.order.orderproduct.OrderProductDownloadService; import com.salesmanager.core.business.services.payments.PaymentService; import com.salesmanager.core.business.services.reference.country.CountryService; import com.salesmanager.core.business.services.reference.zone.ZoneService; import com.salesmanager.core.business.services.shipping.ShippingService; import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.order.Order; import com.salesmanager.core.model.order.orderproduct.OrderProductDownload; import com.salesmanager.core.model.reference.country.Country; import com.salesmanager.core.model.reference.language.Language; import com.salesmanager.core.model.reference.zone.Zone; import com.salesmanager.shop.constants.Constants; import com.salesmanager.shop.model.order.ReadableOrder; import com.salesmanager.shop.model.order.ReadableOrderProductDownload; import com.salesmanager.shop.populator.order.ReadableOrderProductDownloadPopulator; import com.salesmanager.shop.store.controller.AbstractController; import com.salesmanager.shop.store.controller.ControllerConstants; import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade; import com.salesmanager.shop.store.controller.order.facade.OrderFacade; import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade; import com.salesmanager.shop.utils.LabelUtils; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; @Controller @RequestMapping(Constants.SHOP_URI+"/order") public class ShoppingOrderConfirmationController extends AbstractController { private static final Logger LOGGER = LoggerFactory .getLogger(ShoppingOrderConfirmationController.class); @Inject private ShoppingCartFacade shoppingCartFacade; @Inject private ShoppingCartService shoppingCartService; @Inject private PaymentService paymentService; @Inject private ShippingService shippingService; @Inject private OrderService orderService; @Inject private ProductService productService; @Inject private CountryService countryService; @Inject private ZoneService zoneService; @Inject private OrderFacade orderFacade; @Inject private LabelUtils messages; @Inject private PricingService pricingService; @Inject private CustomerFacade customerFacade; @Inject private AuthenticationManager customerAuthenticationManager; @Inject private OrderProductDownloadService orderProdctDownloadService; /** * Invoked once the payment is complete and order is fulfilled * @param model * @param request * @param response * @param locale * @return * @throws Exception */ @RequestMapping("/confirmation.html") public String displayConfirmation(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception { Language language = (Language)request.getAttribute("LANGUAGE"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE); Long orderId = super.getSessionAttribute(Constants.ORDER_ID, request); if(orderId==null) { return new StringBuilder().append("redirect:").append(Constants.SHOP_URI).toString(); } //get the order Order order = orderService.getById(orderId); if(order == null) { LOGGER.warn("Order id [" + orderId + "] does not exist"); throw new Exception("Order id [" + orderId + "] does not exist"); } if(order.getMerchant().getId().intValue()!=store.getId().intValue()) { LOGGER.warn("Store id [" + store.getId() + "] differs from order.store.id [" + order.getMerchant().getId() + "]"); return new StringBuilder().append("redirect:").append(Constants.SHOP_URI).toString(); } if(super.getSessionAttribute(Constants.ORDER_ID_TOKEN, request)!=null) { //set this unique token for performing unique operations in the confirmation model.addAttribute("confirmation", "confirmation"); } //remove unique token super.removeAttribute(Constants.ORDER_ID_TOKEN, request); String[] orderMessageParams = {store.getStorename()}; String orderMessage = messages.getMessage("label.checkout.text", orderMessageParams, locale); model.addAttribute("ordermessage", orderMessage); String[] orderIdParams = {String.valueOf(order.getId())}; String orderMessageId = messages.getMessage("label.checkout.orderid", orderIdParams, locale); model.addAttribute("ordermessageid", orderMessageId); String[] orderEmailParams = {order.getCustomerEmailAddress()}; String orderEmailMessage = messages.getMessage("label.checkout.email", orderEmailParams, locale); model.addAttribute("orderemail", orderEmailMessage); ReadableOrder readableOrder = orderFacade.getReadableOrder(orderId, store, language); //resolve country and Zone for GA String countryCode = readableOrder.getCustomer().getBilling().getCountry(); Map<String,Country> countriesMap = countryService.getCountriesMap(language); Country billingCountry = countriesMap.get(countryCode); if(billingCountry!=null) { readableOrder.getCustomer().getBilling().setCountry(billingCountry.getName()); } String zoneCode = readableOrder.getCustomer().getBilling().getZone(); Map<String,Zone> zonesMap = zoneService.getZones(language); Zone billingZone = zonesMap.get(zoneCode); if(billingZone!=null) { readableOrder.getCustomer().getBilling().setZone(billingZone.getName()); } model.addAttribute("order",readableOrder); //check if any downloads exist for this order List<OrderProductDownload> orderProductDownloads = orderProdctDownloadService.getByOrderId(order.getId()); if(CollectionUtils.isNotEmpty(orderProductDownloads)) { ReadableOrderProductDownloadPopulator populator = new ReadableOrderProductDownloadPopulator(); List<ReadableOrderProductDownload> downloads = new ArrayList<ReadableOrderProductDownload>(); for(OrderProductDownload download : orderProductDownloads) { ReadableOrderProductDownload view = new ReadableOrderProductDownload(); populator.populate(download, view, store, language); downloads.add(view); } model.addAttribute("downloads", downloads); } /** template **/ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.confirmation).append(".").append(store.getStoreTemplate()); return template.toString(); } }