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.io.File;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -26,6 +28,7 @@ import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.adempiere.exceptions.DBException;
import org.adempiere.exceptions.NegativeInventoryDisallowedException; import org.adempiere.exceptions.NegativeInventoryDisallowedException;
import org.adempiere.exceptions.PeriodClosedException; import org.adempiere.exceptions.PeriodClosedException;
import org.compiere.print.MPrintFormat; 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.setDescription(asset.getDescription() + " (" + reversal.getDocumentNo() + " #" + rLine.getLine() + "<-)");
asset.saveEx(); 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()); reversal.setC_Order_ID(getC_Order_ID());
// Set M_RMA_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].getM_InOutLine_ID() == 0)
{ {
if (!mPO[i].reverse(reversalDate)) if(mPO[i].isPosted())
{ {
m_processMsg = "Could not Reverse MatchPO"; if (!mPO[i].reverse(reversalDate))
return null; {
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 else
{ {

View File

@ -531,10 +531,7 @@ public class MMatchPO extends X_M_MatchPO
otherMatchPO = matchPO; otherMatchPO = matchPO;
iLine = new MInvoiceLine(retValue.getCtx(), matchPO.getC_InvoiceLine_ID(), retValue.get_TrxName()); iLine = new MInvoiceLine(retValue.getCtx(), matchPO.getC_InvoiceLine_ID(), retValue.get_TrxName());
matchPO.setQty(matchPO.getQty().subtract(retValue.getQty())); matchPO.setQty(matchPO.getQty().subtract(retValue.getQty()));
if (matchPO.getQty().signum() == 0 ) matchPO.saveEx();
matchPO.deleteEx(true);
else
matchPO.saveEx();
break; break;
} }
@ -594,6 +591,8 @@ public class MMatchPO extends X_M_MatchPO
} catch (Exception e) {} } catch (Exception e) {}
} }
} }
if (otherMatchPO.getQty().signum() == 0 )
otherMatchPO.deleteEx(true);
} }
} }
if (!retValue.save()) if (!retValue.save())
@ -865,7 +864,7 @@ public class MMatchPO extends X_M_MatchPO
// Bayu, Sistematika // Bayu, Sistematika
// BF [ 2240484 ] Re MatchingPO, MMatchPO doesn't contains Invoice info // BF [ 2240484 ] Re MatchingPO, MMatchPO doesn't contains Invoice info
// If newRecord, set c_invoiceline_id while null // 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()); MMatchInv[] mpi = MMatchInv.getInOutLine(getCtx(), getM_InOutLine_ID(), get_TrxName());
for (int i = 0; i < mpi.length; i++) 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 && if (mpi[i].getC_InvoiceLine_ID() != 0 &&
mpi[i].getM_AttributeSetInstance_ID() == getM_AttributeSetInstance_ID()) 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 if (mpi[i].getQty().compareTo(getQty()) == 0) // same quantity
{ {
setC_InvoiceLine_ID(mpi[i].getC_InvoiceLine_ID()); 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()); 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()); 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); 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) if (getC_InvoiceLine_ID() > 0)
{ {
MInvoiceLine line = new MInvoiceLine(getCtx(), getC_InvoiceLine_ID(), get_TrxName()); 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()); 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) if (matchedQty != null && matchedQty.compareTo(line.getQtyInvoiced()) > 0)
{ {
throw new IllegalStateException("Total matched qty > invoiced qty. MatchedQty="+matchedQty+", InvoicedQty="+line.getQtyInvoiced()+", Line="+line); 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 if (getM_InOutLine_ID() != 0) // new delivery
orderLine.setQtyDelivered(orderLine.getQtyDelivered().add(getQty())); 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.setQtyDelivered(orderLine.getQtyDelivered().subtract(getQty()));
orderLine.setDateDelivered(getDateTrx()); // overwrite=last 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 (m_isInvoiceLineChange && (newRecord || getC_InvoiceLine_ID() != get_ValueOldAsInt("C_InvoiceLine_ID")))
{ {
if (getC_InvoiceLine_ID() != 0) // first time if (getC_InvoiceLine_ID() != 0) // first time
orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().add(getQty())); 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.setQtyInvoiced(orderLine.getQtyInvoiced().subtract(getQty()));
orderLine.setDateInvoiced(getDateTrx()); // overwrite=last orderLine.setDateInvoiced(getDateTrx()); // overwrite=last
} }
@ -1253,8 +1264,14 @@ public class MMatchPO extends X_M_MatchPO
{ {
MMatchPO reversal = new MMatchPO (getCtx(), 0, get_TrxName()); MMatchPO reversal = new MMatchPO (getCtx(), 0, get_TrxName());
reversal.setC_InvoiceLine_ID(getC_InvoiceLine_ID()); reversal.setC_InvoiceLine_ID(getC_InvoiceLine_ID());
reversal.setM_InOutLine_ID(getM_InOutLine_ID()); reversal.setM_InOutLine_ID(getM_InOutLine_ID());
PO.copyValues(this, reversal); 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.setAD_Org_ID(this.getAD_Org_ID());
reversal.setDescription("(->" + this.getDocumentNo() + ")"); reversal.setDescription("(->" + this.getDocumentNo() + ")");
reversal.setQty(this.getQty().negate()); reversal.setQty(this.getQty().negate());
@ -1262,14 +1279,16 @@ public class MMatchPO extends X_M_MatchPO
reversal.setDateTrx(reversalDate); reversal.setDateTrx(reversalDate);
reversal.set_ValueNoCheck ("DocumentNo", null); reversal.set_ValueNoCheck ("DocumentNo", null);
reversal.setPosted (false); reversal.setPosted (false);
reversal.setReversal_ID(getM_MatchPO_ID()); reversal.setProcessed(true);
reversal.setReversal_ID(getM_MatchPO_ID());
reversal.saveEx(); reversal.saveEx();
this.setDescription("(" + reversal.getDocumentNo() + "<-)"); this.setDescription("(" + reversal.getDocumentNo() + "<-)");
this.setReversal_ID(reversal.getM_MatchPO_ID()); this.setReversal_ID(reversal.getM_MatchPO_ID());
this.saveEx(); this.saveEx();
// reversal of mr if have both shipment and invoice line // auto create new matchpo if have invoice line
if ( reversal.getM_InOutLine_ID() > 0 && reversal.getC_InvoiceLine_ID() > 0) if ( reversal.getC_InvoiceLine_ID() > 0)
{ {
MMatchPO[] matchPOs = MMatchPO.getOrderLine(reversal.getCtx(), reversal.getC_OrderLine_ID(), reversal.get_TrxName()); MMatchPO[] matchPOs = MMatchPO.getOrderLine(reversal.getCtx(), reversal.getC_OrderLine_ID(), reversal.get_TrxName());
BigDecimal matchQty = getQty(); BigDecimal matchQty = getQty();
@ -1288,12 +1307,19 @@ public class MMatchPO extends X_M_MatchPO
if (matchQty.signum() != 0) if (matchQty.signum() != 0)
{ {
MMatchPO matchPO = new MMatchPO (getCtx(), 0, get_TrxName()); MMatchPO matchPO = new MMatchPO (getCtx(), 0, get_TrxName());
PO.copyValues(this, matchPO); matchPO.setC_OrderLine_ID(getC_OrderLine_ID());
matchPO.setC_InvoiceLine_ID(getC_InvoiceLine_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.setDescription(null);
matchPO.setPosted (false); matchPO.setProcessed(true);
matchPO.setPosted (false);
matchPO.saveEx(); matchPO.saveEx();
} }
} }