Author: sichen
Date: Mon Apr 16 14:57:34 2007 New Revision: 529416 URL: http://svn.apache.org/viewvc?view=rev&rev=529416 Log: Adding the getOrderItemValue service, which calculates the value of a given orderItem by totalling the item subtotal, any adjustments for that item, and the item's share of any order-level adjustments. The last is calculated by applying the percentage of the items total that the item represents to the order-level adjustments total - EG if the item subtotal is $10, the total value of all items and item-level adjustments is $50, and the total of order-level adjustments is $5, the service will claim that the orderItem's value is $11. Modified: ofbiz/trunk/applications/order/config/OrderErrorUiLabels.properties ofbiz/trunk/applications/order/servicedef/services.xml ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java Modified: ofbiz/trunk/applications/order/config/OrderErrorUiLabels.properties URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/config/OrderErrorUiLabels.properties?view=diff&rev=529416&r1=529415&r2=529416 ============================================================================== --- ofbiz/trunk/applications/order/config/OrderErrorUiLabels.properties (original) +++ ofbiz/trunk/applications/order/config/OrderErrorUiLabels.properties Mon Apr 16 14:57:34 2007 @@ -105,6 +105,7 @@ OrderErrorOrderItemAndOrOrderHeaderDontExist=ERROR : OrderItem and/or OrderHeader don't exist OrderErrorOrderItemCantBeModified=ERROR : OrderItem can't be modified OrderErrorOrderIdNotFound=ERROR: Order with ID [${orderId}] not found +OrderErrorOrderItemNotFound=ERROR: Order item with ID [${orderId}] and orderItemSeqId [${orderItemSeqId}] not found OrderErrorOrderNotPurchaseOrder=Order ${orderId} is not a Purchase Order OrderErrorOrderTypeLookupFailed=ERROR : OrderType lookup failed : OrderErrorProcessingOfflinePayments=<li>Error processing offline payments. Modified: ofbiz/trunk/applications/order/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/servicedef/services.xml?view=diff&rev=529416&r1=529415&r2=529416 ============================================================================== --- ofbiz/trunk/applications/order/servicedef/services.xml (original) +++ ofbiz/trunk/applications/order/servicedef/services.xml Mon Apr 16 14:57:34 2007 @@ -662,4 +662,14 @@ <attribute name="facilityId" type="String" mode="IN" optional="false"/> </service> + <service name="getOrderItemValue" engine="java" + location="org.ofbiz.order.order.OrderServices" invoke="getOrderItemValue" auth="true"> + <description>Calculates the value of a given orderItem by totalling the item subtotal, any adjustments for that item, and + the item's share of any order-level adjustments (which is calculated by applying the percentage of the items total that the + item represents to the order-level adjustments total.</description> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + <attribute name="orderItemSeqId" type="String" mode="IN" optional="false"/> + <attribute name="orderItemValue" type="BigDecimal" mode="OUT" optional="true"/> + </service> + </services> Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java?view=diff&rev=529416&r1=529415&r2=529416 ============================================================================== --- ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java (original) +++ ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderServices.java Mon Apr 16 14:57:34 2007 @@ -88,6 +88,8 @@ } public static final int taxDecimals = UtilNumber.getBigDecimalScale("salestax.calc.decimals"); public static final int taxRounding = UtilNumber.getBigDecimalRoundingMode("salestax.rounding"); + public static final int orderDecimals = UtilNumber.getBigDecimalScale("order.decimals"); + public static final int orderRounding = UtilNumber.getBigDecimalRoundingMode("order.rounding"); public static final BigDecimal ZERO = (new BigDecimal("0")).setScale(taxDecimals, taxRounding); /** Service for creating a new order */ @@ -4148,5 +4150,64 @@ Debug.logWarning(e, e.getMessage(), module); } } + } + + /** + * Calculates the value of a given orderItem by totalling the item subtotal, any adjustments for that item, and + * the item's share of any order-level adjustments (that calculated by applying the percentage of the items total that the + * item represents to the order-level adjustments total. + * @param dctx DispatchContext + * @param context Map + * @return Map + */ + public static Map getOrderItemValue(DispatchContext dctx, Map context) { + GenericDelegator delegator = dctx.getDelegator(); + Locale locale = (Locale) context.get("locale"); + + String orderId = (String) context.get("orderId"); + String orderItemSeqId = (String) context.get("orderItemSeqId"); + + GenericValue orderHeader = null; + GenericValue orderItem = null; + try { + + orderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId)); + if (UtilValidate.isEmpty(orderHeader)) { + String errorMessage = UtilProperties.getMessage(resource_error, "OrderErrorOrderIdNotFound", context, locale); + Debug.logError(errorMessage, module); + return ServiceUtil.returnError(errorMessage); + } + + orderItem = delegator.findByPrimaryKey("OrderItem", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItemSeqId)); + if (UtilValidate.isEmpty(orderItem)) { + String errorMessage = UtilProperties.getMessage(resource_error, "OrderErrorOrderItemNotFound", context, locale); + Debug.logError(errorMessage, module); + return ServiceUtil.returnError(errorMessage); + } + + } catch (GenericEntityException e) { + Debug.logError(e, module); + return ServiceUtil.returnError(e.getMessage()); + } + + OrderReadHelper orh = new OrderReadHelper(orderHeader); + + // How much of the order items total does this orderItem represent? (Includes item-level adjustments but not order-level adjustments) + BigDecimal orderItemTotal = orh.getOrderItemTotalBd(orderItem); + BigDecimal orderItemsTotal = orh.getOrderItemsTotalBd(); + BigDecimal proportionOfOrderItemsTotal = orderItemTotal.divide(orderItemsTotal, orderRounding); + BigDecimal portionOfOrderItemsTotal = proportionOfOrderItemsTotal.multiply(orderItemsTotal).setScale(orderDecimals, orderRounding); + + // How much of the order-level adjustments total does this orderItem represent? The assumption is: the same + // proportion of the adjustments as of the item to the items total + BigDecimal orderAdjustmentsTotal = orh.getOrderAdjustmentsTotalBd(); + BigDecimal portionOfOrderAdjustmentsTotal = proportionOfOrderItemsTotal.multiply(orderAdjustmentsTotal).setScale(orderDecimals, orderRounding); + + // The total value of the item is the value of the item itself plus its adjustments, and the item's share of the order-level adjustments + BigDecimal orderItemTotalValue = portionOfOrderItemsTotal.add(portionOfOrderAdjustmentsTotal); + + Map result = ServiceUtil.returnSuccess(); + result.put("orderItemValue", orderItemTotalValue); + return result; } } |
Free forum by Nabble | Edit this page |