diff --git a/org.adempiere.base.process/src/org/compiere/process/InventoryCountCreate.java b/org.adempiere.base.process/src/org/compiere/process/InventoryCountCreate.java index 4ede242d9c..6dd0c99664 100644 --- a/org.adempiere.base.process/src/org/compiere/process/InventoryCountCreate.java +++ b/org.adempiere.base.process/src/org/compiere/process/InventoryCountCreate.java @@ -196,7 +196,7 @@ public class InventoryCountCreate extends SvrProcess .append(" AND COALESCE(il.M_AttributeSetInstance_ID,0)=COALESCE(s.M_AttributeSetInstance_ID,0))"); // + " AND il.M_AttributeSetInstance_ID=s.M_AttributeSetInstance_ID)"); // - sql.append(" ORDER BY l.Value, p.Value, s.QtyOnHand DESC"); // Locator/Product + sql.append(" ORDER BY l.Value, p.Value, s.M_AttributeSetInstance_ID, s.DateMaterialPolicy, s.QtyOnHand DESC"); // Locator/Product // int count = 0; PreparedStatement pstmt = null; @@ -279,14 +279,15 @@ public class InventoryCountCreate extends SvrProcess { if (QtyOnHand.signum() == 0) M_AttributeSetInstance_ID = 0; - + + // TODO???? This is not working --- must create one line and multiple MA if (m_line != null && m_line.getM_Locator_ID() == M_Locator_ID && m_line.getM_Product_ID() == M_Product_ID) { if (QtyOnHand.signum() == 0) return 0; - // Same ASI (usually 0) + // Same ASI and Date if (m_line.getM_AttributeSetInstance_ID() == M_AttributeSetInstance_ID && ((dateMPolicy==null && oldDateMPolicy==null) || (dateMPolicy!=null && dateMPolicy.equals(oldDateMPolicy)) || (oldDateMPolicy!=null && oldDateMPolicy.equals(dateMPolicy)))) { m_line.setQtyBook(m_line.getQtyBook().add(QtyOnHand)); @@ -316,7 +317,7 @@ public class InventoryCountCreate extends SvrProcess } // new line m_line = new MInventoryLine (m_inventory, M_Locator_ID, - M_Product_ID, M_AttributeSetInstance_ID, + M_Product_ID, 0, QtyOnHand, QtyOnHand); // book/count oldDateMPolicy = dateMPolicy; diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_Production.java b/org.adempiere.base/src/org/compiere/acct/Doc_Production.java index 93e2e292e4..7c2f231100 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_Production.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_Production.java @@ -68,6 +68,7 @@ public class Doc_Production extends Doc return null; } // loadDocumentDetails + private BigDecimal m_qtyProduced; /** * Load Invoice Line * @param prod production @@ -76,6 +77,7 @@ public class Doc_Production extends Doc private DocLine[] loadLines(X_M_Production prod) { ArrayList list = new ArrayList(); + m_qtyProduced = Env.ZERO; String sqlPL = null; if (prod.isUseProductionPlan()){ // Production @@ -115,6 +117,9 @@ public class Doc_Production extends Doc docLine.setProductionBOM(line.getM_Product_ID() == line.getM_ProductionPlan().getM_Product_ID()); else docLine.setProductionBOM(line.getM_Product_ID() == prod.getM_Product_ID()); + if (docLine.isProductionBOM()) { + m_qtyProduced = m_qtyProduced.add(line.getMovementQty()); + } // if (log.isLoggable(Level.FINE)) log.fine(docLine.toString()); list.add (docLine); @@ -195,9 +200,22 @@ public class Doc_Production extends Doc if (!parentBomPro.equals(parentEndPro)) continue; - //pb changed this 20/10/06 - if (!line0.isProductionBOM()) - bomCost = bomCost.add(line0.getProductCosts(as, line.getAD_Org_ID(), false).setScale(2,BigDecimal.ROUND_HALF_UP)); + if (!line0.isProductionBOM()) { + // get cost of children + MCostDetail cd0 = MCostDetail.get (as.getCtx(), "M_ProductionLine_ID=?", + line0.get_ID(), line0.getM_AttributeSetInstance_ID(), as.getC_AcctSchema_ID(), getTrxName()); + BigDecimal costs0; + if (cd0 != null) { + costs0 = cd0.getAmt(); + } else { + costs0 = line0.getProductCosts(as, line0.getAD_Org_ID(), false); + } + bomCost = bomCost.add(costs0.setScale(2,BigDecimal.ROUND_HALF_UP)); + } + } + if (line.getQty().compareTo(m_qtyProduced) != 0) { + BigDecimal factor = line.getQty().divide(m_qtyProduced, 12, BigDecimal.ROUND_HALF_UP); + bomCost = bomCost.multiply(factor).setScale(2,BigDecimal.ROUND_HALF_UP); } int precision = as.getStdPrecision(); BigDecimal variance = (costs.setScale(precision, BigDecimal.ROUND_HALF_UP)).subtract(bomCost.negate());