IDEMPIERE-3697 Wrong organziation (*) in matched PO document when reversing MR with invoice.

This commit is contained in:
Heng Sin Low 2018-09-27 16:40:52 +08:00
parent cab22dfe9c
commit ec7ee69efb
3 changed files with 88 additions and 24 deletions

View File

@ -18,7 +18,9 @@ package org.compiere.model;
import java.io.File;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
@ -26,6 +28,7 @@ import java.util.Properties;
import java.util.logging.Level;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.exceptions.DBException;
import org.adempiere.exceptions.NegativeInventoryDisallowedException;
import org.adempiere.exceptions.PeriodClosedException;
import org.compiere.print.MPrintFormat;
@ -2240,6 +2243,34 @@ public class MInOut extends X_M_InOut implements DocAction
asset.setDescription(asset.getDescription() + " (" + reversal.getDocumentNo() + " #" + rLine.getLine() + "<-)");
asset.saveEx();
}
// Un-Link inoutline to Invoiceline
String sql = "SELECT C_InvoiceLine_ID FROM C_InvoiceLine WHERE M_InOutLine_ID=?";
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, sLines[i].getM_InOutLine_ID());
rs = pstmt.executeQuery();
while (rs.next())
{
int invoiceLineId = rs.getInt(1);
if (invoiceLineId > 0 ){
MInvoiceLine iLine = new MInvoiceLine(getCtx(),invoiceLineId , get_TrxName());
iLine.setM_InOutLine_ID(0);
iLine.saveEx();
}
}
}
catch (SQLException e)
{
throw new DBException(e, sql);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
}
reversal.setC_Order_ID(getC_Order_ID());
// Set M_RMA_ID

View File

@ -2420,12 +2420,19 @@ public class MInvoice extends X_C_Invoice implements DocAction
if (mPO[i].getM_InOutLine_ID() == 0)
{
if (!mPO[i].reverse(reversalDate))
if(mPO[i].isPosted())
{
m_processMsg = "Could not Reverse MatchPO";
return null;
if (!mPO[i].reverse(reversalDate))
{
m_processMsg = "Could not Reverse MatchPO";
return null;
}
addDocsPostProcess(new MMatchPO(Env.getCtx(), mPO[i].getReversal_ID(), get_TrxName()));
}
else
{
mPO[i].deleteEx(true);
}
addDocsPostProcess(new MMatchPO(Env.getCtx(), mPO[i].getReversal_ID(), get_TrxName()));
}
else
{

View File

@ -531,10 +531,7 @@ public class MMatchPO extends X_M_MatchPO
otherMatchPO = matchPO;
iLine = new MInvoiceLine(retValue.getCtx(), matchPO.getC_InvoiceLine_ID(), retValue.get_TrxName());
matchPO.setQty(matchPO.getQty().subtract(retValue.getQty()));
if (matchPO.getQty().signum() == 0 )
matchPO.deleteEx(true);
else
matchPO.saveEx();
matchPO.saveEx();
break;
}
@ -594,6 +591,8 @@ public class MMatchPO extends X_M_MatchPO
} catch (Exception e) {}
}
}
if (otherMatchPO.getQty().signum() == 0 )
otherMatchPO.deleteEx(true);
}
}
if (!retValue.save())
@ -865,7 +864,7 @@ public class MMatchPO extends X_M_MatchPO
// Bayu, Sistematika
// BF [ 2240484 ] Re MatchingPO, MMatchPO doesn't contains Invoice info
// If newRecord, set c_invoiceline_id while null
if (newRecord && getC_InvoiceLine_ID() == 0)
if (newRecord && getC_InvoiceLine_ID() == 0 && getReversal_ID()==0)
{
MMatchInv[] mpi = MMatchInv.getInOutLine(getCtx(), getM_InOutLine_ID(), get_TrxName());
for (int i = 0; i < mpi.length; i++)
@ -873,6 +872,12 @@ public class MMatchPO extends X_M_MatchPO
if (mpi[i].getC_InvoiceLine_ID() != 0 &&
mpi[i].getM_AttributeSetInstance_ID() == getM_AttributeSetInstance_ID())
{
//verify m_matchpo not created yet
int cnt = DB.getSQLValue(get_TrxName(), "SELECT Count(*) FROM M_MatchPO WHERE M_InOutLine_ID="+getM_InOutLine_ID()
+" AND C_InvoiceLine_ID="+mpi[i].getC_InvoiceLine_ID());
if (cnt > 0)
continue;
if (mpi[i].getQty().compareTo(getQty()) == 0) // same quantity
{
setC_InvoiceLine_ID(mpi[i].getC_InvoiceLine_ID());
@ -992,7 +997,7 @@ public class MMatchPO extends X_M_MatchPO
{
MInOutLine line = new MInOutLine(getCtx(), getM_InOutLine_ID(), get_TrxName());
BigDecimal matchedQty = DB.getSQLValueBD(get_TrxName(), "SELECT Coalesce(SUM(Qty),0) FROM M_MatchPO WHERE M_InOutLine_ID=?" , getM_InOutLine_ID());
if (matchedQty != null && matchedQty.compareTo(line.getMovementQty()) > 0)
if (line.getMovementQty().signum() > 0 && matchedQty != null && matchedQty.compareTo(line.getMovementQty()) > 0)
{
throw new IllegalStateException("Total matched qty > movement qty. MatchedQty="+matchedQty+", MovementQty="+line.getMovementQty()+", Line="+line);
}
@ -1000,8 +1005,8 @@ public class MMatchPO extends X_M_MatchPO
if (getC_InvoiceLine_ID() > 0)
{
MInvoiceLine line = new MInvoiceLine(getCtx(), getC_InvoiceLine_ID(), get_TrxName());
BigDecimal matchedQty = DB.getSQLValueBD(get_TrxName(), "SELECT Coalesce(SUM(Qty),0) FROM M_MatchPO WHERE C_InvoiceLine_ID=?" , getC_InvoiceLine_ID());
MInvoiceLine line = new MInvoiceLine(getCtx(), getC_InvoiceLine_ID(), get_TrxName());
BigDecimal matchedQty = DB.getSQLValueBD(get_TrxName(), "SELECT Coalesce(SUM(Qty),0) FROM M_MatchPO WHERE C_InvoiceLine_ID=? AND Reversal_ID IS NULL " , getC_InvoiceLine_ID() );
if (matchedQty != null && matchedQty.compareTo(line.getQtyInvoiced()) > 0)
{
throw new IllegalStateException("Total matched qty > invoiced qty. MatchedQty="+matchedQty+", InvoicedQty="+line.getQtyInvoiced()+", Line="+line);
@ -1039,15 +1044,21 @@ public class MMatchPO extends X_M_MatchPO
{
if (getM_InOutLine_ID() != 0) // new delivery
orderLine.setQtyDelivered(orderLine.getQtyDelivered().add(getQty()));
else // if (getM_InOutLine_ID() == 0) // reset to 0
else if (!newRecord) // if (getM_InOutLine_ID() == 0) // reset to 0
orderLine.setQtyDelivered(orderLine.getQtyDelivered().subtract(getQty()));
orderLine.setDateDelivered(getDateTrx()); // overwrite=last
}
else if (!newRecord && getM_InOutLine_ID() > 0 && is_ValueChanged(COLUMNNAME_Qty))
{
BigDecimal oldQty = (BigDecimal)(get_ValueOld(COLUMNNAME_Qty));
orderLine.setQtyDelivered(orderLine.getQtyDelivered().subtract(oldQty.subtract(getQty())));
}
if (m_isInvoiceLineChange && (newRecord || getC_InvoiceLine_ID() != get_ValueOldAsInt("C_InvoiceLine_ID")))
{
if (getC_InvoiceLine_ID() != 0) // first time
orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().add(getQty()));
else // if (getC_InvoiceLine_ID() == 0) // set to 0
else if (!newRecord) // if (getC_InvoiceLine_ID() == 0) // set to 0
orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().subtract(getQty()));
orderLine.setDateInvoiced(getDateTrx()); // overwrite=last
}
@ -1253,8 +1264,14 @@ public class MMatchPO extends X_M_MatchPO
{
MMatchPO reversal = new MMatchPO (getCtx(), 0, get_TrxName());
reversal.setC_InvoiceLine_ID(getC_InvoiceLine_ID());
reversal.setM_InOutLine_ID(getM_InOutLine_ID());
PO.copyValues(this, reversal);
reversal.setM_InOutLine_ID(getM_InOutLine_ID());
if (getC_OrderLine_ID() != 0)
reversal.setC_OrderLine_ID(getC_OrderLine_ID());
else{
reversal.setC_OrderLine_ID(getM_InOutLine().getC_OrderLine_ID());
}
reversal.setM_Product_ID(getM_Product_ID());
reversal.setM_AttributeSetInstance_ID(getM_AttributeSetInstance_ID());
reversal.setAD_Org_ID(this.getAD_Org_ID());
reversal.setDescription("(->" + this.getDocumentNo() + ")");
reversal.setQty(this.getQty().negate());
@ -1262,14 +1279,16 @@ public class MMatchPO extends X_M_MatchPO
reversal.setDateTrx(reversalDate);
reversal.set_ValueNoCheck ("DocumentNo", null);
reversal.setPosted (false);
reversal.setReversal_ID(getM_MatchPO_ID());
reversal.setProcessed(true);
reversal.setReversal_ID(getM_MatchPO_ID());
reversal.saveEx();
this.setDescription("(" + reversal.getDocumentNo() + "<-)");
this.setReversal_ID(reversal.getM_MatchPO_ID());
this.saveEx();
// reversal of mr if have both shipment and invoice line
if ( reversal.getM_InOutLine_ID() > 0 && reversal.getC_InvoiceLine_ID() > 0)
// auto create new matchpo if have invoice line
if ( reversal.getC_InvoiceLine_ID() > 0)
{
MMatchPO[] matchPOs = MMatchPO.getOrderLine(reversal.getCtx(), reversal.getC_OrderLine_ID(), reversal.get_TrxName());
BigDecimal matchQty = getQty();
@ -1288,12 +1307,19 @@ public class MMatchPO extends X_M_MatchPO
if (matchQty.signum() != 0)
{
MMatchPO matchPO = new MMatchPO (getCtx(), 0, get_TrxName());
PO.copyValues(this, matchPO);
MMatchPO matchPO = new MMatchPO (getCtx(), 0, get_TrxName());
matchPO.setC_OrderLine_ID(getC_OrderLine_ID());
matchPO.setC_InvoiceLine_ID(getC_InvoiceLine_ID());
matchPO.setM_InOutLine_ID(0);
matchPO.setM_InOutLine_ID(0);
matchPO.setAD_Org_ID(getAD_Org_ID());
matchPO.setQty(getQty());
matchPO.setDateAcct(getDateAcct());
matchPO.setDateTrx(getDateTrx());
matchPO.setM_AttributeSetInstance_ID(getM_AttributeSetInstance_ID());
matchPO.setM_Product_ID(getM_Product_ID());
matchPO.setDescription(null);
matchPO.setPosted (false);
matchPO.setProcessed(true);
matchPO.setPosted (false);
matchPO.saveEx();
}
}