diff --git a/base/src/org/compiere/model/MMatchPO.java b/base/src/org/compiere/model/MMatchPO.java
index 590d4caa6d..6e56c2d344 100644
--- a/base/src/org/compiere/model/MMatchPO.java
+++ b/base/src/org/compiere/model/MMatchPO.java
@@ -40,9 +40,8 @@ import org.compiere.util.Env;
*
* @author Bayu Cahya, Sistematika
*
BF [ 2240484 ] Re MatchingPO, MMatchPO doesn't contains Invoice info
- *
- * @author Teo Sarca, www.arhipac.ro
- * BF [ 2314749 ] MatchPO not considering currency PriceMatchDifference
+ * @author Armen Rizal, Goodwill Consulting
+ * BF [ 2215840 ] MatchPO Bug Collection
*/
public class MMatchPO extends X_M_MatchPO
{
@@ -488,28 +487,10 @@ public class MMatchPO extends X_M_MatchPO
} // getOrderLine
/**
- * Get PriceActual from Invoice and convert it to Order Currency
- * @return Price Actual in Order Currency
+ * Before Save
+ * @param newRecord new
+ * @return true
*/
- public BigDecimal getInvoicePriceActual()
- {
- MInvoiceLine iLine = getInvoiceLine();
- MInvoice invoice = iLine.getParent();
- MOrder order = getOrderLine().getParent();
-
- BigDecimal priceActual = iLine.getPriceActual();
- int invoiceCurrency_ID = invoice.getC_Currency_ID();
- int orderCurrency_ID = order.getC_Currency_ID();
- if (invoiceCurrency_ID != orderCurrency_ID)
- {
- priceActual = MConversionRate.convert(getCtx(), priceActual, invoiceCurrency_ID, orderCurrency_ID,
- invoice.getDateInvoiced(), invoice.getC_ConversionType_ID(),
- getAD_Client_ID(), getAD_Org_ID());
- }
- return priceActual;
- }
-
- @Override
protected boolean beforeSave (boolean newRecord)
{
// Set Trx Date
@@ -580,7 +561,7 @@ public class MMatchPO extends X_M_MatchPO
is_ValueChanged("C_OrderLine_ID") || is_ValueChanged("C_InvoiceLine_ID")))
{
BigDecimal poPrice = getOrderLine().getPriceActual();
- BigDecimal invPrice = getInvoicePriceActual();
+ BigDecimal invPrice = getInvoiceLine().getPriceActual();
BigDecimal difference = poPrice.subtract(invPrice);
if (difference.signum() != 0)
{
@@ -609,6 +590,17 @@ public class MMatchPO extends X_M_MatchPO
}
}
+ if (newRecord || m_isInOutLineChange)
+ {
+ // Elaine 2008/6/20
+ String err = createMatchPOCostDetail();
+ if(err != null && err.length() > 0)
+ {
+ s_log.warning(err);
+ return false;
+ }
+ }
+
return true;
} // beforeSave
@@ -619,19 +611,8 @@ public class MMatchPO extends X_M_MatchPO
* @param success success
* @return success
*/
- @Override
protected boolean afterSave (boolean newRecord, boolean success)
{
- if (newRecord && success)
- {
- // Elaine 2008/6/20
- String err = createMatchPOCostDetail();
- if(err != null && err.length() > 0)
- {
- s_log.warning(err);
- return false;
- }
- }
// Purchase Order Delivered/Invoiced
// (Reserved in VMatch and MInOut.completeIt)
if (success && getC_OrderLine_ID() != 0)
@@ -712,7 +693,6 @@ public class MMatchPO extends X_M_MatchPO
* Before Delete
* @return true if acct was deleted
*/
- @Override
protected boolean beforeDelete ()
{
if (isPosted())
@@ -731,7 +711,6 @@ public class MMatchPO extends X_M_MatchPO
* @param success success
* @return success
*/
- @Override
protected boolean afterDelete (boolean success)
{
// Order Delivered/Invoiced
@@ -885,8 +864,7 @@ public class MMatchPO extends X_M_MatchPO
BigDecimal tAmt = Env.ZERO;
for (int i = 0 ; i < mPO.length ; i++)
{
- if (mPO[i].isPosted()
- && mPO[i].getM_AttributeSetInstance_ID() == getM_AttributeSetInstance_ID()
+ if (mPO[i].getM_AttributeSetInstance_ID() == getM_AttributeSetInstance_ID()
&& mPO[i].getM_MatchPO_ID() != get_ID())
{
BigDecimal qty = (isReturnTrx ? mPO[i].getQty().negate() : mPO[i].getQty());
@@ -900,14 +878,17 @@ public class MMatchPO extends X_M_MatchPO
tQty = tQty.add(isReturnTrx ? getQty().negate() : getQty());
// Different currency
- String costingMethod = as.getCostingMethod();
if (oLine.getC_Currency_ID() != as.getC_Currency_ID())
{
MOrder order = oLine.getParent();
Timestamp dateAcct = order.getDateAcct();
+ //get costing method for product
+ MProduct product = new MProduct(getCtx(), getM_Product_ID(), get_TrxName());
+ String costingMethod = product.getCostingMethod(as);
if (MAcctSchema.COSTINGMETHOD_AveragePO.equals(costingMethod) ||
MAcctSchema.COSTINGMETHOD_LastPOPrice.equals(costingMethod) )
dateAcct = inOut.getDateAcct(); //Movement Date
+ //
BigDecimal rate = MConversionRate.getRate(
order.getC_Currency_ID(), as.getC_Currency_ID(),
dateAcct, order.getC_ConversionType_ID(),
@@ -962,19 +943,23 @@ public class MMatchPO extends X_M_MatchPO
getC_OrderLine_ID(), getM_AttributeSetInstance_ID(), as.getC_AcctSchema_ID(), get_TrxName());
if (cd != null)
{
- BigDecimal price = cd.getAmt().divide(cd.getQty(),12,BigDecimal.ROUND_HALF_UP);
- cd.setDeltaAmt(price.multiply(getQty().negate()));
- cd.setDeltaQty(getQty().negate());
- cd.setProcessed(false);
- //
- cd.setAmt(price.multiply(cd.getQty().subtract(getQty())));
- cd.setQty(cd.getQty().subtract(getQty()));
- if (!cd.isProcessed())
+ if (cd.getQty().compareTo(Env.ZERO) > 0)
{
- MClient client = MClient.get(getCtx(), getAD_Client_ID());
- if (client.isCostImmediate())
- cd.process();
+ BigDecimal price = cd.getAmt().divide(cd.getQty(),12,BigDecimal.ROUND_HALF_UP);
+ cd.setDeltaAmt(price.multiply(getQty().negate()));
+ cd.setDeltaQty(getQty().negate());
+ cd.setProcessed(false);
+ //
+ cd.setAmt(price.multiply(cd.getQty().subtract(getQty())));
+ cd.setQty(cd.getQty().subtract(getQty()));
+ if (!cd.isProcessed())
+ {
+ MClient client = MClient.get(getCtx(), getAD_Client_ID());
+ if (client.isCostImmediate())
+ cd.process();
+ }
}
+ //after process clean-up
if (cd.getQty().compareTo(Env.ZERO) == 0)
{
cd.setProcessed(false);
diff --git a/base/src/org/compiere/process/MatchPODelete.java b/base/src/org/compiere/process/MatchPODelete.java
index 205b85e7ed..415304a974 100644
--- a/base/src/org/compiere/process/MatchPODelete.java
+++ b/base/src/org/compiere/process/MatchPODelete.java
@@ -25,6 +25,9 @@ import org.compiere.util.*;
*
* @author Jorg Janke
* @version $Id: MatchPODelete.java,v 1.2 2006/07/30 00:51:02 jjanke Exp $
+ *
+ * @author Armen Rizal, Goodwill Consulting
+ * BF [ 2215840 ] MatchPO Bug Collection
*/
public class MatchPODelete extends SvrProcess
{
@@ -50,8 +53,24 @@ public class MatchPODelete extends SvrProcess
MMatchPO po = new MMatchPO (getCtx(), p_M_MatchPO_ID, get_TrxName());
if (po.get_ID() == 0)
throw new AdempiereUserError("@NotFound@ @M_MatchPO_ID@ " + p_M_MatchPO_ID);
+ //
+ MOrderLine orderLine = null;
+ boolean isMatchReceipt = (po.getM_InOutLine_ID() != 0);
+ if (isMatchReceipt)
+ {
+ orderLine = new MOrderLine (getCtx(), po.getC_OrderLine_ID(), get_TrxName());
+ orderLine.setQtyReserved(orderLine.getQtyReserved().add(po.getQty()));
+ }
+ //
if (po.delete(true))
+ {
+ if (isMatchReceipt)
+ {
+ if (!orderLine.save(get_TrxName()))
+ throw new AdempiereUserError("Delete MatchPO failed to restore PO's On Ordered Qty");
+ }
return "@OK@";
+ }
po.save();
return "@Error@";
} // doIt