BF 1693997 - Calculation of cost should happen when transaction complete
This commit is contained in:
parent
127b89e9a0
commit
60f34d42ce
|
@ -291,6 +291,7 @@ public class Doc_MatchInv extends Doc
|
||||||
tAmt = tAmt.add(m_invoiceLine.getLineNetAmt().multiply(multiplier));
|
tAmt = tAmt.add(m_invoiceLine.getLineNetAmt().multiply(multiplier));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
tAmt = tAmt.add(cr.getAcctBalance().negate()); //Invoice Price
|
||||||
|
|
||||||
// Different currency
|
// Different currency
|
||||||
MInvoice invoice = m_invoiceLine.getParent();
|
MInvoice invoice = m_invoiceLine.getParent();
|
||||||
|
@ -307,7 +308,6 @@ public class Doc_MatchInv extends Doc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tAmt = tAmt.add(cr.getAcctBalance().negate()); //Invoice Price
|
|
||||||
// set Qty to negative value when MovementType is Vendor Returns
|
// set Qty to negative value when MovementType is Vendor Returns
|
||||||
MInOut receipt = m_receiptLine.getParent();
|
MInOut receipt = m_receiptLine.getParent();
|
||||||
if (receipt.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns))
|
if (receipt.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns))
|
||||||
|
|
|
@ -1791,11 +1791,6 @@ public class MInvoice extends X_C_Invoice implements DocAction
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
matchInv++;
|
matchInv++;
|
||||||
|
|
||||||
// Elaine 2008/6/20
|
|
||||||
String err = createMatchInvCostDetail(inv, line, receiptLine);
|
|
||||||
if(err != null && err.length() > 0) return err;
|
|
||||||
//
|
|
||||||
}
|
}
|
||||||
} // for all lines
|
} // for all lines
|
||||||
if (matchInv > 0)
|
if (matchInv > 0)
|
||||||
|
@ -1924,91 +1919,6 @@ public class MInvoice extends X_C_Invoice implements DocAction
|
||||||
return DocAction.STATUS_Completed;
|
return DocAction.STATUS_Completed;
|
||||||
} // completeIt
|
} // completeIt
|
||||||
|
|
||||||
// Elaine 2008/6/20
|
|
||||||
private String createMatchInvCostDetail(MMatchInv inv, MInvoiceLine m_invoiceLine, MInOutLine m_receiptLine)
|
|
||||||
{
|
|
||||||
// Get Account Schemas to create MCostDetail
|
|
||||||
MAcctSchema[] acctschemas = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID());
|
|
||||||
for(int asn = 0; asn < acctschemas.length; asn++)
|
|
||||||
{
|
|
||||||
MAcctSchema as = acctschemas[asn];
|
|
||||||
|
|
||||||
boolean skip = false;
|
|
||||||
if (as.getAD_OrgOnly_ID() != 0)
|
|
||||||
{
|
|
||||||
if (as.getOnlyOrgs() == null)
|
|
||||||
as.setOnlyOrgs(MReportTree.getChildIDs(getCtx(),
|
|
||||||
0, MAcctSchemaElement.ELEMENTTYPE_Organization,
|
|
||||||
as.getAD_OrgOnly_ID()));
|
|
||||||
|
|
||||||
// Header Level Org
|
|
||||||
skip = as.isSkipOrg(getAD_Org_ID());
|
|
||||||
// Line Level Org
|
|
||||||
skip = as.isSkipOrg(m_invoiceLine.getAD_Org_ID());
|
|
||||||
}
|
|
||||||
if (skip)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
BigDecimal LineNetAmt = m_invoiceLine.getLineNetAmt();
|
|
||||||
BigDecimal multiplier = inv.getQty()
|
|
||||||
.divide(m_invoiceLine.getQtyInvoiced(), 12, BigDecimal.ROUND_HALF_UP)
|
|
||||||
.abs();
|
|
||||||
if (multiplier.compareTo(Env.ONE) != 0)
|
|
||||||
LineNetAmt = LineNetAmt.multiply(multiplier);
|
|
||||||
|
|
||||||
// Source from Doc_MatchInv.createFacts(MAcctSchema)
|
|
||||||
// Cost Detail Record - data from Expense/IncClearing (CR) record
|
|
||||||
// MZ Goodwill
|
|
||||||
// Create Cost Detail Matched Invoice using Total Amount and Total Qty based on InvoiceLine
|
|
||||||
MMatchInv[] mInv = MMatchInv.getInvoiceLine(getCtx(), m_invoiceLine.getC_InvoiceLine_ID(), inv.get_TrxName());
|
|
||||||
BigDecimal tQty = Env.ZERO;
|
|
||||||
BigDecimal tAmt = Env.ZERO;
|
|
||||||
for (int i = 0 ; i < mInv.length ; i++)
|
|
||||||
{
|
|
||||||
if (mInv[i].isPosted() && mInv[i].getM_MatchInv_ID() != get_ID())
|
|
||||||
{
|
|
||||||
tQty = tQty.add(mInv[i].getQty());
|
|
||||||
multiplier = mInv[i].getQty()
|
|
||||||
.divide(m_invoiceLine.getQtyInvoiced(), 12, BigDecimal.ROUND_HALF_UP).abs();
|
|
||||||
tAmt = tAmt.add(m_invoiceLine.getLineNetAmt().multiply(multiplier));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Different currency
|
|
||||||
MInvoice invoice = m_invoiceLine.getParent();
|
|
||||||
if (as.getC_Currency_ID() != invoice.getC_Currency_ID())
|
|
||||||
{
|
|
||||||
tAmt = MConversionRate.convert(getCtx(), tAmt,
|
|
||||||
invoice.getC_Currency_ID(), as.getC_Currency_ID(),
|
|
||||||
invoice.getDateAcct(), invoice.getC_ConversionType_ID(),
|
|
||||||
invoice.getAD_Client_ID(), invoice.getAD_Org_ID());
|
|
||||||
if (tAmt == null)
|
|
||||||
{
|
|
||||||
return "AP Invoice not convertible - " + as.getName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tAmt = tAmt.add(LineNetAmt); //Invoice Price
|
|
||||||
// set Qty to negative value when MovementType is Vendor Returns
|
|
||||||
MInOut receipt = m_receiptLine.getParent();
|
|
||||||
if (receipt.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns))
|
|
||||||
tQty = tQty.add(inv.getQty().negate()); // Qty is set to negative value
|
|
||||||
else
|
|
||||||
tQty = tQty.add(inv.getQty());
|
|
||||||
|
|
||||||
// Set Total Amount and Total Quantity from Matched Invoice
|
|
||||||
MCostDetail.createInvoice(as, getAD_Org_ID(),
|
|
||||||
inv.getM_Product_ID(), inv.getM_AttributeSetInstance_ID(),
|
|
||||||
m_invoiceLine.getC_InvoiceLine_ID(), 0, // No cost element
|
|
||||||
tAmt, tQty, getDescription(), inv.get_TrxName());
|
|
||||||
// end MZ
|
|
||||||
// end
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the definite document number after completed
|
* Set the definite document number after completed
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -24,6 +24,7 @@ import java.util.ArrayList;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.compiere.report.MReportTree;
|
||||||
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;
|
||||||
|
@ -294,6 +295,29 @@ public class MMatchInv extends X_M_MatchInv
|
||||||
return true;
|
return true;
|
||||||
} // beforeSave
|
} // beforeSave
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After Save.
|
||||||
|
* Set Order Qty Delivered/Invoiced
|
||||||
|
* @param newRecord new
|
||||||
|
* @param success success
|
||||||
|
* @return success
|
||||||
|
*/
|
||||||
|
protected boolean afterSave (boolean newRecord, boolean success)
|
||||||
|
{
|
||||||
|
if (newRecord && success)
|
||||||
|
{
|
||||||
|
// Elaine 2008/6/20
|
||||||
|
String err = createMatchInvCostDetail();
|
||||||
|
if(err != null && err.length() > 0)
|
||||||
|
{
|
||||||
|
s_log.warning(err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return success;
|
||||||
|
} // afterSave
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the later Date Acct from invoice or shipment
|
* Get the later Date Acct from invoice or shipment
|
||||||
* @return date or null
|
* @return date or null
|
||||||
|
@ -347,37 +371,9 @@ public class MMatchInv extends X_M_MatchInv
|
||||||
{
|
{
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
// MZ Goodwill
|
// AZ Goodwill
|
||||||
// update/delete Cost Detail and recalculate Current Cost
|
deleteMatchInvCostDetail();
|
||||||
MCostDetail cd = MCostDetail.get (getCtx(), "C_InvoiceLine_ID=? AND M_AttributeSetInstance_ID=?",
|
// end AZ
|
||||||
getC_InvoiceLine_ID(), getM_AttributeSetInstance_ID(), get_TrxName());
|
|
||||||
if (cd != null)
|
|
||||||
{
|
|
||||||
MInOut receipt = (new MInOutLine(getCtx(),getM_InOutLine_ID(),get_TrxName())).getParent();
|
|
||||||
BigDecimal qty = getQty();
|
|
||||||
if (receipt.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns))
|
|
||||||
qty = getQty().negate();
|
|
||||||
//
|
|
||||||
BigDecimal price = cd.getAmt().divide(cd.getQty(),12,BigDecimal.ROUND_HALF_UP);
|
|
||||||
cd.setDeltaAmt(price.multiply(qty.negate()));
|
|
||||||
cd.setDeltaQty(qty.negate());
|
|
||||||
cd.setProcessed(false);
|
|
||||||
//
|
|
||||||
cd.setAmt(price.multiply(cd.getQty().subtract(qty)));
|
|
||||||
cd.setQty(cd.getQty().subtract(qty));
|
|
||||||
if (!cd.isProcessed())
|
|
||||||
{
|
|
||||||
MClient client = MClient.get(getCtx(), getAD_Client_ID());
|
|
||||||
if (client.isCostImmediate())
|
|
||||||
cd.process();
|
|
||||||
}
|
|
||||||
if (cd.getQty().compareTo(Env.ZERO) == 0)
|
|
||||||
{
|
|
||||||
cd.setProcessed(false);
|
|
||||||
cd.delete(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// end MZ
|
|
||||||
|
|
||||||
// Get Order and decrease invoices
|
// Get Order and decrease invoices
|
||||||
MInvoiceLine iLine = new MInvoiceLine (getCtx(), getC_InvoiceLine_ID(), get_TrxName());
|
MInvoiceLine iLine = new MInvoiceLine (getCtx(), getC_InvoiceLine_ID(), get_TrxName());
|
||||||
|
@ -407,4 +403,142 @@ public class MMatchInv extends X_M_MatchInv
|
||||||
return success;
|
return success;
|
||||||
} // afterDelete
|
} // afterDelete
|
||||||
|
|
||||||
|
|
||||||
|
// Elaine 2008/6/20
|
||||||
|
private String createMatchInvCostDetail()
|
||||||
|
{
|
||||||
|
MInvoiceLine invoiceLine = new MInvoiceLine (getCtx(), getC_InvoiceLine_ID(), get_TrxName());
|
||||||
|
|
||||||
|
// Get Account Schemas to create MCostDetail
|
||||||
|
MAcctSchema[] acctschemas = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID());
|
||||||
|
for(int asn = 0; asn < acctschemas.length; asn++)
|
||||||
|
{
|
||||||
|
MAcctSchema as = acctschemas[asn];
|
||||||
|
|
||||||
|
boolean skip = false;
|
||||||
|
if (as.getAD_OrgOnly_ID() != 0)
|
||||||
|
{
|
||||||
|
if (as.getOnlyOrgs() == null)
|
||||||
|
as.setOnlyOrgs(MReportTree.getChildIDs(getCtx(),
|
||||||
|
0, MAcctSchemaElement.ELEMENTTYPE_Organization,
|
||||||
|
as.getAD_OrgOnly_ID()));
|
||||||
|
skip = as.isSkipOrg(getAD_Org_ID());
|
||||||
|
}
|
||||||
|
if (skip)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BigDecimal LineNetAmt = invoiceLine.getLineNetAmt();
|
||||||
|
BigDecimal multiplier = getQty()
|
||||||
|
.divide(invoiceLine.getQtyInvoiced(), 12, BigDecimal.ROUND_HALF_UP)
|
||||||
|
.abs();
|
||||||
|
if (multiplier.compareTo(Env.ONE) != 0)
|
||||||
|
LineNetAmt = LineNetAmt.multiply(multiplier);
|
||||||
|
|
||||||
|
// Source from Doc_MatchInv.createFacts(MAcctSchema)
|
||||||
|
// Cost Detail Record - data from Expense/IncClearing (CR) record
|
||||||
|
// MZ Goodwill
|
||||||
|
// Create Cost Detail Matched Invoice using Total Amount and Total Qty based on InvoiceLine
|
||||||
|
MMatchInv[] mInv = MMatchInv.getInvoiceLine(getCtx(), invoiceLine.getC_InvoiceLine_ID(), get_TrxName());
|
||||||
|
BigDecimal tQty = Env.ZERO;
|
||||||
|
BigDecimal tAmt = Env.ZERO;
|
||||||
|
for (int i = 0 ; i < mInv.length ; i++)
|
||||||
|
{
|
||||||
|
if (mInv[i].isPosted() && mInv[i].getM_MatchInv_ID() != get_ID())
|
||||||
|
{
|
||||||
|
tQty = tQty.add(mInv[i].getQty());
|
||||||
|
multiplier = mInv[i].getQty()
|
||||||
|
.divide(invoiceLine.getQtyInvoiced(), 12, BigDecimal.ROUND_HALF_UP).abs();
|
||||||
|
tAmt = tAmt.add(invoiceLine.getLineNetAmt().multiply(multiplier));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tAmt = tAmt.add(LineNetAmt); //Invoice Price
|
||||||
|
|
||||||
|
// Different currency
|
||||||
|
MInvoice invoice = invoiceLine.getParent();
|
||||||
|
if (as.getC_Currency_ID() != invoice.getC_Currency_ID())
|
||||||
|
{
|
||||||
|
tAmt = MConversionRate.convert(getCtx(), tAmt,
|
||||||
|
invoice.getC_Currency_ID(), as.getC_Currency_ID(),
|
||||||
|
invoice.getDateAcct(), invoice.getC_ConversionType_ID(),
|
||||||
|
invoice.getAD_Client_ID(), invoice.getAD_Org_ID());
|
||||||
|
if (tAmt == null)
|
||||||
|
{
|
||||||
|
return "AP Invoice not convertible - " + as.getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set Qty to negative value when MovementType is Vendor Returns
|
||||||
|
MInOutLine receiptLine = new MInOutLine (getCtx(),getM_InOutLine_ID(), get_TrxName());
|
||||||
|
MInOut receipt = receiptLine.getParent();
|
||||||
|
if (receipt.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns))
|
||||||
|
tQty = tQty.add(getQty().negate()); // Qty is set to negative value
|
||||||
|
else
|
||||||
|
tQty = tQty.add(getQty());
|
||||||
|
|
||||||
|
// Set Total Amount and Total Quantity from Matched Invoice
|
||||||
|
MCostDetail.createInvoice(as, getAD_Org_ID(),
|
||||||
|
getM_Product_ID(), getM_AttributeSetInstance_ID(),
|
||||||
|
invoiceLine.getC_InvoiceLine_ID(), 0, // No cost element
|
||||||
|
tAmt, tQty, getDescription(), get_TrxName());
|
||||||
|
// end MZ
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//AZ Goodwill
|
||||||
|
private String deleteMatchInvCostDetail()
|
||||||
|
{
|
||||||
|
// Get Account Schemas to delete MCostDetail
|
||||||
|
MAcctSchema[] acctschemas = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID());
|
||||||
|
for(int asn = 0; asn < acctschemas.length; asn++)
|
||||||
|
{
|
||||||
|
MAcctSchema as = acctschemas[asn];
|
||||||
|
|
||||||
|
boolean skip = false;
|
||||||
|
if (as.getAD_OrgOnly_ID() != 0)
|
||||||
|
{
|
||||||
|
if (as.getOnlyOrgs() == null)
|
||||||
|
as.setOnlyOrgs(MReportTree.getChildIDs(getCtx(),
|
||||||
|
0, MAcctSchemaElement.ELEMENTTYPE_Organization,
|
||||||
|
as.getAD_OrgOnly_ID()));
|
||||||
|
skip = as.isSkipOrg(getAD_Org_ID());
|
||||||
|
}
|
||||||
|
if (skip)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// update/delete Cost Detail and recalculate Current Cost
|
||||||
|
MCostDetail cd = MCostDetail.get (getCtx(), "C_InvoiceLine_ID=? AND M_AttributeSetInstance_ID=?",
|
||||||
|
getC_InvoiceLine_ID(), getM_AttributeSetInstance_ID(), get_TrxName());
|
||||||
|
if (cd != null)
|
||||||
|
{
|
||||||
|
MInOut receipt = (new MInOutLine(getCtx(),getM_InOutLine_ID(),get_TrxName())).getParent();
|
||||||
|
BigDecimal qty = getQty();
|
||||||
|
if (receipt.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns))
|
||||||
|
qty = getQty().negate();
|
||||||
|
//
|
||||||
|
BigDecimal price = cd.getAmt().divide(cd.getQty(),12,BigDecimal.ROUND_HALF_UP);
|
||||||
|
cd.setDeltaAmt(price.multiply(qty.negate()));
|
||||||
|
cd.setDeltaQty(qty.negate());
|
||||||
|
cd.setProcessed(false);
|
||||||
|
//
|
||||||
|
cd.setAmt(price.multiply(cd.getQty().subtract(qty)));
|
||||||
|
cd.setQty(cd.getQty().subtract(qty));
|
||||||
|
if (!cd.isProcessed())
|
||||||
|
{
|
||||||
|
MClient client = MClient.get(getCtx(), getAD_Client_ID());
|
||||||
|
if (client.isCostImmediate())
|
||||||
|
cd.process();
|
||||||
|
}
|
||||||
|
if (cd.getQty().compareTo(Env.ZERO) == 0)
|
||||||
|
{
|
||||||
|
cd.setProcessed(false);
|
||||||
|
cd.delete(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
} // MMatchInv
|
} // MMatchInv
|
||||||
|
|
|
@ -582,7 +582,7 @@ public class MMatchPO extends X_M_MatchPO
|
||||||
if (newRecord && success)
|
if (newRecord && success)
|
||||||
{
|
{
|
||||||
// Elaine 2008/6/20
|
// Elaine 2008/6/20
|
||||||
String err = createMatchPOCostDetail(this, getOrderLine());
|
String err = createMatchPOCostDetail();
|
||||||
if(err != null && err.length() > 0)
|
if(err != null && err.length() > 0)
|
||||||
{
|
{
|
||||||
s_log.warning(err);
|
s_log.warning(err);
|
||||||
|
@ -693,32 +693,9 @@ public class MMatchPO extends X_M_MatchPO
|
||||||
// (Reserved in VMatch and MInOut.completeIt)
|
// (Reserved in VMatch and MInOut.completeIt)
|
||||||
if (success && getC_OrderLine_ID() != 0)
|
if (success && getC_OrderLine_ID() != 0)
|
||||||
{
|
{
|
||||||
// MZ Goodwill
|
// AZ Goodwill
|
||||||
// update/delete Cost Detail and recalculate Current Cost
|
deleteMatchPOCostDetail();
|
||||||
MCostDetail cd = MCostDetail.get (getCtx(), "C_OrderLine_ID=? AND M_AttributeSetInstance_ID=?",
|
// end AZ
|
||||||
getC_OrderLine_ID(), getM_AttributeSetInstance_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())
|
|
||||||
{
|
|
||||||
MClient client = MClient.get(getCtx(), getAD_Client_ID());
|
|
||||||
if (client.isCostImmediate())
|
|
||||||
cd.process();
|
|
||||||
}
|
|
||||||
if (cd.getQty().compareTo(Env.ZERO) == 0)
|
|
||||||
{
|
|
||||||
cd.setProcessed(false);
|
|
||||||
cd.delete(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// end MZ
|
|
||||||
|
|
||||||
MOrderLine orderLine = new MOrderLine (getCtx(), getC_OrderLine_ID(), get_TrxName());
|
MOrderLine orderLine = new MOrderLine (getCtx(), getC_OrderLine_ID(), get_TrxName());
|
||||||
if (getM_InOutLine_ID() != 0)
|
if (getM_InOutLine_ID() != 0)
|
||||||
|
@ -821,8 +798,10 @@ public class MMatchPO extends X_M_MatchPO
|
||||||
} // consolidate
|
} // consolidate
|
||||||
|
|
||||||
// Elaine 2008/6/20
|
// Elaine 2008/6/20
|
||||||
private String createMatchPOCostDetail(MMatchPO po, MOrderLine m_oLine)
|
private String createMatchPOCostDetail()
|
||||||
{
|
{
|
||||||
|
MOrderLine oLine = getOrderLine();
|
||||||
|
|
||||||
// Get Account Schemas to create MCostDetail
|
// Get Account Schemas to create MCostDetail
|
||||||
MAcctSchema[] acctschemas = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID());
|
MAcctSchema[] acctschemas = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID());
|
||||||
for(int asn = 0; asn < acctschemas.length; asn++)
|
for(int asn = 0; asn < acctschemas.length; asn++)
|
||||||
|
@ -836,35 +815,31 @@ public class MMatchPO extends X_M_MatchPO
|
||||||
as.setOnlyOrgs(MReportTree.getChildIDs(getCtx(),
|
as.setOnlyOrgs(MReportTree.getChildIDs(getCtx(),
|
||||||
0, MAcctSchemaElement.ELEMENTTYPE_Organization,
|
0, MAcctSchemaElement.ELEMENTTYPE_Organization,
|
||||||
as.getAD_OrgOnly_ID()));
|
as.getAD_OrgOnly_ID()));
|
||||||
|
|
||||||
// Header Level Org
|
|
||||||
skip = as.isSkipOrg(getAD_Org_ID());
|
skip = as.isSkipOrg(getAD_Org_ID());
|
||||||
// Line Level Org
|
|
||||||
skip = as.isSkipOrg(m_oLine.getAD_Org_ID());
|
|
||||||
}
|
}
|
||||||
if (skip)
|
if (skip)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Purchase Order Line
|
// Purchase Order Line
|
||||||
BigDecimal poCost = m_oLine.getPriceCost();
|
BigDecimal poCost = oLine.getPriceCost();
|
||||||
if (poCost == null || poCost.signum() == 0)
|
if (poCost == null || poCost.signum() == 0)
|
||||||
poCost = m_oLine.getPriceActual();
|
poCost = oLine.getPriceActual();
|
||||||
|
|
||||||
// Source from Doc_MatchPO.createFacts(MAcctSchema)
|
// Source from Doc_MatchPO.createFacts(MAcctSchema)
|
||||||
MInOutLine receiptLine = new MInOutLine (getCtx(), po.getM_InOutLine_ID(), po.get_TrxName());
|
MInOutLine receiptLine = new MInOutLine (getCtx(), getM_InOutLine_ID(), get_TrxName());
|
||||||
MInOut inOut = receiptLine.getParent();
|
MInOut inOut = receiptLine.getParent();
|
||||||
boolean isReturnTrx = inOut.getMovementType().equals(X_M_InOut.MOVEMENTTYPE_VendorReturns);
|
boolean isReturnTrx = inOut.getMovementType().equals(X_M_InOut.MOVEMENTTYPE_VendorReturns);
|
||||||
|
|
||||||
// Create PO Cost Detail Record first
|
// Create PO Cost Detail Record first
|
||||||
// MZ Goodwill
|
// MZ Goodwill
|
||||||
// Create Cost Detail Matched PO using Total Amount and Total Qty based on OrderLine
|
// Create Cost Detail Matched PO using Total Amount and Total Qty based on OrderLine
|
||||||
MMatchPO[] mPO = MMatchPO.getOrderLine(getCtx(), m_oLine.getC_OrderLine_ID(), po.get_TrxName());
|
MMatchPO[] mPO = MMatchPO.getOrderLine(getCtx(), oLine.getC_OrderLine_ID(), get_TrxName());
|
||||||
BigDecimal tQty = Env.ZERO;
|
BigDecimal tQty = Env.ZERO;
|
||||||
BigDecimal tAmt = Env.ZERO;
|
BigDecimal tAmt = Env.ZERO;
|
||||||
for (int i = 0 ; i < mPO.length ; i++)
|
for (int i = 0 ; i < mPO.length ; i++)
|
||||||
{
|
{
|
||||||
if (mPO[i].isPosted()
|
if (mPO[i].isPosted()
|
||||||
&& mPO[i].getM_AttributeSetInstance_ID() == po.getM_AttributeSetInstance_ID()
|
&& mPO[i].getM_AttributeSetInstance_ID() == getM_AttributeSetInstance_ID()
|
||||||
&& mPO[i].getM_MatchPO_ID() != get_ID())
|
&& mPO[i].getM_MatchPO_ID() != get_ID())
|
||||||
{
|
{
|
||||||
BigDecimal qty = (isReturnTrx ? mPO[i].getQty().negate() : mPO[i].getQty());
|
BigDecimal qty = (isReturnTrx ? mPO[i].getQty().negate() : mPO[i].getQty());
|
||||||
|
@ -873,23 +848,23 @@ public class MMatchPO extends X_M_MatchPO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
poCost = poCost.multiply(po.getQty()); // Delivered so far
|
poCost = poCost.multiply(getQty()); // Delivered so far
|
||||||
tAmt = tAmt.add(isReturnTrx ? poCost.negate() : poCost);
|
tAmt = tAmt.add(isReturnTrx ? poCost.negate() : poCost);
|
||||||
tQty = tQty.add(isReturnTrx ? po.getQty().negate() : po.getQty());
|
tQty = tQty.add(isReturnTrx ? getQty().negate() : getQty());
|
||||||
|
|
||||||
// Different currency
|
// Different currency
|
||||||
String costingMethod = as.getCostingMethod();
|
String costingMethod = as.getCostingMethod();
|
||||||
if (m_oLine.getC_Currency_ID() != as.getC_Currency_ID())
|
if (oLine.getC_Currency_ID() != as.getC_Currency_ID())
|
||||||
{
|
{
|
||||||
MOrder order = m_oLine.getParent();
|
MOrder order = oLine.getParent();
|
||||||
Timestamp dateAcct = order.getDateAcct();
|
Timestamp dateAcct = order.getDateAcct();
|
||||||
if (MAcctSchema.COSTINGMETHOD_AveragePO.equals(costingMethod) ||
|
if (MAcctSchema.COSTINGMETHOD_AveragePO.equals(costingMethod) ||
|
||||||
MAcctSchema.COSTINGMETHOD_LastPOPrice.equals(costingMethod) )
|
MAcctSchema.COSTINGMETHOD_LastPOPrice.equals(costingMethod) )
|
||||||
dateAcct = po.getDateAcct(); //Movement Date
|
dateAcct = inOut.getDateAcct(); //Movement Date
|
||||||
BigDecimal rate = MConversionRate.getRate(
|
BigDecimal rate = MConversionRate.getRate(
|
||||||
order.getC_Currency_ID(), as.getC_Currency_ID(),
|
order.getC_Currency_ID(), as.getC_Currency_ID(),
|
||||||
dateAcct, order.getC_ConversionType_ID(),
|
dateAcct, order.getC_ConversionType_ID(),
|
||||||
m_oLine.getAD_Client_ID(), m_oLine.getAD_Org_ID());
|
oLine.getAD_Client_ID(), oLine.getAD_Org_ID());
|
||||||
if (rate == null)
|
if (rate == null)
|
||||||
{
|
{
|
||||||
return "Purchase Order not convertible - " + as.getName();
|
return "Purchase Order not convertible - " + as.getName();
|
||||||
|
@ -903,17 +878,65 @@ public class MMatchPO extends X_M_MatchPO
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set Total Amount and Total Quantity from Matched PO
|
// Set Total Amount and Total Quantity from Matched PO
|
||||||
MCostDetail.createOrder(as, m_oLine.getAD_Org_ID(),
|
MCostDetail.createOrder(as, oLine.getAD_Org_ID(),
|
||||||
po.getM_Product_ID(), po.getM_AttributeSetInstance_ID(),
|
getM_Product_ID(), getM_AttributeSetInstance_ID(),
|
||||||
m_oLine.getC_OrderLine_ID(), 0, // no cost element
|
oLine.getC_OrderLine_ID(), 0, // no cost element
|
||||||
tAmt, tQty, // Delivered
|
tAmt, tQty, // Delivered
|
||||||
m_oLine.getDescription(), po.get_TrxName());
|
oLine.getDescription(), get_TrxName());
|
||||||
// end MZ
|
// end MZ
|
||||||
// end
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//AZ Goodwill
|
||||||
|
private String deleteMatchPOCostDetail()
|
||||||
|
{
|
||||||
|
// Get Account Schemas to delete MCostDetail
|
||||||
|
MAcctSchema[] acctschemas = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID());
|
||||||
|
for(int asn = 0; asn < acctschemas.length; asn++)
|
||||||
|
{
|
||||||
|
MAcctSchema as = acctschemas[asn];
|
||||||
|
|
||||||
|
boolean skip = false;
|
||||||
|
if (as.getAD_OrgOnly_ID() != 0)
|
||||||
|
{
|
||||||
|
if (as.getOnlyOrgs() == null)
|
||||||
|
as.setOnlyOrgs(MReportTree.getChildIDs(getCtx(),
|
||||||
|
0, MAcctSchemaElement.ELEMENTTYPE_Organization,
|
||||||
|
as.getAD_OrgOnly_ID()));
|
||||||
|
skip = as.isSkipOrg(getAD_Org_ID());
|
||||||
|
}
|
||||||
|
if (skip)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// update/delete Cost Detail and recalculate Current Cost
|
||||||
|
MCostDetail cd = MCostDetail.get (getCtx(), "C_OrderLine_ID=? AND M_AttributeSetInstance_ID=?",
|
||||||
|
getC_OrderLine_ID(), getM_AttributeSetInstance_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())
|
||||||
|
{
|
||||||
|
MClient client = MClient.get(getCtx(), getAD_Client_ID());
|
||||||
|
if (client.isCostImmediate())
|
||||||
|
cd.process();
|
||||||
|
}
|
||||||
|
if (cd.getQty().compareTo(Env.ZERO) == 0)
|
||||||
|
{
|
||||||
|
cd.setProcessed(false);
|
||||||
|
cd.delete(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
} // MMatchPO
|
} // MMatchPO
|
||||||
|
|
Loading…
Reference in New Issue