📄 minvoice.java
字号:
return super.getGrandTotal();
//
BigDecimal amt = getGrandTotal();
if (isCreditMemo())
return amt.negate();
return amt;
} // getGrandTotal
/**
* Get Invoice Lines of Invoice
* @param whereClause starting with AND
* @return lines
*/
private MInvoiceLine[] getLines (String whereClause)
{
ArrayList<MInvoiceLine> list = new ArrayList<MInvoiceLine>();
String sql = "SELECT * FROM C_InvoiceLine WHERE C_Invoice_ID=? ";
if (whereClause != null)
sql += whereClause;
sql += " ORDER BY Line";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getC_Invoice_ID());
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
MInvoiceLine il = new MInvoiceLine(getCtx(), rs, get_TrxName());
il.setInvoice(this);
list.add(il);
}
rs.close();
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, "getLines", e);
}
finally
{
try
{
if (pstmt != null)
pstmt.close ();
}
catch (Exception e)
{}
pstmt = null;
}
//
MInvoiceLine[] lines = new MInvoiceLine[list.size()];
list.toArray(lines);
return lines;
} // getLines
/**
* Get Invoice Lines
* @param requery
* @return lines
*/
public MInvoiceLine[] getLines (boolean requery)
{
if (m_lines == null || m_lines.length == 0 || requery)
m_lines = getLines(null);
return m_lines;
} // getLines
/**
* Get Lines of Invoice
* @return lines
*/
public MInvoiceLine[] getLines()
{
return getLines(false);
} // getLines
/**
* Renumber Lines
* @param step start and step
*/
public void renumberLines (int step)
{
int number = step;
MInvoiceLine[] lines = getLines(false);
for (int i = 0; i < lines.length; i++)
{
MInvoiceLine line = lines[i];
line.setLine(number);
line.save();
number += step;
}
m_lines = null;
} // renumberLines
/**
* Copy Lines From other Invoice.
* @param otherInvoice invoice
* @param counter create counter links
* @param setOrder set order links
* @return number of lines copied
*/
public int copyLinesFrom (MInvoice otherInvoice, boolean counter, boolean setOrder)
{
if (isProcessed() || isPosted() || otherInvoice == null)
return 0;
MInvoiceLine[] fromLines = otherInvoice.getLines(false);
int count = 0;
for (int i = 0; i < fromLines.length; i++)
{
MInvoiceLine line = new MInvoiceLine (getCtx(), 0, get_TrxName());
MInvoiceLine fromLine = fromLines[i];
if (counter) // header
PO.copyValues (fromLine, line, getAD_Client_ID(), getAD_Org_ID());
else
PO.copyValues (fromLine, line, fromLine.getAD_Client_ID(), fromLine.getAD_Org_ID());
line.setC_Invoice_ID(getC_Invoice_ID());
line.setInvoice(this);
line.set_ValueNoCheck ("C_InvoiceLine_ID", I_ZERO); // new
// Reset
if (!setOrder)
line.setC_OrderLine_ID(0);
line.setRef_InvoiceLine_ID(0);
line.setM_InOutLine_ID(0);
line.setA_Asset_ID(0);
line.setM_AttributeSetInstance_ID(0);
line.setS_ResourceAssignment_ID(0);
// New Tax
if (getC_BPartner_ID() != otherInvoice.getC_BPartner_ID())
line.setTax(); // recalculate
//
if (counter)
{
line.setRef_InvoiceLine_ID(fromLine.getC_InvoiceLine_ID());
if (fromLine.getC_OrderLine_ID() != 0)
{
MOrderLine peer = new MOrderLine (getCtx(), fromLine.getC_OrderLine_ID(), get_TrxName());
if (peer.getRef_OrderLine_ID() != 0)
line.setC_OrderLine_ID(peer.getRef_OrderLine_ID());
}
line.setM_InOutLine_ID(0);
if (fromLine.getM_InOutLine_ID() != 0)
{
MInOutLine peer = new MInOutLine (getCtx(), fromLine.getM_InOutLine_ID(), get_TrxName());
if (peer.getRef_InOutLine_ID() != 0)
line.setM_InOutLine_ID(peer.getRef_InOutLine_ID());
}
}
//
line.setProcessed(false);
if (line.save(get_TrxName()))
count++;
// Cross Link
if (counter)
{
fromLine.setRef_InvoiceLine_ID(line.getC_InvoiceLine_ID());
fromLine.save(get_TrxName());
}
}
if (fromLines.length != count)
log.log(Level.SEVERE, "Line difference - From=" + fromLines.length + " <> Saved=" + count);
return count;
} // copyLinesFrom
/** Reversal Flag */
private boolean m_reversal = false;
/**
* Set Reversal
* @param reversal reversal
*/
private void setReversal(boolean reversal)
{
m_reversal = reversal;
} // setReversal
/**
* Is Reversal
* @return reversal
*/
private boolean isReversal()
{
return m_reversal;
} // isReversal
/**
* Get Taxes
* @param requery requery
* @return array of taxes
*/
public MInvoiceTax[] getTaxes (boolean requery)
{
if (m_taxes != null && !requery)
return m_taxes;
String sql = "SELECT * FROM C_InvoiceTax WHERE C_Invoice_ID=?";
ArrayList<MInvoiceTax> list = new ArrayList<MInvoiceTax>();
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, get_TrxName());
pstmt.setInt (1, getC_Invoice_ID());
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
list.add(new MInvoiceTax(getCtx(), rs, get_TrxName()));
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, "getTaxes", e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
m_taxes = new MInvoiceTax[list.size ()];
list.toArray (m_taxes);
return m_taxes;
} // getTaxes
/**
* Add to Description
* @param description text
*/
public void addDescription (String description)
{
String desc = getDescription();
if (desc == null)
setDescription(description);
else
setDescription(desc + " | " + description);
} // addDescription
/**
* Is it a Credit Memo?
* @return true if CM
*/
public boolean isCreditMemo()
{
MDocType dt = MDocType.get(getCtx(),
getC_DocType_ID()==0 ? getC_DocTypeTarget_ID() : getC_DocType_ID());
return MDocType.DOCBASETYPE_APCreditMemo.equals(dt.getDocBaseType())
|| MDocType.DOCBASETYPE_ARCreditMemo.equals(dt.getDocBaseType());
} // isCreditMemo
/**
* Set Processed.
* Propergate to Lines/Taxes
* @param processed processed
*/
public void setProcessed (boolean processed)
{
super.setProcessed (processed);
if (get_ID() == 0)
return;
String set = "SET Processed='"
+ (processed ? "Y" : "N")
+ "' WHERE C_Invoice_ID=" + getC_Invoice_ID();
int noLine = DB.executeUpdate("UPDATE C_InvoiceLine " + set, get_TrxName());
int noTax = DB.executeUpdate("UPDATE C_InvoiceTax " + set, get_TrxName());
m_lines = null;
m_taxes = null;
log.fine(processed + " - Lines=" + noLine + ", Tax=" + noTax);
} // setProcessed
/**
* Validate Invoice Pay Schedule
* @return pay schedule is valid
*/
public boolean validatePaySchedule()
{
MInvoicePaySchedule[] schedule = MInvoicePaySchedule.getInvoicePaySchedule
(getCtx(), getC_Invoice_ID(), 0, get_TrxName());
log.fine("#" + schedule.length);
if (schedule.length == 0)
{
setIsPayScheduleValid(false);
return false;
}
// Add up due amounts
BigDecimal total = Env.ZERO;
for (int i = 0; i < schedule.length; i++)
{
schedule[i].setParent(this);
BigDecimal due = schedule[i].getDueAmt();
if (due != null)
total = total.add(due);
}
boolean valid = getGrandTotal().compareTo(total) == 0;
setIsPayScheduleValid(valid);
// Update Schedule Lines
for (int i = 0; i < schedule.length; i++)
{
if (schedule[i].isValid() != valid)
{
schedule[i].setIsValid(valid);
schedule[i].save(get_TrxName());
}
}
return valid;
} // validatePaySchedule
/**************************************************************************
* Before Save
* @param newRecord new
* @return true
*/
protected boolean beforeSave (boolean newRecord)
{
log.fine("");
// No Partner Info - set Template
if (getC_BPartner_ID() == 0)
setBPartner(MBPartner.getTemplate(getCtx(), getAD_Client_ID()));
if (getC_BPartner_Location_ID() == 0)
setBPartner(new MBPartner(getCtx(), getC_BPartner_ID(), null));
// Price List
if (getM_PriceList_ID() == 0)
{
int ii = Env.getContextAsInt(getCtx(), "#M_PriceList_ID");
if (ii != 0)
setM_PriceList_ID(ii);
else
{
String sql = "SELECT M_PriceList_ID FROM M_PriceList WHERE AD_Client_ID=? AND IsDefault='Y'";
ii = DB.getSQLValue (null, sql, getAD_Client_ID());
if (ii != 0)
setM_PriceList_ID (ii);
}
}
// Currency
if (getC_Currency_ID() == 0)
{
String sql = "SELECT C_Currency_ID FROM M_PriceList WHERE M_PriceList_ID=?";
int ii = DB.getSQLValue (null, sql, getM_PriceList_ID());
if (ii != 0)
setC_Currency_ID (ii);
else
setC_Currency_ID(Env.getContextAsInt(getCtx(), "#C_Currency_ID"));
}
// Sales Rep
if (getSalesRep_ID() == 0)
{
int ii = Env.getContextAsInt(getCtx(), "#SalesRep_ID");
if (ii != 0)
setSalesRep_ID (ii);
}
// Document Type
if (getC_DocType_ID() == 0)
setC_DocType_ID (0); // make sure it's set to 0
if (getC_DocTypeTarget_ID() == 0)
setC_DocTypeTarget_ID(isSOTrx() ? MDocType.DOCBASETYPE_ARInvoice : MDocType.DOCBASETYPE_APInvoice);
// Payment Term
if (getC_PaymentTerm_ID() == 0)
{
int ii = Env.getContextAsInt(getCtx(), "#C_PaymentTerm_ID");
if (ii != 0)
setC_PaymentTerm_ID (ii);
else
{
String sql = "SELECT C_PaymentTerm_ID FROM C_PaymentTerm WHERE AD_Client_ID=? AND IsDefault='Y'";
ii = DB.getSQLValue(null, sql, getAD_Client_ID());
if (ii != 0)
setC_PaymentTerm_ID (ii);
}
}
return true;
} // beforeSave
/**
* Before Delete
* @return true if it can be deleted
*/
protected boolean beforeDelete ()
{
if (getC_Order_ID() != 0)
{
log.saveError("Error", Msg.getMsg(getCtx(), "CannotDelete"));
return false;
}
return true;
} // beforeDelete
/**
* String Representation
* @return info
*/
public String toString ()
{
StringBuffer sb = new StringBuffer ("MInvoice[")
.append(get_ID()).append("-").append(getDocumentNo())
.append(",GrandTotal=").append(getGrandTotal());
if (m_lines != null)
sb.append(" (#").append(m_lines.length).append(")");
sb.append ("]");
return sb.toString ();
} // toString
/**
* Get Document Info
* @return document info (untranslated)
*/
public String getDocumentInfo()
{
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID());
return dt.getName() + " " + getDocumentNo();
} // getDocumentInfo
/**
* After Save
* @param newRecord new
* @param success success
* @return success
*/
protected boolean afterSave (boolean newRecord, boolean success)
{
if (success) {
//
String sql = "UPDATE C_Invoice"
+ " SET SourceRecord_ID ="
+ getC_Invoice_ID()
+ " WHERE C_Invoice_ID=" + getC_Invoice_ID();
int no = DB.executeUpdate(sql, get_TrxName());
}
if (!success || newRecord)
return success;
if (is_ValueChanged("AD_Org_ID"))
{
String sql = "UPDATE C_InvoiceLine ol"
+ " SET AD_Org_ID ="
+ "(SELECT AD_Org_ID"
+ " FROM C_Invoice o WHERE ol.C_Invoice_ID=o.C_Invoice_ID) "
+ "WHERE C_Invoice_ID=" + getC_Order_ID();
int no = DB.executeUpdate(sql, get_TrxName());
log.fine("Lines -> #" + no);
}
return true;
} // afterSave
/**
* Set Price List (and Currency) when valid
* @param M_PriceList_ID price list
*/
public void setM_PriceList_ID (int M_PriceList_ID)
{
String sql = "SELECT M_PriceList_ID, C_Currency_ID "
+ "FROM M_PriceList WHERE M_PriceList_ID=?";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, M_PriceList_ID);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
super.setM_PriceList_ID (rs.getInt(1));
setC_Currency_ID (rs.getInt(2));
}
rs.close();
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, "setM_PriceList_ID", e);
}
finally
{
try
{
if (pstmt != null)
pstmt.close ();
}
catch (Exception e)
{}
pstmt = null;
}
} // setM_PriceList_ID
/**
* Get Allocated Amt in Invoice Currency
* @return pos/neg amount or null
*/
public BigDecimal getAllocatedAmt ()
{
BigDecimal retValue = null;
String sql = "SELECT SUM(currencyConvert(al.Amount+al.DiscountAmt+al.WriteOffAmt,"
+ "ah.C_Currency_ID, i.C_Currency_ID,ah.DateTrx,i.C_ConversionType_ID, al.AD_Client_ID,al.AD_Org_ID)) "
+ "FROM C_AllocationLine al"
+ " INNER JOIN C_AllocationHdr ah ON (al.C_AllocationHdr_ID=ah.C_AllocationHdr_ID)"
+ " INNER JOIN C_Invoice i ON (al.C_Invoice_ID=i.C_Invoice_ID) "
+ "WHERE al.C_Invoice_ID=?"
+ " AND ah.IsActive='Y' AND al.IsActive='Y'";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getC_Invoice_ID());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
retValue = rs.getBigDecimal(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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -