in applications/order/src/main/java/org/apache/ofbiz/order/shoppingcart/CheckOutEvents.java [739:1008]
public static String finalizeOrderEntry(HttpServletRequest request, HttpServletResponse response) {
ShoppingCart cart = (ShoppingCart) request.getSession().getAttribute("shoppingCart");
Delegator delegator = (Delegator) request.getAttribute("delegator");
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
Map<String, Object> paramMap = UtilHttp.getParameterMap(request);
String shippingContactMechId = null;
String shippingMethod = null;
BigDecimal shipEstimate = null;
String shippingInstructions = null;
String maySplit = null;
String giftMessage = null;
String isGift = null;
String internalCode = null;
String methodType = null;
String shipBeforeDate = null;
String shipAfterDate = null;
String internalOrderNotes = null;
String shippingNotes = null;
String shipToPartyId = null;
String mode = request.getParameter("finalizeMode");
Debug.logInfo("FinalizeMode: " + mode, MODULE);
// necessary to avoid infinite looping when in a funny state, and will go right back to beginning
if (mode == null) {
return "customer";
}
// check the userLogin object
GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");
// if null then we must be an anonymous shopper
if (userLogin == null) {
// remove auto-login fields
request.getSession().removeAttribute("autoUserLogin");
request.getSession().removeAttribute("autoName");
// clear out the login fields from the cart
try {
cart.setAutoUserLogin(null, dispatcher);
} catch (CartItemModifyException e) {
Debug.logError(e, MODULE);
}
}
// Reassign items requiring drop-shipping to new or existing drop-ship groups
if ("init".equals(mode) || "default".equals(mode)) {
try {
Map<String, Object> createDropShipGroupResult = cart.createDropShipGroups(dispatcher);
if ("error".equals(createDropShipGroupResult.get("responseMessage"))) {
Debug.logError((String) createDropShipGroupResult.get("errorMessage"), MODULE);
request.setAttribute("_ERROR_MESSAGE_", (String) createDropShipGroupResult.get("errorMessage"));
return "error";
}
} catch (CartItemModifyException e) {
Debug.logError(e, MODULE);
}
}
// set the customer info
if ("default".equals(mode)) {
cart.setDefaultCheckoutOptions(dispatcher);
}
// remove the empty ship groups
if ("removeEmptyShipGroups".equals(mode)) {
cart.cleanUpShipGroups();
}
// set the customer info
if ("cust".equals(mode)) {
String partyId = (String) request.getAttribute("partyId");
if (partyId != null) {
cart.setOrderPartyId(partyId);
// no userLogin means we are an anonymous shopper; fake the UL for service calls
if (userLogin == null) {
try {
userLogin = EntityQuery.use(delegator).from("UserLogin").where("userLoginId", "anonymous").queryOne();
} catch (GenericEntityException e) {
Debug.logError(e, MODULE);
}
if (userLogin != null) {
userLogin.set("partyId", partyId);
}
request.getSession().setAttribute("userLogin", userLogin);
try {
cart.setUserLogin(userLogin, dispatcher);
} catch (CartItemModifyException e) {
Debug.logError(e, MODULE);
}
Debug.logInfo("Anonymous user-login has been activated", MODULE);
}
}
}
if ("addpty".equals(mode)) {
cart.setAttribute("addpty", "Y");
}
if ("term".equals(mode)) {
cart.setOrderTermSet(true);
}
CheckOutHelper checkOutHelper = new CheckOutHelper(dispatcher, delegator, cart);
// ====================================================================================
if ("ship".equals(mode) || "options".equals(mode)) {
Map<String, Object> callResult = ServiceUtil.returnSuccess();
List<String> errorMessages = new ArrayList<>();
Map<String, Object> errorMaps = new HashMap<>();
for (int shipGroupIndex = 0; shipGroupIndex < cart.getShipGroupSize(); shipGroupIndex++) {
// set the shipping method
if ("ship".equals(mode)) {
shippingContactMechId = request.getParameter(shipGroupIndex + "_shipping_contact_mech_id");
String facilityId = request.getParameter(shipGroupIndex + "_shipGroupFacilityId");
if (shippingContactMechId == null) {
shippingContactMechId = (String) request.getAttribute("contactMechId");
} else if ("PURCHASE_ORDER".equals(cart.getOrderType())) {
String[] shipInfo = shippingContactMechId.split("_@_");
if (shipInfo.length > 1) {
shippingContactMechId = shipInfo[0];
facilityId = shipInfo[1];
}
}
String supplierPartyId = request.getParameter(shipGroupIndex + "_supplierPartyId");
String supplierAgreementId = request.getParameter(shipGroupIndex + "_supplierAgreementId");
if (UtilValidate.isNotEmpty(facilityId)) {
cart.setShipGroupFacilityId(shipGroupIndex, facilityId);
}
// If shipTo party is different than order party
shipToPartyId = request.getParameter("shipToPartyId");
if (UtilValidate.isNotEmpty(shipToPartyId)) {
cart.setShipToCustomerPartyId(shipToPartyId);
} else {
cart.setShipToCustomerPartyId(request.getParameter("orderPartyId"));
}
callResult = checkOutHelper.finalizeOrderEntryShip(shipGroupIndex, shippingContactMechId, supplierPartyId, supplierAgreementId);
ServiceUtil.addErrors(errorMessages, errorMaps, callResult);
}
// set the options
if ("options".equals(mode)) {
shippingMethod = request.getParameter(shipGroupIndex + "_shipping_method");
if (UtilValidate.isEmpty(shippingMethod)) {
shippingMethod = request.getParameter("shipping_method");
}
shippingInstructions = request.getParameter(shipGroupIndex + "_shipping_instructions");
if (UtilValidate.isEmpty(shippingInstructions)) {
shippingInstructions = request.getParameter("shipping_instructions");
}
maySplit = request.getParameter(shipGroupIndex + "_may_split");
if (UtilValidate.isEmpty(maySplit)) {
maySplit = request.getParameter("may_split");
}
giftMessage = request.getParameter(shipGroupIndex + "_gift_message");
isGift = request.getParameter(shipGroupIndex + "_is_gift");
internalCode = request.getParameter("internalCode"); // FIXME
shipBeforeDate = request.getParameter("sgi" + shipGroupIndex + "_shipBeforeDate");
shipAfterDate = request.getParameter("sgi" + shipGroupIndex + "_shipAfterDate");
internalOrderNotes = request.getParameter("internal_order_notes");
shippingNotes = request.getParameter("shippingNotes");
if (UtilValidate.isNotEmpty(request.getParameter(shipGroupIndex + "_ship_estimate"))) {
shipEstimate = new BigDecimal(request.getParameter(shipGroupIndex + "_ship_estimate"));
}
cart.clearOrderNotes();
cart.clearInternalOrderNotes();
if (shipEstimate == null) { // allow ship estimate to be set manually if a purchase order
callResult = checkOutHelper.finalizeOrderEntryOptions(shipGroupIndex, shippingMethod, shippingInstructions, maySplit,
giftMessage, isGift, internalCode, shipBeforeDate, shipAfterDate, internalOrderNotes, shippingNotes);
} else {
callResult = checkOutHelper.finalizeOrderEntryOptions(shipGroupIndex, shippingMethod, shippingInstructions, maySplit,
giftMessage, isGift, internalCode, shipBeforeDate, shipAfterDate, internalOrderNotes, shippingNotes, shipEstimate);
}
ServiceUtil.addErrors(errorMessages, errorMaps, callResult);
}
}
//See whether we need to return an error or not
callResult = ServiceUtil.returnSuccess();
if (!errorMessages.isEmpty()) {
callResult.put(ModelService.ERROR_MESSAGE_LIST, errorMessages);
callResult.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
}
if (!errorMaps.isEmpty()) {
callResult.put(ModelService.ERROR_MESSAGE_MAP, errorMaps);
callResult.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
}
// generate any messages required
ServiceUtil.getMessages(request, callResult, null);
// determine whether it was a success or not
if (callResult.get(ModelService.RESPONSE_MESSAGE).equals(ModelService.RESPOND_ERROR)) {
if ("ship".equals(mode)) {
return "shipping";
}
if ("options".equals(mode)) {
return "options";
}
return "error";
}
}
// ###############################################################################
// check for offline payment type
// payment option; if offline we skip the payment screen
methodType = request.getParameter("paymentMethodType");
if ("offline".equals(methodType)) {
Debug.logInfo("Changing mode from->to: " + mode + "->payment", MODULE);
mode = "payment";
}
if ("payment".equals(mode)) {
Map<String, Object> callResult = ServiceUtil.returnSuccess();
List<String> errorMessages = new ArrayList<>();
Map<String, Object> errorMaps = new HashMap<>();
// Set the payment options
Map<String, Map<String, Object>> selectedPaymentMethods = getSelectedPaymentMethods(request);
// Set the billing account (if any)
String billingAccountId = request.getParameter("billingAccountId");
if (UtilValidate.isNotEmpty(billingAccountId)) {
BigDecimal billingAccountAmt = null;
billingAccountAmt = determineBillingAccountAmount(billingAccountId, request.getParameter("billingAccountAmount"), dispatcher);
if (billingAccountAmt == null) {
request.setAttribute("_ERROR_MESSAGE_", UtilProperties.getMessage(RES_ERROR, "OrderInvalidAmountSetForBillingAccount",
UtilMisc.toMap("billingAccountId", billingAccountId), (cart != null ? cart.getLocale() : Locale.getDefault())));
return "error";
}
selectedPaymentMethods.put("EXT_BILLACT", UtilMisc.<String, Object>toMap("amount", billingAccountAmt, "securityCode", null));
}
// If the user has just created a new payment method, add it to the map with a null amount, so that
// it becomes the sole payment method for the order.
String newPaymentMethodId = (String) request.getAttribute("paymentMethodId");
if (!UtilValidate.isEmpty(newPaymentMethodId)) {
selectedPaymentMethods.put(newPaymentMethodId, null);
if (!selectedPaymentMethods.containsKey(newPaymentMethodId)) {
selectedPaymentMethods.put(newPaymentMethodId, UtilMisc.toMap("amount", null, "securityCode", null));
}
}
// The selected payment methods are set
errorMessages.addAll(checkOutHelper.setCheckOutPaymentInternal(selectedPaymentMethods, null, billingAccountId));
// Verify if a gift card has been selected during order entry
callResult = checkOutHelper.checkGiftCard(paramMap, selectedPaymentMethods);
ServiceUtil.addErrors(errorMessages, errorMaps, callResult);
if (errorMessages.isEmpty() && errorMaps.isEmpty()) {
String gcPaymentMethodId = (String) callResult.get("paymentMethodId");
BigDecimal giftCardAmount = (BigDecimal) callResult.get("amount");
// WARNING: if gcPaymentMethodId is not empty, all the previously set payment methods will be removed
Map<String, Object> gcCallRes = checkOutHelper.finalizeOrderEntryPayment(gcPaymentMethodId, giftCardAmount, true, true);
ServiceUtil.addErrors(errorMessages, errorMaps, gcCallRes);
}
//See whether we need to return an error or not
callResult = ServiceUtil.returnSuccess();
if (!errorMessages.isEmpty()) {
callResult.put(ModelService.ERROR_MESSAGE_LIST, errorMessages);
callResult.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
}
if (!errorMaps.isEmpty()) {
callResult.put(ModelService.ERROR_MESSAGE_MAP, errorMaps);
callResult.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
}
// generate any messages required
ServiceUtil.getMessages(request, callResult, null);
// determine whether it was a success or not
if (callResult.get(ModelService.RESPONSE_MESSAGE).equals(ModelService.RESPOND_ERROR)) {
return "paymentError";
}
}
// determine where to direct the browser
return determineNextFinalizeStep(request, response);
}