📄 mmatchpo.java
字号:
} // setC_InvoiceLine_ID
/**
* Get Invoice Line
* @return invoice line or null
*/
public MInvoiceLine getInvoiceLine()
{
if (m_iLine == null && getC_InvoiceLine_ID() != 0)
m_iLine = new MInvoiceLine(getCtx(), getC_InvoiceLine_ID(), get_TrxName());
return m_iLine;
} // getInvoiceLine
/**
* Set M_InOutLine_ID
* @param M_InOutLine_ID id
*/
public void setM_InOutLine_ID (int M_InOutLine_ID)
{
int old = getM_InOutLine_ID();
if (old != M_InOutLine_ID)
{
super.setM_InOutLine_ID (M_InOutLine_ID);
m_isInOutLineChange = true;
}
} // setM_InOutLine_ID
/**
* Set C_OrderLine_ID
* @param line line
*/
public void setC_OrderLine_ID (MOrderLine line)
{
m_oLine = line;
if (line == null)
setC_OrderLine_ID(0);
else
setC_OrderLine_ID(line.getC_OrderLine_ID());
} // setC_InvoiceLine_ID
/**
* Get Order Line
* @return order line or null
*/
public MOrderLine getOrderLine()
{
if ((m_oLine == null && getC_OrderLine_ID() != 0)
|| getC_OrderLine_ID() != m_oLine.getC_OrderLine_ID())
m_oLine = new MOrderLine(getCtx(), getC_OrderLine_ID(), get_TrxName());
return m_oLine;
} // getOrderLine
/**
* Before Save
* @param newRecord new
* @return true
*/
protected boolean beforeSave (boolean newRecord)
{
// Set Trx Date
if (getDateTrx() == null)
setDateTrx (new Timestamp(System.currentTimeMillis()));
// Set Acct Date
if (getDateAcct() == null)
{
Timestamp ts = getNewerDateAcct();
if (ts == null)
ts = getDateTrx();
setDateAcct (ts);
}
// Set ASI from Receipt
if (getM_AttributeSetInstance_ID() == 0 && getM_InOutLine_ID() != 0)
{
MInOutLine iol = new MInOutLine (getCtx(), getM_InOutLine_ID(), get_TrxName());
setM_AttributeSetInstance_ID(iol.getM_AttributeSetInstance_ID());
}
// Find OrderLine
if (getC_OrderLine_ID() == 0)
{
MInvoiceLine il = null;
if (getC_InvoiceLine_ID() != 0)
{
il = getInvoiceLine();
if (il.getC_OrderLine_ID() != 0)
setC_OrderLine_ID(il.getC_OrderLine_ID());
} // get from invoice
if (getC_OrderLine_ID() == 0 && getM_InOutLine_ID() != 0)
{
MInOutLine iol = new MInOutLine (getCtx(), getM_InOutLine_ID(), get_TrxName());
if (iol.getC_OrderLine_ID() != 0)
{
setC_OrderLine_ID(iol.getC_OrderLine_ID());
if (il != null)
{
il.setC_OrderLine_ID(iol.getC_OrderLine_ID());
il.save();
}
}
} // get from shipment
} // find order line
// Price Match Approval
if (getC_OrderLine_ID() != 0
&& getC_InvoiceLine_ID() != 0
&& (newRecord ||
is_ValueChanged("C_OrderLine_ID") || is_ValueChanged("C_InvoiceLine_ID")))
{
BigDecimal poPrice = getOrderLine().getPriceActual();
BigDecimal invPrice = getInvoiceLine().getPriceActual();
BigDecimal difference = poPrice.subtract(invPrice);
if (difference.signum() != 0)
{
difference = difference.multiply(getQty());
setPriceMatchDifference(difference);
// Approval
MBPGroup group = MBPGroup.getOfBPartner(getCtx(), getOrderLine().getC_BPartner_ID());
BigDecimal mt = group.getPriceMatchTolerance();
if (mt != null && mt.signum() != 0)
{
BigDecimal poAmt = poPrice.multiply(getQty());
BigDecimal maxTolerance = poAmt.multiply(mt);
maxTolerance = maxTolerance.abs()
.divide(Env.ONEHUNDRED, 2, BigDecimal.ROUND_HALF_UP);
difference = difference.abs();
boolean ok = difference.compareTo(maxTolerance) <= 0;
log.config("Difference=" + getPriceMatchDifference()
+ ", Max=" + maxTolerance + " => " + ok);
setIsApproved(ok);
}
}
else
{
setPriceMatchDifference(difference);
setIsApproved(true);
}
}
return true;
} // beforeSave
/**
* After Save.
* Set Order Qty Delivered/Invoiced
* @param newRecord new
* @param success success
* @return success
*/
protected boolean afterSave (boolean newRecord, boolean success)
{
// Purchase Order Delivered/Invoiced
// (Reserved in VMatch and MInOut.completeIt)
if (success && getC_OrderLine_ID() != 0)
{
MOrderLine orderLine = getOrderLine();
//
if (m_isInOutLineChange)
{
if (getM_InOutLine_ID() != 0) // new delivery
orderLine.setQtyDelivered(orderLine.getQtyDelivered().add(getQty()));
else // if (getM_InOutLine_ID() == 0) // reset to 0
orderLine.setQtyDelivered(orderLine.getQtyDelivered().subtract(getQty()));
orderLine.setDateDelivered(getDateTrx()); // overwrite=last
}
if (m_isInvoiceLineChange)
{
if (getC_InvoiceLine_ID() != 0) // first time
orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().add(getQty()));
else // if (getC_InvoiceLine_ID() == 0) // set to 0
orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().subtract(getQty()));
orderLine.setDateInvoiced(getDateTrx()); // overwrite=last
}
// Update Order ASI if full match
if (orderLine.getM_AttributeSetInstance_ID() == 0
&& getM_InOutLine_ID() != 0)
{
MInOutLine iol = new MInOutLine (getCtx(), getM_InOutLine_ID(), get_TrxName());
if (iol.getMovementQty().compareTo(orderLine.getQtyOrdered()) == 0)
orderLine.setM_AttributeSetInstance_ID(iol.getM_AttributeSetInstance_ID());
}
return orderLine.save();
}
return success;
} // afterSave
/**
* Get the later Date Acct from invoice or shipment
* @return date or null
*/
private Timestamp getNewerDateAcct()
{
Timestamp orderDate = null;
Timestamp invoiceDate = null;
Timestamp shipDate = null;
String sql = "SELECT i.DateAcct "
+ "FROM C_InvoiceLine il"
+ " INNER JOIN C_Invoice i ON (i.C_Invoice_ID=il.C_Invoice_ID) "
+ "WHERE C_InvoiceLine_ID=?";
PreparedStatement pstmt = null;
if (getC_InvoiceLine_ID() != 0)
{
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt (1, getC_InvoiceLine_ID());
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
invoiceDate = rs.getTimestamp(1);
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
}
//
sql = "SELECT io.DateAcct "
+ "FROM M_InOutLine iol"
+ " INNER JOIN M_InOut io ON (io.M_InOut_ID=iol.M_InOut_ID) "
+ "WHERE iol.M_InOutLine_ID=?";
if (getM_InOutLine_ID() != 0)
{
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt (1, getM_InOutLine_ID());
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
shipDate = rs.getTimestamp(1);
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
log.log (Level.SEVERE, sql, e);
}
}
//
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
// Assuming that order date is always earlier
if (invoiceDate == null)
return shipDate;
if (shipDate == null)
return invoiceDate;
if (invoiceDate.after(shipDate))
return invoiceDate;
return shipDate;
} // getNewerDateAcct
/**
* Before Delete
* @return true if acct was deleted
*/
protected boolean beforeDelete ()
{
if (isPosted())
{
if (!MPeriod.isOpen(getCtx(), getDateTrx(), MDocType.DOCBASETYPE_MatchPO))
return false;
setPosted(false);
return MFactAcct.delete (Table_ID, get_ID(), get_TrxName()) >= 0;
}
return true;
} // beforeDelete
/**
* After Delete.
* Set Order Qty Delivered/Invoiced
* @param success success
* @return success
*/
protected boolean afterDelete (boolean success)
{
// Order Delivered/Invoiced
// (Reserved in VMatch and MInOut.completeIt)
if (success && getC_OrderLine_ID() != 0)
{
MOrderLine orderLine = new MOrderLine (getCtx(), getC_OrderLine_ID(), get_TrxName());
if (getM_InOutLine_ID() != 0)
orderLine.setQtyDelivered(orderLine.getQtyDelivered().subtract(getQty()));
if (getC_InvoiceLine_ID() != 0)
orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().subtract(getQty()));
return orderLine.save(get_TrxName());
}
return success;
} // afterDelete
/**
* String Representation
* @return info
*/
public String toString ()
{
StringBuffer sb = new StringBuffer ("MMatchPO[");
sb.append (get_ID())
.append (",Qty=").append (getQty())
.append (",C_OrderLine_ID=").append (getC_OrderLine_ID())
.append (",M_InOutLine_ID=").append (getM_InOutLine_ID())
.append (",C_InvoiceLine_ID=").append (getC_InvoiceLine_ID())
.append ("]");
return sb.toString ();
} // toString
/**
* Consolidate MPO entries.
* (data conversion issue)
*/
public static void consolidate(Properties ctx)
{
String sql = "SELECT * FROM M_MatchPO po "
+ "WHERE EXISTS (SELECT * FROM M_MatchPO x "
+ "WHERE po.C_OrderLine_ID=x.C_OrderLine_ID AND po.Qty=x.Qty "
+ "GROUP BY C_OrderLine_ID, Qty "
+ "HAVING COUNT(*) = 2) "
+ " AND AD_Client_ID=?"
+ "ORDER BY C_OrderLine_ID, M_InOutLine_ID";
PreparedStatement pstmt = null;
int success = 0;
int errors = 0;
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt(1, Env.getAD_Client_ID(ctx));
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
{
MMatchPO po1 = new MMatchPO (ctx, rs, null);
if (rs.next())
{
MMatchPO po2 = new MMatchPO (ctx, rs, null);
if (po1.getM_InOutLine_ID() != 0 && po1.getC_InvoiceLine_ID() == 0
&& po2.getM_InOutLine_ID() == 0 && po2.getC_InvoiceLine_ID() != 0)
{
String s1 = "UPDATE M_MatchPO SET C_InvoiceLine_ID="
+ po2.getC_InvoiceLine_ID()
+ " WHERE M_MatchPO_ID=" + po1.getM_MatchPO_ID();
int no1 = DB.executeUpdate(s1, null);
if (no1 != 1)
{
errors++;
s_log.warning("Not updated M_MatchPO_ID=" + po1.getM_MatchPO_ID());
continue;
}
//
String s2 = "DELETE FROM Fact_Acct WHERE AD_Table_ID=473 AND Record_ID=?";
int no2 = DB.executeUpdate(s2, po2.getM_MatchPO_ID(), null);
String s3 = "DELETE FROM M_MatchPO WHERE M_MatchPO_ID=?";
int no3 = DB.executeUpdate(s3, po2.getM_MatchPO_ID(), null);
if (no2 == 0 && no3 == 1)
success++;
else
{
s_log.warning("M_MatchPO_ID=" + po2.getM_MatchPO_ID()
+ " - Deleted=" + no2 + ", Acct=" + no3);
errors++;
}
}
}
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
if (errors == 0 && success == 0)
;
else
s_log.info("Success #" + success + " - Error #" + errors);
} // consolidate
} // MMatchPO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -