diff --git a/base/src/org/compiere/acct/Doc_Inventory.java b/base/src/org/compiere/acct/Doc_Inventory.java index b21c7c4c00..3bca157308 100644 --- a/base/src/org/compiere/acct/Doc_Inventory.java +++ b/base/src/org/compiere/acct/Doc_Inventory.java @@ -195,11 +195,12 @@ public class Doc_Inventory extends Doc } // Cost Detail + /* Source move to MInventory.createCostDetail() MCostDetail.createInventory(as, line.getAD_Org_ID(), line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), line.get_ID(), 0, costs, line.getQty(), - line.getDescription(), getTrxName()); + line.getDescription(), getTrxName());*/ } // ArrayList facts = new ArrayList(); diff --git a/base/src/org/compiere/model/MInventory.java b/base/src/org/compiere/model/MInventory.java index d9747af7e8..b9af087239 100644 --- a/base/src/org/compiere/model/MInventory.java +++ b/base/src/org/compiere/model/MInventory.java @@ -27,6 +27,7 @@ import java.util.logging.Level; import org.compiere.process.DocAction; import org.compiere.process.DocumentEngine; +import org.compiere.report.MReportTree; import org.compiere.util.CCache; import org.compiere.util.DB; import org.compiere.util.Env; @@ -467,13 +468,21 @@ public class MInventory extends X_M_Inventory implements DocAction mtrx = new MTransaction (getCtx(), line.getAD_Org_ID(), m_MovementType, line.getM_Locator_ID(), line.getM_Product_ID(), ma.getM_AttributeSetInstance_ID(), QtyMA.negate(), getMovementDate(), get_TrxName()); - mtrx.setM_InventoryLine_ID(line.getM_InventoryLine_ID()); - if (!mtrx.save()) - { - m_processMsg = "Transaction not inserted(2)"; - return DocAction.STATUS_Invalid; - } - qtyDiff = QtyNew; + + mtrx.setM_InventoryLine_ID(line.getM_InventoryLine_ID()); + if (!mtrx.save()) + { + m_processMsg = "Transaction not inserted(2)"; + return DocAction.STATUS_Invalid; + } + if(QtyMA.signum() != 0) + { + String err = createCostDetail(line, ma.getM_AttributeSetInstance_ID() , QtyMA.negate()); + if(err != null && err.length() > 0) return err; + } + + qtyDiff = QtyNew; + } } @@ -521,10 +530,15 @@ public class MInventory extends X_M_Inventory implements DocAction m_processMsg = "Transaction not inserted(2)"; return DocAction.STATUS_Invalid; } + + if(qtyDiff.signum() != 0) + { + String err = createCostDetail(line, line.getM_AttributeSetInstance_ID(), qtyDiff); + if(err != null && err.length() > 0) return err; + } } // Fallback } // stock movement - } // for all lines // User Validation @@ -943,4 +957,54 @@ public class MInventory extends X_M_Inventory implements DocAction return m_reversal; } // isReversal + /** + * Create Cost Detail + * @param line + * @param Qty + * @return + */ + private String createCostDetail(MInventoryLine line,int M_AttributeSetInstance_ID, BigDecimal qty) + { + // Get Account Schemas to create MCostDetail + MAcctSchema[] acctschemas = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID()); + for(int asn = 0; asn < acctschemas.length; asn++) + { + MAcctSchema as = acctschemas[asn]; + + boolean skip = false; + if (as.getAD_OrgOnly_ID() != 0) + { + if (as.getOnlyOrgs() == null) + as.setOnlyOrgs(MReportTree.getChildIDs(getCtx(), + 0, MAcctSchemaElement.ELEMENTTYPE_Organization, + as.getAD_OrgOnly_ID())); + + // Header Level Org + skip = as.isSkipOrg(getAD_Org_ID()); + // Line Level Org + skip = as.isSkipOrg(line.getAD_Org_ID()); + } + if (skip) + continue; + + ProductCost pc = new ProductCost (Env.getCtx(), + line.getM_Product_ID(), M_AttributeSetInstance_ID, line.get_TrxName()); + pc.setQty(qty); + BigDecimal costs = pc.getProductCosts(as, line.getAD_Org_ID(), as.getCostingMethod(), + 0,false); + if (costs == null || costs.signum() == 0) + { + return "No Costs for " + line.getProduct().getName(); + } + + // Set Total Amount and Total Quantity from Inventory + MCostDetail.createInventory(as, line.getAD_Org_ID(), + line.getM_Product_ID(), M_AttributeSetInstance_ID, + line.getM_InventoryLine_ID(), 0, // no cost element + costs.multiply(qty), qty, + line.getDescription(), line.get_TrxName()); + } + + return ""; + } } // MInventory