Author: sichen
Date: Wed Mar 14 10:48:08 2007 New Revision: 518237 URL: http://svn.apache.org/viewvc?view=rev&rev=518237 Log: Receive inventory against PO: - Add a back-ordered quantity column - JS alerts and error/info messages on: attempt to receive product/goodId not in order; attempt to receive > order quantity; part or all of qty to receive going to back-order - If productId to receive is not in the order, check for goodIds Modified: ofbiz/trunk/applications/product/config/ProductUiLabels.properties ofbiz/trunk/applications/product/webapp/facility/WEB-INF/actions/shipment/ReceiveInventoryAgainstPurchaseOrder.bsh ofbiz/trunk/applications/product/webapp/facility/shipment/ReceiveInventoryAgainstPurchaseOrder.ftl Modified: ofbiz/trunk/applications/product/config/ProductUiLabels.properties URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/config/ProductUiLabels.properties?view=diff&rev=518237&r1=518236&r2=518237 ============================================================================== --- ofbiz/trunk/applications/product/config/ProductUiLabels.properties (original) +++ ofbiz/trunk/applications/product/config/ProductUiLabels.properties Wed Mar 14 10:48:08 2007 @@ -615,6 +615,7 @@ ProductGlobal=Global ProductGlobalPriceRule=Global Price Rule ProductGlobalPriceRules=Global Price Rules +ProductGoodIdentification=Good Identification ProductGoToFeatureCategory=Go to Feature Category ProductGrams=Grams ProductGroupMemberMaintenance=Group Member Maintenance Modified: ofbiz/trunk/applications/product/webapp/facility/WEB-INF/actions/shipment/ReceiveInventoryAgainstPurchaseOrder.bsh URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/facility/WEB-INF/actions/shipment/ReceiveInventoryAgainstPurchaseOrder.bsh?view=diff&rev=518237&r1=518236&r2=518237 ============================================================================== --- ofbiz/trunk/applications/product/webapp/facility/WEB-INF/actions/shipment/ReceiveInventoryAgainstPurchaseOrder.bsh (original) +++ ofbiz/trunk/applications/product/webapp/facility/WEB-INF/actions/shipment/ReceiveInventoryAgainstPurchaseOrder.bsh Wed Mar 14 10:48:08 2007 @@ -17,6 +17,7 @@ * under the License. */ +import org.ofbiz.entity.condition.*; import org.ofbiz.entity.util.*; import org.ofbiz.service.ServiceUtil; import org.ofbiz.base.util.*; @@ -126,6 +127,9 @@ ordered = orderItemAndShipGroupAssoc.getDouble("quantity"); if (ordered != null) totalOrdered += ordered.doubleValue(); + cancelled = orderItemAndShipGroupAssoc.getDouble("cancelQuantity"); + if (cancelled != null) + totalOrdered -= cancelled.doubleValue(); // Get the item quantity received from all shipments via the ShipmentReciept entity totalReceived = 0.0; @@ -153,6 +157,18 @@ } } + // Retrieve the backordered quantity + // TODO: limit to a facility? The shipment destination facility is not necessarily the same facility as the inventory + conditions = UtilMisc.toList(new EntityExpr("productId", EntityOperator.EQUALS, product.get("productId")), new EntityExpr("availableToPromiseTotal", EntityOperator.LESS_THAN, new Double(0))); + negativeInventoryItems = delegator.findByCondition("InventoryItem", new EntityConditionList(conditions, EntityOperator.AND), null, null); + backOrderedQuantity = 0; + niit = negativeInventoryItems.iterator(); + while (niit.hasNext()) { + negativeInventoryItem = niit.next(); + backOrderedQuantity += negativeInventoryItem.getDouble("availableToPromiseTotal").doubleValue(); + } + orderItemData.put("backOrderedQuantity", Math.abs(backOrderedQuantity)); + // Calculate how many units it should be possible to recieve for this purchase order availableToReceive = totalOrdered - totalReceived; totalAvailableToReceive += availableToReceive; @@ -171,19 +187,39 @@ // Get the first order item with the productId orderItem = EntityUtil.getFirst(EntityUtil.filterByAnd(orderItems, UtilMisc.toMap("productId", productIdToReceive))); + + // If the productId as given isn't found in the order, try any goodIdentifications and use the first match + if (UtilValidate.isEmpty(orderItem)) { + goodIdentifications = delegator.findByAnd("GoodIdentification", UtilMisc.toMap("idValue", productIdToReceive)); + if (! UtilValidate.isEmpty(goodIdentifications)) { + giit = goodIdentifications.iterator(); + while (giit.hasNext()) { + goodIdentification = giit.next(); + orderItem = EntityUtil.getFirst(EntityUtil.filterByAnd(orderItems, UtilMisc.toMap("productId", goodIdentification.get("productId")))); + if (! UtilValidate.isEmpty(orderItem)) { + productIdToReceive = goodIdentification.get("productId"); + break; + } + } + } + } + if (! UtilValidate.isEmpty(orderItem)) { orderItemSeqId = orderItem.getString("orderItemSeqId"); + oldQuantity = 0; newQuantity = 0; + quantity = 0; if (! UtilValidate.isEmpty(productQtyToReceive)) { try { quantity = Double.parseDouble(productQtyToReceive); } catch (Exception e) { - quantity = 0; + // Ignore the quantity update if there's a problem parsing it } if (itemQuantitiesToReceive.containsKey(orderItemSeqId)) { try { - newQuantity = itemQuantitiesToReceive.get(orderItemSeqId) + quantity; + oldQuantity = itemQuantitiesToReceive.get(orderItemSeqId); + newQuantity = oldQuantity + quantity; } catch (Exception e) { // Ignore the quantity update if there's a problem parsing it } @@ -199,6 +235,18 @@ // If the new quantity would be more than the quantity left to receive for this purchase order item, add an error message to the context context.put("newQuantity", newQuantity); context.put("ProductReceiveInventoryAgainstPurchaseOrderQuantityExceedsAvailableToReceive", true); + return; + } + + // Notify if some or all of the quantity to receive for the item will go to a backorder + oldBackOrderedQuantity = orderItemDatas.get(orderItemSeqId).get("backOrderedQuantity") - oldQuantity; + if (oldBackOrderedQuantity < 0) oldBackOrderedQuantity = new Double(0).doubleValue(); + newBackOrderedQuantity = orderItemDatas.get(orderItemSeqId).get("backOrderedQuantity") - newQuantity; + if (newBackOrderedQuantity < 0) newBackOrderedQuantity = new Double(0).doubleValue(); + if (oldBackOrderedQuantity != newBackOrderedQuantity) { + context.put("quantityToReceive", quantity); + context.put("quantityToBackOrder", (oldBackOrderedQuantity - newBackOrderedQuantity)); + context.put("ProductReceiveInventoryAgainstPurchaseOrderQuantityGoesToBackOrder", true); } } else { Modified: ofbiz/trunk/applications/product/webapp/facility/shipment/ReceiveInventoryAgainstPurchaseOrder.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/facility/shipment/ReceiveInventoryAgainstPurchaseOrder.ftl?view=diff&rev=518237&r1=518236&r2=518237 ============================================================================== --- ofbiz/trunk/applications/product/webapp/facility/shipment/ReceiveInventoryAgainstPurchaseOrder.ftl (original) +++ ofbiz/trunk/applications/product/webapp/facility/shipment/ReceiveInventoryAgainstPurchaseOrder.ftl Wed Mar 14 10:48:08 2007 @@ -30,10 +30,18 @@ <#assign uiLabelWithVar=uiLabelMap.ProductErrorOrderNotPurchaseOrder?interpret><@uiLabelWithVar/> <#elseif ProductReceiveInventoryAgainstPurchaseOrderProductNotFound?exists> <#assign uiLabelWithVar=uiLabelMap.ProductReceiveInventoryAgainstPurchaseOrderProductNotFound?interpret><@uiLabelWithVar/> + <script type="text/javascript">window.onload=function(){alert('<@uiLabelWithVar/>')};</script> <#elseif ProductReceiveInventoryAgainstPurchaseOrderQuantityExceedsAvailableToReceive?exists> <#assign uiLabelWithVar=uiLabelMap.ProductReceiveInventoryAgainstPurchaseOrderQuantityExceedsAvailableToReceive?interpret><@uiLabelWithVar/> + <script type="text/javascript">window.onload=function(){alert('<@uiLabelWithVar/>')};</script> </#if> </div> + <#if ProductReceiveInventoryAgainstPurchaseOrderQuantityGoesToBackOrder?exists> + <div class="errorMessage" style="color:green"> + <#assign uiLabelWithVar=uiLabelMap.ProductReceiveInventoryAgainstPurchaseOrderQuantityGoesToBackOrder?interpret><@uiLabelWithVar/> + <script type="text/javascript">window.onload=function(){alert('<@uiLabelWithVar/>')};</script> + </div> + </#if> <form name="ReceiveInventoryAgainstPurchaseOrder" action="<@ofbizUrl>ReceiveInventoryAgainstPurchaseOrder</@ofbizUrl>"> <input type="hidden" name="clearAll" value="Y"/> @@ -65,6 +73,7 @@ <tr> <td><div class="tableheadtext">${uiLabelMap.ProductProduct}</div></td> <td><div class="tableheadtext">${uiLabelMap.OrderOrder}</div></td> + <td><div class="tableheadtext">${uiLabelMap.OrderBackOrdered}</div></td> <td><div class="tableheadtext">${uiLabelMap.CommonReceived}</div></td> <td><div class="tableheadtext">${uiLabelMap.ProductOpenQuantity}</div></td> <td><div class="tableheadtext">${uiLabelMap.CommonReceive}</div></td> @@ -80,12 +89,18 @@ <#assign product = orderItemData.product?if_exists> <#assign totalQuantityReceived = orderItemData.totalQuantityReceived?default(0)> <#assign availableToReceive = orderItemData.availableToReceive?default(0)> + <#assign backOrderedQuantity = orderItemData.backOrderedQuantity?default(0)> <tr> <td><div class="tabletext">${(product.internalName)?if_exists} [${orderItemAndShipGroupAssoc.productId?default("N/A")}]</div></td> <td> <div class="tabletext"> - ${orderItemAndShipGroupAssoc.quantity} + ${orderItemAndShipGroupAssoc.quantity - orderItemAndShipGroupAssoc.cancelQuantity?default(0)} + </div> + </td> + <td> + <div class="tabletext ${(backOrderedQuantity > 0)?string(" errorMessage","")}"> + ${backOrderedQuantity} </div> </td> <td> @@ -140,7 +155,7 @@ </#list> <#if itemsAvailableToReceive> <tr> - <td colspan="7" align="right"> + <td colspan="8" align="right"> <a href="<@ofbizUrl>ReceiveInventoryAgainstPurchaseOrder?shipmentId=${shipmentId}&purchaseOrderId=${orderId}&clearAll=Y</@ofbizUrl>" class="buttontext">${uiLabelMap.CommonClearAll}</a> </td> <td align="right"> @@ -160,7 +175,7 @@ <input type="hidden" name="purchaseOrderId" value="${orderId}"/> <div class="tabletext"> <span class="tabletext"> - ${uiLabelMap.ProductProductId} <input type="text" class="inputBox" size="20" id="productId" name="productId" value=""/> + ${uiLabelMap.ProductProductId}/${uiLabelMap.ProductGoodIdentification} <input type="text" class="inputBox" size="20" id="productId" name="productId" value=""/> @ <input type="text" class="inputBox" name="quantity" size="6" maxlength="6" value="1" tabindex="0"/> <input type="submit" value="${uiLabelMap.CommonAdd}" class="smallSubmit"/> |
Free forum by Nabble | Edit this page |