IDEMPIERE-150 Vendor RMA - M_cost Table is not updated.
This commit is contained in:
parent
4879ef281c
commit
b27e82ec94
|
@ -1143,6 +1143,11 @@ public class DocLine
|
||||||
} // getReversalLine_ID
|
} // getReversalLine_ID
|
||||||
//end AZ Goodwill
|
//end AZ Goodwill
|
||||||
|
|
||||||
|
public PO getPO()
|
||||||
|
{
|
||||||
|
return p_po;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* String representation
|
* String representation
|
||||||
* @return String
|
* @return String
|
||||||
|
|
|
@ -18,9 +18,14 @@ package org.compiere.acct;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.Timestamp;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.compiere.model.I_M_InOutLine;
|
||||||
|
import org.compiere.model.I_M_RMA;
|
||||||
|
import org.compiere.model.I_M_RMALine;
|
||||||
|
import org.compiere.model.MConversionRate;
|
||||||
import org.compiere.model.MTax;
|
import org.compiere.model.MTax;
|
||||||
import org.compiere.model.MCurrency;
|
import org.compiere.model.MCurrency;
|
||||||
import org.compiere.model.MAccount;
|
import org.compiere.model.MAccount;
|
||||||
|
@ -33,6 +38,7 @@ import org.compiere.model.MProduct;
|
||||||
import org.compiere.model.ProductCost;
|
import org.compiere.model.ProductCost;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Post Shipment/Receipt Documents.
|
* Post Shipment/Receipt Documents.
|
||||||
|
@ -597,6 +603,13 @@ public class Doc_InOut extends Doc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String costingError = createVendorRMACostDetail(as);
|
||||||
|
if (!Util.isEmpty(costingError))
|
||||||
|
{
|
||||||
|
p_Error = costingError;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
} // Purchasing Return
|
} // Purchasing Return
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -613,4 +626,84 @@ public class Doc_InOut extends Doc
|
||||||
return m_Reversal_ID !=0 && line.getReversalLine_ID() != 0;
|
return m_Reversal_ID !=0 && line.getReversalLine_ID() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String createVendorRMACostDetail(MAcctSchema as)
|
||||||
|
{
|
||||||
|
MOrderLine origianlOrderLine = null;
|
||||||
|
|
||||||
|
MInOut inOut = (MInOut) getPO();
|
||||||
|
|
||||||
|
for (int i = 0; i < p_lines.length; i++)
|
||||||
|
{
|
||||||
|
DocLine line = p_lines[i];
|
||||||
|
MInOutLine ioLine = (MInOutLine) line.getPO();
|
||||||
|
I_M_RMALine rmaLine = ioLine.getM_RMALine();
|
||||||
|
|
||||||
|
BigDecimal poCost = rmaLine != null ? rmaLine.getAmt() : BigDecimal.ZERO;
|
||||||
|
I_M_InOutLine originalInOutLine = rmaLine != null ? rmaLine.getM_InOutLine() : null;
|
||||||
|
if (originalInOutLine != null && originalInOutLine.getC_OrderLine_ID() > 0)
|
||||||
|
{
|
||||||
|
origianlOrderLine = (MOrderLine) originalInOutLine.getC_OrderLine();
|
||||||
|
// Goodwill: Correct included Tax
|
||||||
|
int C_Tax_ID = origianlOrderLine.getC_Tax_ID();
|
||||||
|
if (origianlOrderLine.isTaxIncluded() && C_Tax_ID != 0)
|
||||||
|
{
|
||||||
|
MTax tax = MTax.get(getCtx(), C_Tax_ID);
|
||||||
|
if (!tax.isZeroTax())
|
||||||
|
{
|
||||||
|
int stdPrecision = MCurrency.getStdPrecision(getCtx(), origianlOrderLine.getC_Currency_ID());
|
||||||
|
BigDecimal costTax = tax.calculateTax(poCost, true, stdPrecision);
|
||||||
|
if (log.isLoggable(Level.FINE)) log.fine("Costs=" + poCost + " - Tax=" + costTax);
|
||||||
|
poCost = poCost.subtract(costTax);
|
||||||
|
}
|
||||||
|
} // correct included Tax
|
||||||
|
poCost = poCost.multiply(line.getQty()); // Returned so far
|
||||||
|
BigDecimal tAmt = poCost;
|
||||||
|
BigDecimal tQty = line.getQty();
|
||||||
|
|
||||||
|
I_M_RMA rma = rmaLine.getM_RMA();
|
||||||
|
if (rma.getC_Currency_ID() != as.getC_Currency_ID())
|
||||||
|
{
|
||||||
|
Timestamp dateAcct = inOut.getDateAcct();
|
||||||
|
//
|
||||||
|
BigDecimal rate = MConversionRate.getRate(
|
||||||
|
rma.getC_Currency_ID(), as.getC_Currency_ID(),
|
||||||
|
dateAcct, 0,
|
||||||
|
rmaLine.getAD_Client_ID(), rmaLine.getAD_Org_ID());
|
||||||
|
if (rate == null)
|
||||||
|
{
|
||||||
|
return "Vendor RMA not convertible - " + as.getName();
|
||||||
|
}
|
||||||
|
poCost = poCost.multiply(rate);
|
||||||
|
if (poCost.scale() > as.getCostingPrecision())
|
||||||
|
poCost = poCost.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP);
|
||||||
|
tAmt = tAmt.multiply(rate);
|
||||||
|
if (tAmt.scale() > as.getCostingPrecision())
|
||||||
|
tAmt = tAmt.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Total Amount and Total Quantity from rma line
|
||||||
|
if (!MCostDetail.createShipment(as, line.getAD_Org_ID(), line.getM_Product_ID(),
|
||||||
|
line.getM_AttributeSetInstance_ID(), line.get_ID(), 0, tAmt, tQty,
|
||||||
|
line.getDescription(), false, getTrxName()))
|
||||||
|
{
|
||||||
|
return "SaveError";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//no rma line linkage, fallback to current cost
|
||||||
|
poCost = line.getProductCosts(as, line.getAD_Org_ID(), false);
|
||||||
|
BigDecimal tAmt = poCost.negate();
|
||||||
|
BigDecimal tQty = line.getQty();
|
||||||
|
if (!MCostDetail.createShipment(as, line.getAD_Org_ID(), line.getM_Product_ID(),
|
||||||
|
line.getM_AttributeSetInstance_ID(), line.get_ID(), 0, tAmt, tQty,
|
||||||
|
line.getDescription(), false, getTrxName()))
|
||||||
|
{
|
||||||
|
return "SaveError";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// end MZ
|
||||||
|
return "";
|
||||||
|
}
|
||||||
} // Doc_InOut
|
} // Doc_InOut
|
||||||
|
|
|
@ -23,6 +23,7 @@ import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.compiere.acct.Doc;
|
||||||
import org.compiere.model.X_M_CostHistory;
|
import org.compiere.model.X_M_CostHistory;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
|
@ -51,6 +52,12 @@ public class MCostDetail extends X_M_CostDetail
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -448632684360931078L;
|
private static final long serialVersionUID = -448632684360931078L;
|
||||||
|
|
||||||
|
private static final String INOUTLINE_DOCBASETYPE_SQL =
|
||||||
|
"SELECT c.DocBaseType From M_InOut io " +
|
||||||
|
"INNER JOIN M_InOutLine iol ON io.M_InOut_ID=iol.M_InOut_ID " +
|
||||||
|
"INNER JOIN C_DocType c ON io.C_DocType_ID=c.C_DocType_ID " +
|
||||||
|
"WHERE iol.M_InOutLine_ID=?";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create New Order Cost Detail for Purchase Orders.
|
* Create New Order Cost Detail for Purchase Orders.
|
||||||
* Called from Doc_MatchPO
|
* Called from Doc_MatchPO
|
||||||
|
@ -677,6 +684,20 @@ public class MCostDetail extends X_M_CostDetail
|
||||||
return isSOTrx() && getM_InOutLine_ID() != 0;
|
return isSOTrx() && getM_InOutLine_ID() != 0;
|
||||||
} // isShipment
|
} // isShipment
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if return to vendor
|
||||||
|
*/
|
||||||
|
public boolean isVendorRMA()
|
||||||
|
{
|
||||||
|
if (!isSOTrx() && getM_InOutLine_ID() > 0)
|
||||||
|
{
|
||||||
|
String docBaseType = DB.getSQLValueString((String)null,
|
||||||
|
INOUTLINE_DOCBASETYPE_SQL, getM_InOutLine_ID());
|
||||||
|
return Doc.DOCTYPE_MatShipment.equals(docBaseType);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is this a Delta Record (previously processed)?
|
* Is this a Delta Record (previously processed)?
|
||||||
* @return true if delta is not null
|
* @return true if delta is not null
|
||||||
|
@ -1036,22 +1057,26 @@ public class MCostDetail extends X_M_CostDetail
|
||||||
|| getPP_Cost_Collector_ID() != 0)
|
|| getPP_Cost_Collector_ID() != 0)
|
||||||
{
|
{
|
||||||
boolean addition = qty.signum() > 0;
|
boolean addition = qty.signum() > 0;
|
||||||
|
boolean isVendorRMA = isVendorRMA();
|
||||||
//
|
//
|
||||||
if (ce.isAverageInvoice())
|
if (ce.isAverageInvoice())
|
||||||
{
|
{
|
||||||
if (addition)
|
if (!isVendorRMA)
|
||||||
{
|
{
|
||||||
cost.setWeightedAverage(amt, qty);
|
if (addition)
|
||||||
//shouldn't accumulate reversal of customer shipment qty and amt
|
|
||||||
if (isShipment())
|
|
||||||
{
|
{
|
||||||
cost.setCumulatedQty(history.getOldCQty());
|
cost.setWeightedAverage(amt, qty);
|
||||||
cost.setCumulatedAmt(history.getOldCAmt());
|
//shouldn't accumulate reversal of customer shipment qty and amt
|
||||||
|
if (isShipment())
|
||||||
|
{
|
||||||
|
cost.setCumulatedQty(history.getOldCQty());
|
||||||
|
cost.setCumulatedAmt(history.getOldCAmt());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
||||||
|
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - AverageInv - " + cost);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
|
||||||
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - AverageInv - " + cost);
|
|
||||||
}
|
}
|
||||||
else if (ce.isAveragePO())
|
else if (ce.isAveragePO())
|
||||||
{
|
{
|
||||||
|
@ -1059,51 +1084,63 @@ public class MCostDetail extends X_M_CostDetail
|
||||||
{
|
{
|
||||||
cost.setWeightedAverage(amt, qty);
|
cost.setWeightedAverage(amt, qty);
|
||||||
//shouldn't accumulate reversal of customer shipment qty and amt
|
//shouldn't accumulate reversal of customer shipment qty and amt
|
||||||
if (isShipment())
|
if (isShipment() && !isVendorRMA())
|
||||||
{
|
{
|
||||||
cost.setCumulatedQty(history.getOldCQty());
|
cost.setCumulatedQty(history.getOldCQty());
|
||||||
cost.setCumulatedAmt(history.getOldCAmt());
|
cost.setCumulatedAmt(history.getOldCAmt());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
{
|
||||||
|
if (isVendorRMA)
|
||||||
|
{
|
||||||
|
cost.setWeightedAverage(amt, qty);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
||||||
|
}
|
||||||
|
}
|
||||||
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - AveragePO - " + cost);
|
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - AveragePO - " + cost);
|
||||||
}
|
}
|
||||||
else if (ce.isFifo() || ce.isLifo())
|
else if (ce.isFifo() || ce.isLifo())
|
||||||
{
|
{
|
||||||
if (addition)
|
if (!isVendorRMA)
|
||||||
{
|
{
|
||||||
// Real ASI - costing level Org
|
if (addition)
|
||||||
MCostQueue cq = MCostQueue.get(product, getM_AttributeSetInstance_ID(),
|
{
|
||||||
as, Org_ID, ce.getM_CostElement_ID(), get_TrxName());
|
// Real ASI - costing level Org
|
||||||
cq.setCosts(amt, qty, precision);
|
MCostQueue cq = MCostQueue.get(product, getM_AttributeSetInstance_ID(),
|
||||||
cq.saveEx();
|
as, Org_ID, ce.getM_CostElement_ID(), get_TrxName());
|
||||||
|
cq.setCosts(amt, qty, precision);
|
||||||
|
cq.saveEx();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Adjust Queue - costing level Org/ASI
|
||||||
|
MCostQueue.adjustQty(product, M_ASI_ID,
|
||||||
|
as, Org_ID, ce, qty.negate(), get_TrxName());
|
||||||
|
}
|
||||||
|
// Get Costs - costing level Org/ASI
|
||||||
|
MCostQueue[] cQueue = MCostQueue.getQueue(product, M_ASI_ID,
|
||||||
|
as, Org_ID, ce, get_TrxName());
|
||||||
|
if (cQueue != null && cQueue.length > 0)
|
||||||
|
cost.setCurrentCostPrice(cQueue[0].getCurrentCostPrice());
|
||||||
|
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
||||||
|
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - FiFo/Lifo - " + cost);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// Adjust Queue - costing level Org/ASI
|
|
||||||
MCostQueue.adjustQty(product, M_ASI_ID,
|
|
||||||
as, Org_ID, ce, qty.negate(), get_TrxName());
|
|
||||||
}
|
|
||||||
// Get Costs - costing level Org/ASI
|
|
||||||
MCostQueue[] cQueue = MCostQueue.getQueue(product, M_ASI_ID,
|
|
||||||
as, Org_ID, ce, get_TrxName());
|
|
||||||
if (cQueue != null && cQueue.length > 0)
|
|
||||||
cost.setCurrentCostPrice(cQueue[0].getCurrentCostPrice());
|
|
||||||
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
|
||||||
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - FiFo/Lifo - " + cost);
|
|
||||||
}
|
}
|
||||||
else if (ce.isLastInvoice())
|
else if (ce.isLastInvoice() && !isVendorRMA)
|
||||||
{
|
{
|
||||||
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
||||||
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - LastInv - " + cost);
|
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - LastInv - " + cost);
|
||||||
}
|
}
|
||||||
else if (ce.isLastPOPrice())
|
else if (ce.isLastPOPrice() && !isVendorRMA)
|
||||||
{
|
{
|
||||||
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
cost.setCurrentQty(cost.getCurrentQty().add(qty));
|
||||||
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - LastPO - " + cost);
|
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - LastPO - " + cost);
|
||||||
}
|
}
|
||||||
else if (ce.isStandardCosting())
|
else if (ce.isStandardCosting() && !isVendorRMA)
|
||||||
{
|
{
|
||||||
if (addition)
|
if (addition)
|
||||||
{
|
{
|
||||||
|
@ -1123,7 +1160,7 @@ public class MCostDetail extends X_M_CostDetail
|
||||||
}
|
}
|
||||||
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - Standard - " + cost);
|
if (log.isLoggable(Level.FINER)) log.finer("QtyAdjust - Standard - " + cost);
|
||||||
}
|
}
|
||||||
else if (ce.isUserDefined())
|
else if (ce.isUserDefined() && !isVendorRMA)
|
||||||
{
|
{
|
||||||
// Interface
|
// Interface
|
||||||
if (addition)
|
if (addition)
|
||||||
|
|
Loading…
Reference in New Issue