/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ import java.math.BigDecimal import org.apache.ofbiz.base.util.* import org.apache.ofbiz.entity.* import org.apache.ofbiz.entity.condition.* import org.apache.ofbiz.entity.util.* import org.apache.ofbiz.accounting.payment.* import org.apache.ofbiz.order.order.* import org.apache.ofbiz.party.contact.* import org.apache.ofbiz.product.catalog.* import org.apache.ofbiz.product.store.* orderId = parameters.orderId orderHeader = null // we have a special case here where for an anonymous order the user will already be logged out, but the userLogin will be in the request so we can still do a security check here if (!userLogin) { userLogin = parameters.temporaryAnonymousUserLogin // This is another special case, when Order is placed by anonymous user from ecommerce and then Order is completed by admin(or any user) from Order Manager // then userLogin is not found when Order Complete Mail is send to user. if (!userLogin) { if (orderId) { orderHeader = from("OrderHeader").where("orderId", orderId).queryOne() orderStatuses = orderHeader.getRelated("OrderStatus", null, null, false) filteredOrderStatusList = [] extOfflineModeExists = false // Handled the case of OFFLINE payment method. In case of OFFLINE payment "ORDER_CREATED" status must be checked. orderPaymentPreferences = orderHeader.getRelated("OrderPaymentPreference", null, UtilMisc.toList("orderPaymentPreferenceId"), false) filteredOrderPaymentPreferences = EntityUtil.filterByCondition(orderPaymentPreferences, EntityCondition.makeCondition("paymentMethodTypeId", EntityOperator.IN, ["EXT_OFFLINE"])) if (filteredOrderPaymentPreferences) { extOfflineModeExists = true } if (extOfflineModeExists) { filteredOrderStatusList = EntityUtil.filterByCondition(orderStatuses, EntityCondition.makeCondition("statusId", EntityOperator.IN, ["ORDER_COMPLETED", "ORDER_APPROVED", "ORDER_CREATED"])) } else { filteredOrderStatusList = EntityUtil.filterByCondition(orderStatuses, EntityCondition.makeCondition("statusId", EntityOperator.IN, ["ORDER_COMPLETED", "ORDER_APPROVED"])) } if (UtilValidate.isNotEmpty(filteredOrderStatusList)) { if (filteredOrderStatusList.size() < 2) { statusUserLogin = EntityUtil.getFirst(filteredOrderStatusList).statusUserLogin userLogin = from("UserLogin").where("userLoginId", statusUserLogin).queryOne() } else { filteredOrderStatusList.each { orderStatus -> if ("ORDER_COMPLETED".equals(orderStatus.statusId)) { statusUserLogin = orderStatus.statusUserLogin userLogin = from("UserLogin").where("userLoginId", statusUserLogin).queryOne() } } } } } } context.userLogin = userLogin } /* partyId = null if (userLogin) partyId = userLogin.partyId; */ partyId = context.partyId if (userLogin) { if (!partyId) { partyId = userLogin.partyId } } // can anybody view an anonymous order? this is set in the screen widget and should only be turned on by an email confirmation screen allowAnonymousView = context.allowAnonymousView isDemoStore = true if (orderId) { orderHeader = from("OrderHeader").where("orderId", orderId).queryOne() if ("PURCHASE_ORDER".equals(orderHeader?.orderTypeId)) { //drop shipper or supplier roleTypeId = "SUPPLIER_AGENT" } else { //customer roleTypeId = "PLACING_CUSTOMER" } context.roleTypeId = roleTypeId // check OrderRole to make sure the user can view this order. This check must be done for any order which is not anonymously placed and // any anonymous order when the allowAnonymousView security flag (see above) is not set to Y, to prevent peeking if (orderHeader && (!"anonymous".equals(orderHeader.createdBy) || ("anonymous".equals(orderHeader.createdBy) && !"Y".equals(allowAnonymousView)))) { orderRole = from("OrderRole").where("orderId", orderId, "partyId", partyId, "roleTypeId", roleTypeId).queryFirst() if (!userLogin || !orderRole) { context.remove("orderHeader") orderHeader = null Debug.logWarning("Warning: in OrderStatus.groovy before getting order detail info: role not found or user not logged in; partyId=[" + partyId + "], userLoginId=[" + (userLogin == null ? "null" : userLogin.get("userLoginId")) + "]", "orderstatus") } } } if (orderHeader) { productStore = orderHeader.getRelatedOne("ProductStore", true) if (productStore) isDemoStore = !"N".equals(productStore.isDemoStore) orderReadHelper = new OrderReadHelper(orderHeader) orderItems = orderReadHelper.getOrderItems() orderAdjustments = orderReadHelper.getAdjustments() orderHeaderAdjustments = orderReadHelper.getOrderHeaderAdjustments() orderSubTotal = orderReadHelper.getOrderItemsSubTotal() orderItemShipGroups = orderReadHelper.getOrderItemShipGroups() headerAdjustmentsToShow = orderReadHelper.getOrderHeaderAdjustmentsToShow() orderShippingTotal = OrderReadHelper.getAllOrderItemsAdjustmentsTotal(orderItems, orderAdjustments, false, false, true) orderShippingTotal = orderShippingTotal.add(OrderReadHelper.calcOrderAdjustments(orderHeaderAdjustments, orderSubTotal, false, false, true)) orderTaxTotal = OrderReadHelper.getAllOrderItemsAdjustmentsTotal(orderItems, orderAdjustments, false, true, false) orderTaxTotal = orderTaxTotal.add(OrderReadHelper.calcOrderAdjustments(orderHeaderAdjustments, orderSubTotal, false, true, false)) placingCustomerOrderRole = from("OrderRole").where("orderId", orderId, "roleTypeId", roleTypeId).queryFirst() placingCustomerPerson = placingCustomerOrderRole == null ? null : from("Person").where("partyId", placingCustomerOrderRole.partyId).queryOne() billingAccount = orderHeader.getRelatedOne("BillingAccount", false) orderPaymentPreferences = EntityUtil.filterByAnd(orderHeader.getRelated("OrderPaymentPreference", null, null, false), [EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PAYMENT_CANCELLED")]) paymentMethods = [] orderPaymentPreferences.each { opp -> paymentMethod = opp.getRelatedOne("PaymentMethod", false) if (paymentMethod) { paymentMethods.add(paymentMethod) } else { paymentMethodType = opp.getRelatedOne("PaymentMethodType", false) if (paymentMethodType) { context.paymentMethodType = paymentMethodType } } } payToPartyId = productStore.payToPartyId paymentAddress = PaymentWorker.getPaymentAddress(delegator, payToPartyId) if (paymentAddress) context.paymentAddress = paymentAddress // get Shipment tracking info orderShipmentInfoSummaryList = select("shipmentId", "shipmentRouteSegmentId", "carrierPartyId", "shipmentMethodTypeId","shipmentPackageSeqId","trackingCode","boxNumber") .from("OrderShipmentInfoSummary") .where("orderId", orderId) .orderBy("shipmentId", "shipmentRouteSegmentId", "shipmentPackageSeqId") .distinct(true) .queryList() customerPoNumberSet = new TreeSet() orderItems.each { orderItemPo -> correspondingPoId = orderItemPo.correspondingPoId if (correspondingPoId && !"(none)".equals(correspondingPoId)) { customerPoNumberSet.add(correspondingPoId) } } // check if there are returnable items returned = 0.00 totalItems = 0.00 orderItems.each { oitem -> totalItems += oitem.quantity ritems = oitem.getRelated("ReturnItem", null, null, false) ritems.each { ritem -> rh = ritem.getRelatedOne("ReturnHeader", false) if (!rh.statusId.equals("RETURN_CANCELLED")) { returned += ritem.returnQuantity } } } if (totalItems > returned) { context.returnLink = "Y" } context.orderId = orderId context.orderHeader = orderHeader context.localOrderReadHelper = orderReadHelper context.orderItems = orderItems context.orderAdjustments = orderAdjustments context.orderHeaderAdjustments = orderHeaderAdjustments context.orderSubTotal = orderSubTotal context.orderItemShipGroups = orderItemShipGroups context.headerAdjustmentsToShow = headerAdjustmentsToShow context.currencyUomId = orderReadHelper.getCurrency() context.orderShippingTotal = orderShippingTotal context.orderTaxTotal = orderTaxTotal context.orderGrandTotal = OrderReadHelper.getOrderGrandTotal(orderItems, orderAdjustments) context.placingCustomerPerson = placingCustomerPerson context.billingAccount = billingAccount context.paymentMethods = paymentMethods context.productStore = productStore context.isDemoStore = isDemoStore context.orderShipmentInfoSummaryList = orderShipmentInfoSummaryList context.customerPoNumberSet = customerPoNumberSet orderItemChangeReasons = from("Enumeration").where("enumTypeId", "ODR_ITM_CH_REASON").queryList() context.orderItemChangeReasons = orderItemChangeReasons }