diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java b/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java index c605101bea..93253f4f7b 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java @@ -174,7 +174,7 @@ public class Doc_MatchPO extends Doc boolean isReturnTrx = inOut.getMovementType().equals(X_M_InOut.MOVEMENTTYPE_VendorReturns); // calculate po cost - poCost = poCost.multiply(getQty()); // Delivered so far + BigDecimal deliveredCost = poCost.multiply(getQty()); // Delivered so far Map landedCostMap = new LinkedHashMap(); BigDecimal landedCost = BigDecimal.ZERO; @@ -216,7 +216,7 @@ public class Doc_MatchPO extends Doc } landedCostMap.put(elementId, elementAmt); } - BigDecimal totalCost = poCost.add(landedCost); + BigDecimal totalCost = deliveredCost.add(landedCost); // Different currency if (m_oLine.getC_Currency_ID() != as.getC_Currency_ID()) @@ -394,10 +394,25 @@ public class Doc_MatchPO extends Doc MInOut inOut = m_ioLine.getParent(); boolean isReturnTrx = inOut.getMovementType().equals(X_M_InOut.MOVEMENTTYPE_VendorReturns); + // Create Cost Detail Matched PO using Total Amount and Total Qty based on OrderLine + MMatchPO[] mPO = MMatchPO.getOrderLine(getCtx(), m_oLine.getC_OrderLine_ID(), getTrxName()); + BigDecimal tQty = Env.ZERO; + BigDecimal tAmt = Env.ZERO; + for (int i = 0 ; i < mPO.length ; i++) + { + if (mPO[i].getM_AttributeSetInstance_ID() == mMatchPO.getM_AttributeSetInstance_ID() + && mPO[i].getM_MatchPO_ID() != mMatchPO.getM_MatchPO_ID()) + { + BigDecimal qty = (isReturnTrx ? mPO[i].getQty().negate() : mPO[i].getQty()); + tQty = tQty.add(qty); + tAmt = tAmt.add(poCost.multiply(qty)); + } + } + poCost = poCost.multiply(getQty()); // Delivered so far - BigDecimal tAmt = isReturnTrx ? poCost.negate() : poCost; - BigDecimal tQty = isReturnTrx ? getQty().negate() : getQty(); - + tAmt = tAmt.add(isReturnTrx ? poCost.negate() : poCost); + tQty = tQty.add(isReturnTrx ? getQty().negate() : getQty()); + // Set Total Amount and Total Quantity from Matched PO if (!MCostDetail.createOrder(as, m_oLine.getAD_Org_ID(), getM_Product_ID(), mMatchPO.getM_AttributeSetInstance_ID(), diff --git a/org.adempiere.base/src/org/compiere/model/MInOut.java b/org.adempiere.base/src/org/compiere/model/MInOut.java index 7f154cb003..b3c6fab94e 100644 --- a/org.adempiere.base/src/org/compiere/model/MInOut.java +++ b/org.adempiere.base/src/org/compiere/model/MInOut.java @@ -2213,6 +2213,9 @@ public class MInOut extends X_M_InOut implements DocAction reversal.setReversal_ID(getM_InOut_ID()); reversal.saveEx(get_TrxName()); // + reversal.docsPostProcess = this.docsPostProcess; + this.docsPostProcess = new ArrayList(); + // if (!reversal.processIt(DocAction.ACTION_Complete) || !reversal.getDocStatus().equals(DocAction.STATUS_Completed)) { @@ -2253,6 +2256,7 @@ public class MInOut extends X_M_InOut implements DocAction log.log(Level.SEVERE, "Failed to create reversal for match invoice " + mMatchInv.getDocumentNo()); return false; } + addDocsPostProcess(new MMatchInv(Env.getCtx(), mMatchInv.getReversal_ID(), get_TrxName())); } } MMatchPO[] mMatchPOList = MMatchPO.getInOut(getCtx(), getM_InOut_ID(), get_TrxName()); @@ -2269,6 +2273,7 @@ public class MInOut extends X_M_InOut implements DocAction log.log(Level.SEVERE, "Failed to create reversal for match purchase order " + mMatchPO.getDocumentNo()); return false; } + addDocsPostProcess(new MMatchPO(Env.getCtx(), mMatchPO.getReversal_ID(), get_TrxName())); } } return true; diff --git a/org.adempiere.base/src/org/compiere/model/MInvoice.java b/org.adempiere.base/src/org/compiere/model/MInvoice.java index f4a968a3ab..2bcbc1236e 100644 --- a/org.adempiere.base/src/org/compiere/model/MInvoice.java +++ b/org.adempiere.base/src/org/compiere/model/MInvoice.java @@ -2342,6 +2342,7 @@ public class MInvoice extends X_C_Invoice implements DocAction m_processMsg = "Could not Reverse MatchInv"; return null; } + addDocsPostProcess(new MMatchInv(Env.getCtx(), mInv[i].getReversal_ID(), get_TrxName())); } MMatchPO[] mPO = MMatchPO.getInvoice(getCtx(), getC_Invoice_ID(), get_TrxName()); for (int i = 0; i < mPO.length; i++) @@ -2356,6 +2357,7 @@ public class MInvoice extends X_C_Invoice implements DocAction m_processMsg = "Could not Reverse MatchPO"; return null; } + addDocsPostProcess(new MMatchPO(Env.getCtx(), mPO[i].getReversal_ID(), get_TrxName())); } else { @@ -2405,6 +2407,9 @@ public class MInvoice extends X_C_Invoice implements DocAction reversal.setReversal_ID(getC_Invoice_ID()); reversal.saveEx(get_TrxName()); // + reversal.docsPostProcess = this.docsPostProcess; + this.docsPostProcess = new ArrayList(); + // if (!reversal.processIt(DocAction.ACTION_Complete)) { m_processMsg = "Reversal ERROR: " + reversal.getProcessMsg();