📄 minvoice.java
字号:
}
// log.fine("getAllocatedAmt - " + retValue);
// ? ROUND(NVL(v_AllocatedAmt,0), 2);
return retValue;
} // getAllocatedAmt
/**
* Test Allocation (and set paid flag)
* @return true if updated
*/
public boolean testAllocation()
{
BigDecimal alloc = getAllocatedAmt(); // absolute
if (alloc == null)
alloc = Env.ZERO;
BigDecimal total = getGrandTotal();
if (!isSOTrx())
total = total.negate();
if (isCreditMemo())
total = total.negate();
boolean test = total.compareTo(alloc) == 0;
boolean change = test != isPaid();
if (change)
setIsPaid(test);
log.fine("Paid=" + test
+ " (" + alloc + "=" + total + ")");
return change;
} // testAllocation
/**
* Set Paid Flag for invoices
* @param C_BPartner_ID if 0 all
*/
public static void setIsPaid (Properties ctx, int C_BPartner_ID, String trxName)
{
int counter = 0;
String sql = "SELECT * FROM C_Invoice "
+ "WHERE IsPaid='N' AND DocStatus IN ('CO','CL')";
if (C_BPartner_ID > 1)
sql += " AND C_BPartner_ID=?";
else
sql += " AND AD_Client_ID=" + Env.getAD_Client_ID(ctx);
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, trxName);
if (C_BPartner_ID > 1)
pstmt.setInt (1, C_BPartner_ID);
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
{
MInvoice invoice = new MInvoice(ctx, rs, trxName);
if (invoice.testAllocation())
if (invoice.save())
counter++;
}
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;
}
s_log.config("#" + counter);
/**/
} // setIsPaid
/**
* Get Open Amount.
* Used by web interface
* @return Open Amt
*/
public BigDecimal getOpenAmt ()
{
return getOpenAmt (true, null);
} // getOpenAmt
/**
* Get Open Amount
* @param creditMemoAdjusted adjusted for CM (negative)
* @param paymentDate ignored Payment Date
* @return Open Amt
*/
public BigDecimal getOpenAmt (boolean creditMemoAdjusted, Timestamp paymentDate)
{
if (isPaid())
return Env.ZERO;
//
if (m_openAmt == null)
{
m_openAmt = getGrandTotal();
if (paymentDate != null)
{
// Payment Discount
// Payment Schedule
}
BigDecimal allocated = getAllocatedAmt();
if (allocated != null)
{
allocated = allocated.abs(); // is absolute
m_openAmt = m_openAmt.subtract(allocated);
}
}
//
if (!creditMemoAdjusted)
return m_openAmt;
if (isCreditMemo())
return m_openAmt.negate();
return m_openAmt;
} // getOpenAmt
/**
* Get Document Status
* @return Document Status Clear Text
*/
public String getDocStatusName()
{
return MRefList.getListName(getCtx(), 131, getDocStatus());
} // getDocStatusName
/**************************************************************************
* Create PDF
* @return File or null
*/
public File createPDF ()
{
try
{
File temp = File.createTempFile(get_TableName()+get_ID()+"_", ".pdf");
return createPDF (temp);
}
catch (Exception e)
{
log.severe("Could not create PDF - " + e.getMessage());
}
return null;
} // getPDF
/**
* Create PDF file
* @param file output file
* @return file if success
*/
public File createPDF (File file)
{
ReportEngine re = ReportEngine.get (getCtx(), ReportEngine.INVOICE, getC_Invoice_ID());
if (re == null)
return null;
return re.getPDF(file);
} // createPDF
/**
* Get PDF File Name
* @param documentDir directory
* @return file name
*/
public String getPDFFileName (String documentDir)
{
return getPDFFileName (documentDir, getC_Invoice_ID());
} // getPDFFileName
/**
* Get ISO Code of Currency
* @return Currency ISO
*/
public String getCurrencyISO()
{
return MCurrency.getISO_Code (getCtx(), getC_Currency_ID());
} // getCurrencyISO
/**
* Get Currency Precision
* @return precision
*/
public int getPrecision()
{
return MCurrency.getStdPrecision(getCtx(), getC_Currency_ID());
} // getPrecision
/**************************************************************************
* Process document
* @param processAction document action
* @return true if performed
*/
public boolean processIt (String processAction)
{
m_processMsg = null;
DocumentEngine engine = new DocumentEngine (this, getDocStatus());
return engine.processIt (processAction, getDocAction());
} // process
/** Process Message */
private String m_processMsg = null;
/** Just Prepared Flag */
private boolean m_justPrepared = false;
/**
* Unlock Document.
* @return true if success
*/
public boolean unlockIt()
{
log.info("unlockIt - " + toString());
setProcessing(false);
return true;
} // unlockIt
/**
* Invalidate Document
* @return true if success
*/
public boolean invalidateIt()
{
log.info("invalidateIt - " + toString());
setDocAction(DOCACTION_Prepare);
return true;
} // invalidateIt
/**
* Prepare Document
* @return new status (In Progress or Invalid)
*/
public String prepareIt()
{
log.info(toString());
m_processMsg = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_BEFORE_PREPARE);
if (m_processMsg != null)
return DocAction.STATUS_Invalid;
MDocType dt = MDocType.get(getCtx(), getC_DocTypeTarget_ID());
// Std Period open?
if (!MPeriod.isOpen(getCtx(), getDateAcct(), dt.getDocBaseType()))
{
m_processMsg = "@PeriodClosed@";
return DocAction.STATUS_Invalid;
}
// Lines
MInvoiceLine[] lines = getLines(true);
if (lines.length == 0)
{
m_processMsg = "@NoLines@";
return DocAction.STATUS_Invalid;
}
// No Cash Book
if (PAYMENTRULE_Cash.equals(getPaymentRule())
&& MCashBook.get(getCtx(), getAD_Org_ID(), getC_Currency_ID()) == null)
{
m_processMsg = "@NoCashBook@";
return DocAction.STATUS_Invalid;
}
// Convert/Check DocType
if (getC_DocType_ID() != getC_DocTypeTarget_ID() )
setC_DocType_ID(getC_DocTypeTarget_ID());
if (getC_DocType_ID() == 0)
{
m_processMsg = "No Document Type";
return DocAction.STATUS_Invalid;
}
explodeBOM();
if (!calculateTaxTotal()) // setTotals
{
m_processMsg = "Error calculating Tax";
return DocAction.STATUS_Invalid;
}
createPaySchedule();
// Credit Status
if (isSOTrx() && !isReversal())
{
MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), null);
if (MBPartner.SOCREDITSTATUS_CreditStop.equals(bp.getSOCreditStatus()))
{
m_processMsg = "@BPartnerCreditStop@ - @TotalOpenBalance@="
+ bp.getTotalOpenBalance()
+ ", @SO_CreditLimit@=" + bp.getSO_CreditLimit();
return DocAction.STATUS_Invalid;
}
}
// Landed Costs
if (!isSOTrx())
{
for (int i = 0; i < lines.length; i++)
{
MInvoiceLine line = lines[i];
String error = line.allocateLandedCosts();
if (error != null && error.length() > 0)
{
m_processMsg = error;
return DocAction.STATUS_Invalid;
}
}
}
// Add up Amounts
m_justPrepared = true;
if (!DOCACTION_Complete.equals(getDocAction()))
setDocAction(DOCACTION_Complete);
return DocAction.STATUS_InProgress;
} // prepareIt
/**
* Explode non stocked BOM.
*/
private void explodeBOM ()
{
String where = "AND IsActive='Y' AND EXISTS "
+ "(SELECT * FROM M_Product p WHERE C_InvoiceLine.M_Product_ID=p.M_Product_ID"
+ " AND p.IsBOM='Y' AND p.IsVerified='Y' AND p.IsStocked='N')";
//
String sql = "SELECT COUNT(*) FROM C_InvoiceLine "
+ "WHERE C_Invoice_ID=? " + where;
int count = DB.getSQLValue(get_TrxName(), sql, getC_Invoice_ID());
while (count != 0)
{
renumberLines (100);
// Order Lines with non-stocked BOMs
MInvoiceLine[] lines = getLines (where);
for (int i = 0; i < lines.length; i++)
{
MInvoiceLine line = lines[i];
MProduct product = MProduct.get (getCtx(), line.getM_Product_ID());
log.fine(product.getName());
// New Lines
int lineNo = line.getLine ();
MProductBOM[] boms = MProductBOM.getBOMLines (product);
for (int j = 0; j < boms.length; j++)
{
MProductBOM bom = boms[j];
MInvoiceLine newLine = new MInvoiceLine (this);
newLine.setLine (++lineNo);
newLine.setM_Product_ID (bom.getProduct().getM_Product_ID(),
bom.getProduct().getC_UOM_ID());
newLine.setQty (line.getQtyInvoiced().multiply(
bom.getBOMQty ())); // Invoiced/Entered
if (bom.getDescription () != null)
newLine.setDescription (bom.getDescription ());
//
newLine.setPrice ();
newLine.save (get_TrxName());
}
// Convert into Comment Line
line.setM_Product_ID (0);
line.setM_AttributeSetInstance_ID (0);
line.setPriceEntered (Env.ZERO);
line.setPriceActual (Env.ZERO);
line.setPriceLimit (Env.ZERO);
line.setPriceList (Env.ZERO);
line.setLineNetAmt (Env.ZERO);
//
String description = product.getName ();
if (product.getDescription () != null)
description += " " + product.getDescription ();
if (line.getDescription () != null)
description += " " + line.getDescription ();
line.setDescription (description);
line.save (get_TrxName());
} // for all lines with BOM
m_lines = null;
count = DB.getSQLValue (get_TrxName(), sql, getC_Invoice_ID ());
renumberLines (10);
} // while count != 0
} // explodeBOM
/**
* Calculate Tax and Total
*/
private boolean calculateTaxTotal()
{
log.fine("");
// Delete Taxes
DB.executeUpdate("DELETE C_InvoiceTax WHERE C_Invoice_ID=" + getC_Invoice_ID(), get_TrxName());
m_taxes = null;
// Lines
BigDecimal totalLines = Env.ZERO;
ArrayList<Integer> taxList = new ArrayList<Integer>();
MInvoiceLine[] lines = getLines(false);
for (int i = 0; i < lines.length; i++)
{
MInvoiceLine line = lines[i];
/** Sync ownership for SO
if (isSOTrx() && line.getAD_Org_ID() != getAD_Org_ID())
{
line.setAD_Org_ID(getAD_Org_ID());
line.save();
} **/
Integer taxID = new Integer(line.getC_Tax_ID());
if (!taxList.contains(taxID))
{
MInvoiceTax iTax = MInvoiceTax.get (line, getPrecision(),
false, get_TrxName()); // current Tax
if (iTax != null)
{
iTax.setIsTaxIncluded(isTaxIncluded());
if (!iTax.calculateTaxFromLines())
return false;
if (!iTax.save())
return false;
taxList.add(taxID);
}
}
totalLines = totalLines.add(line.getLineNetAmt());
}
// Taxes
BigDecimal grandTotal = totalLines;
MInvoiceTax[] taxes = getTaxes(true);
for (int i = 0; i < taxes.length; i++)
{
MInvoiceTax iTax = taxes[i];
MTax tax = iTax.getTax();
if (tax.isSummary())
{
MTax[] cTaxes = tax.getChildTaxes(false); // Multiple taxes
for (int j = 0; j < cTaxes.length; j++)
{
MTax cTax = cTaxes[j];
BigDecimal taxAmt = cTax.calculateTax(iTax.getTaxBaseAmt(), isTaxIncluded(), getPrecision());
//
MInvoiceTax newITax = new MInvoiceTax(getCtx(), 0, get_TrxName());
newITax.setClientOrg(this);
newITax.setC_Invoice_ID(getC_Invoice_ID());
newITax.setC_Tax_ID(cTax.getC_Tax_ID());
newITax.setPrecision(getPrecision());
newITax.setIsTaxIncluded(isTaxIncluded());
newITax.setTaxBaseAmt(iTax.getTaxBaseAmt());
newITax.setTaxAmt(taxAmt);
if (!newITax.save(get_TrxName()))
return false;
//
if (!isTaxIncluded())
grandTotal = grandTotal.add(taxAmt);
}
if (!iTax.delete(true, get_TrxName()))
return false;
}
else
{
if (!isTaxIncluded())
grandTotal = grandTotal.add(iTax.getTaxAmt());
}
}
//
setTotalLines(totalLines);
setGrandTotal(grandTotal);
return true;
} // calculateTaxTotal
/**
* (Re) Create Pay Schedule
* @return true if valid schedule
*/
private boolean createPaySchedule()
{
if (getC_PaymentTerm_ID() == 0)
return false;
MPaymentTerm pt = new MPaymentTerm(getCtx(), getC_PaymentTerm_ID(), null);
log.fine(pt.toString());
return pt.apply(this); // calls validate pay schedule
} // createPaySchedule
/**
* Approve Document
* @return true if success
*/
public boolean approveIt()
{
log.info(toString());
setIsApproved(true);
return true;
} // approveIt
/**
* Reject Approval
* @return true if success
*/
public boolean rejectIt()
{
log.info(toString());
setIsApproved(false);
return true;
} // rejectIt
/**
* Complete Document
* @return new status (Complete, In Progress, Invalid, Waiting ..)
*/
public String completeIt()
{
// Re-Check
if (!m_justPrepared)
{
String status = prepareIt();
if (!DocAction.STATUS_InProgress.equals(status))
return status;
}
// Implicit Approval
if (!isApproved())
approveIt();
log.info(toString());
StringBuffer info = new StringBuffer();
// Create Cash
if (PAYMENTRULE_Cash.equals(getPaymentRule()))
{
MCash cash = MCash.get (getCtx(), getAD_Org_ID(),
getDateInvoiced(), getC_Currency_ID(), get_TrxName());
if (cash == null || cash.get_ID() == 0)
{
m_processMsg = "@NoCashBook@";
return DocAction.STATUS_Invalid;
}
MCashLine cl = new MCashLine (cash);
cl.setInvoice(this);
if (!cl.save(get_TrxName()))
{
m_processMsg = "Could not save Cash Journal Line";
return DocAction.STATUS_Invalid;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -