FR [2962094] Finish implementation of weighted average costing - found problems when committing immediate inout and invoice - the generated matchinv and matchpo must be posted after

Link to SF Tracker: http://sourceforge.net/support/tracker.php?aid=2962094
This commit is contained in:
Carlos Ruiz 2010-03-18 01:15:25 +00:00
parent 41c1d5a2ad
commit 8c1813b408
4 changed files with 80 additions and 28 deletions

View File

@ -20,6 +20,7 @@ import java.io.File;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
@ -54,7 +55,7 @@ public class MInOut extends X_M_InOut implements DocAction
/** /**
* *
*/ */
private static final long serialVersionUID = 727186799622809208L; private static final long serialVersionUID = -239302197968535277L;
/** /**
* Create Shipment From Order * Create Shipment From Order
@ -1481,14 +1482,16 @@ public class MInOut extends X_M_InOut implements DocAction
iLine.save(); // update matched invoice with ASI iLine.save(); // update matched invoice with ASI
inv.setM_AttributeSetInstance_ID(sLine.getM_AttributeSetInstance_ID()); inv.setM_AttributeSetInstance_ID(sLine.getM_AttributeSetInstance_ID());
} }
boolean isNewMatchInv = false;
if (inv.get_ID() == 0)
isNewMatchInv = true;
if (!inv.save(get_TrxName())) if (!inv.save(get_TrxName()))
{ {
m_processMsg = CLogger.retrieveErrorString("Could not create Inv Matching"); m_processMsg = CLogger.retrieveErrorString("Could not create Inv Matching");
return DocAction.STATUS_Invalid; return DocAction.STATUS_Invalid;
} }
if (MClient.isClientAccountingImmediate()) { if (isNewMatchInv)
String ignoreError = DocumentEngine.postImmediate(inv.getCtx(), inv.getAD_Client_ID(), inv.get_Table_ID(), inv.get_ID(), true, inv.get_TrxName()); addDocsPostProcess(inv);
}
} }
} }
@ -1498,14 +1501,16 @@ public class MInOut extends X_M_InOut implements DocAction
log.fine("PO Matching"); log.fine("PO Matching");
// Ship - PO // Ship - PO
MMatchPO po = MMatchPO.create (null, sLine, getMovementDate(), matchQty); MMatchPO po = MMatchPO.create (null, sLine, getMovementDate(), matchQty);
boolean isNewMatchPO = false;
if (po.get_ID() == 0)
isNewMatchPO = true;
if (!po.save(get_TrxName())) if (!po.save(get_TrxName()))
{ {
m_processMsg = "Could not create PO Matching"; m_processMsg = "Could not create PO Matching";
return DocAction.STATUS_Invalid; return DocAction.STATUS_Invalid;
} }
if (MClient.isClientAccountingImmediate()) { if (isNewMatchPO)
String ignoreError = DocumentEngine.postImmediate(po.getCtx(), po.getAD_Client_ID(), po.get_Table_ID(), po.get_ID(), true, po.get_TrxName()); addDocsPostProcess(po);
}
// Update PO with ASI // Update PO with ASI
if ( oLine != null && oLine.getM_AttributeSetInstance_ID() == 0 if ( oLine != null && oLine.getM_AttributeSetInstance_ID() == 0
&& sLine.getMovementQty().compareTo(oLine.getQtyOrdered()) == 0) // just if full match [ 1876965 ] && sLine.getMovementQty().compareTo(oLine.getQtyOrdered()) == 0) // just if full match [ 1876965 ]
@ -1524,14 +1529,16 @@ public class MInOut extends X_M_InOut implements DocAction
// Ship - Invoice // Ship - Invoice
MMatchPO po = MMatchPO.create (iLine, sLine, MMatchPO po = MMatchPO.create (iLine, sLine,
getMovementDate(), matchQty); getMovementDate(), matchQty);
boolean isNewMatchPO = false;
if (po.get_ID() == 0)
isNewMatchPO = true;
if (!po.save(get_TrxName())) if (!po.save(get_TrxName()))
{ {
m_processMsg = "Could not create PO(Inv) Matching"; m_processMsg = "Could not create PO(Inv) Matching";
return DocAction.STATUS_Invalid; return DocAction.STATUS_Invalid;
} }
if (MClient.isClientAccountingImmediate()) { if (isNewMatchPO)
String ignoreError = DocumentEngine.postImmediate(po.getCtx(), po.getAD_Client_ID(), po.get_Table_ID(), po.get_ID(), true, po.get_TrxName()); addDocsPostProcess(po);
}
// Update PO with ASI // Update PO with ASI
oLine = new MOrderLine (getCtx(), po.getC_OrderLine_ID(), get_TrxName()); oLine = new MOrderLine (getCtx(), po.getC_OrderLine_ID(), get_TrxName());
if ( oLine != null && oLine.getM_AttributeSetInstance_ID() == 0 if ( oLine != null && oLine.getM_AttributeSetInstance_ID() == 0
@ -1572,6 +1579,17 @@ public class MInOut extends X_M_InOut implements DocAction
return DocAction.STATUS_Completed; return DocAction.STATUS_Completed;
} // completeIt } // completeIt
/* Save array of documents to process AFTER completing this one */
ArrayList<PO> docsPostProcess = new ArrayList<PO>();
private void addDocsPostProcess(PO doc) {
docsPostProcess.add(doc);
}
public ArrayList<PO> getDocsPostProcess() {
return docsPostProcess;
}
/** /**
* Automatically creates a customer shipment for any * Automatically creates a customer shipment for any
* drop shipment material receipt * drop shipment material receipt

View File

@ -61,8 +61,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
/** /**
* *
*/ */
private static final long serialVersionUID = 5406556271212363271L; private static final long serialVersionUID = 816227083897031327L;
/** /**
* Get Payments Of BPartner * Get Payments Of BPartner
@ -1676,17 +1675,17 @@ public class MInvoice extends X_C_Invoice implements DocAction
BigDecimal matchQty = line.getQtyInvoiced(); BigDecimal matchQty = line.getQtyInvoiced();
MMatchPO po = MMatchPO.create (line, null, MMatchPO po = MMatchPO.create (line, null,
getDateInvoiced(), matchQty); getDateInvoiced(), matchQty);
boolean isNewMatchPO = false;
if (po.get_ID() == 0)
isNewMatchPO = true;
if (!po.save(get_TrxName())) if (!po.save(get_TrxName()))
{ {
m_processMsg = "Could not create PO Matching"; m_processMsg = "Could not create PO Matching";
return DocAction.STATUS_Invalid; return DocAction.STATUS_Invalid;
} }
else { matchPO++;
matchPO++; if (isNewMatchPO)
if (MClient.isClientAccountingImmediate()) { addDocsPostProcess(po);
String ignoreError = DocumentEngine.postImmediate(po.getCtx(), po.getAD_Client_ID(), po.get_Table_ID(), po.get_ID(), true, po.get_TrxName());
}
}
} }
} }
@ -1719,17 +1718,17 @@ public class MInvoice extends X_C_Invoice implements DocAction
matchQty = receiptLine.getMovementQty(); matchQty = receiptLine.getMovementQty();
MMatchInv inv = new MMatchInv(line, getDateInvoiced(), matchQty); MMatchInv inv = new MMatchInv(line, getDateInvoiced(), matchQty);
boolean isNewMatchInv = false;
if (inv.get_ID() == 0)
isNewMatchInv = true;
if (!inv.save(get_TrxName())) if (!inv.save(get_TrxName()))
{ {
m_processMsg = CLogger.retrieveErrorString("Could not create Invoice Matching"); m_processMsg = CLogger.retrieveErrorString("Could not create Invoice Matching");
return DocAction.STATUS_Invalid; return DocAction.STATUS_Invalid;
} }
else { matchInv++;
matchInv++; if (isNewMatchInv)
if (MClient.isClientAccountingImmediate()) { addDocsPostProcess(inv);
String ignoreError = DocumentEngine.postImmediate(inv.getCtx(), inv.getAD_Client_ID(), inv.get_Table_ID(), inv.get_ID(), true, inv.get_TrxName());
}
}
} }
} // for all lines } // for all lines
if (matchInv > 0) if (matchInv > 0)
@ -1858,6 +1857,17 @@ public class MInvoice extends X_C_Invoice implements DocAction
return DocAction.STATUS_Completed; return DocAction.STATUS_Completed;
} // completeIt } // completeIt
/* Save array of documents to process AFTER completing this one */
ArrayList<PO> docsPostProcess = new ArrayList<PO>();
private void addDocsPostProcess(PO doc) {
docsPostProcess.add(doc);
}
public ArrayList<PO> getDocsPostProcess() {
return docsPostProcess;
}
/** /**
* Set the definite document number after completed * Set the definite document number after completed
*/ */

View File

@ -95,7 +95,7 @@ public abstract class PO
/** /**
* *
*/ */
private static final long serialVersionUID = 4112064325136026951L; private static final long serialVersionUID = 6604764467216189092L;
private static final String USE_TIMEOUT_FOR_UPDATE = "org.adempiere.po.useTimeoutForUpdate"; private static final String USE_TIMEOUT_FOR_UPDATE = "org.adempiere.po.useTimeoutForUpdate";
@ -829,7 +829,7 @@ public abstract class PO
/* FR 2962094 - Finish implementation of weighted average costing /* FR 2962094 - Finish implementation of weighted average costing
Fill the column ProcessedOn (if it exists) with a bigdecimal representation of current timestamp (with nanoseconds) Fill the column ProcessedOn (if it exists) with a bigdecimal representation of current timestamp (with nanoseconds)
*/ */
private void setProcessedOn(String ColumnName, Object value, Object oldValue) { public void setProcessedOn(String ColumnName, Object value, Object oldValue) {
if ("Processed".equals(ColumnName) if ("Processed".equals(ColumnName)
&& value instanceof Boolean && value instanceof Boolean
&& ((Boolean)value).booleanValue() == true && ((Boolean)value).booleanValue() == true

View File

@ -44,10 +44,10 @@ import org.compiere.model.MMovement;
import org.compiere.model.MOrder; import org.compiere.model.MOrder;
import org.compiere.model.MPayment; import org.compiere.model.MPayment;
import org.compiere.model.MTable; import org.compiere.model.MTable;
import org.compiere.model.PO;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Ini;
import org.eevolution.model.I_DD_Order; import org.eevolution.model.I_DD_Order;
import org.eevolution.model.I_HR_Process; import org.eevolution.model.I_HR_Process;
import org.eevolution.model.I_PP_Cost_Collector; import org.eevolution.model.I_PP_Cost_Collector;
@ -295,12 +295,36 @@ public class DocumentEngine implements DocAction
|| STATUS_WaitingConfirmation.equals(status); || STATUS_WaitingConfirmation.equals(status);
if (m_document != null && ok) if (m_document != null && ok)
{ {
MClient client = MClient.get(m_document.getCtx(), m_document.getAD_Client_ID()); // PostProcess documents when invoice or inout (this is to postprocess the generated MatchPO and MatchInv if any)
ArrayList<PO> docsPostProcess = new ArrayList<PO>();;
if (m_document instanceof MInvoice || m_document instanceof MInOut) {
if (m_document instanceof MInvoice) {
docsPostProcess = ((MInvoice) m_document).getDocsPostProcess();
}
if (m_document instanceof MInOut) {
docsPostProcess = ((MInOut) m_document).getDocsPostProcess();
}
}
if (m_document instanceof PO && docsPostProcess.size() > 0) {
// Process (this is to update the ProcessedOn flag with a timestamp after the original document)
for (PO docafter : docsPostProcess) {
docafter.setProcessedOn("Processed", true, false);
docafter.save();
}
}
if (STATUS_Completed.equals(status) && MClient.isClientAccountingImmediate()) if (STATUS_Completed.equals(status) && MClient.isClientAccountingImmediate())
{ {
m_document.save(); m_document.save();
postIt(); postIt();
if (m_document instanceof PO && docsPostProcess.size() > 0) {
for (PO docafter : docsPostProcess) {
String ignoreError = DocumentEngine.postImmediate(docafter.getCtx(), docafter.getAD_Client_ID(), docafter.get_Table_ID(), docafter.get_ID(), true, docafter.get_TrxName());
}
}
} }
} }
return ok; return ok;
} }