📄 mpayment.java
字号:
m_processMsg = "@C_AllocationHdr_ID@: " + alloc.getDocumentNo();
// Get Project from Invoice
int C_Project_ID = DB.getSQLValue(get_TrxName(),
"SELECT MAX(C_Project_ID) FROM C_Invoice WHERE C_Invoice_ID=?", getC_Invoice_ID());
if (C_Project_ID > 0 && getC_Project_ID() == 0)
setC_Project_ID(C_Project_ID);
else if (C_Project_ID > 0 && getC_Project_ID() > 0 && C_Project_ID != getC_Project_ID())
log.warning("Invoice C_Project_ID=" + C_Project_ID
+ " <> Payment C_Project_ID=" + getC_Project_ID());
return true;
} // allocateInvoice
/**
* Allocate Payment Selection
*/
private boolean allocatePaySelection()
{
MAllocationHdr alloc = new MAllocationHdr(getCtx(), false,
getDateTrx(), getC_Currency_ID(),
Msg.translate(getCtx(), "C_Payment_ID") + ": " + getDocumentNo() + " [n]", get_TrxName());
alloc.setAD_Org_ID(getAD_Org_ID());
String sql = "SELECT psc.C_BPartner_ID, psl.C_Invoice_ID, psl.IsSOTrx, " // 1..3
+ " psl.PayAmt, psl.DiscountAmt, psl.DifferenceAmt, psl.OpenAmt "
+ "FROM C_PaySelectionLine psl"
+ " INNER JOIN C_PaySelectionCheck psc ON (psl.C_PaySelectionCheck_ID=psc.C_PaySelectionCheck_ID) "
+ "WHERE psc.C_Payment_ID=?";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getC_Payment_ID());
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
int C_BPartner_ID = rs.getInt(1);
int C_Invoice_ID = rs.getInt(2);
if (C_BPartner_ID == 0 && C_Invoice_ID == 0)
continue;
boolean isSOTrx = "Y".equals(rs.getString(3));
BigDecimal PayAmt = rs.getBigDecimal(4);
BigDecimal DiscountAmt = rs.getBigDecimal(5);
BigDecimal WriteOffAmt = rs.getBigDecimal(6);
BigDecimal OpenAmt = rs.getBigDecimal(7);
BigDecimal OverUnderAmt = OpenAmt.subtract(PayAmt)
.subtract(DiscountAmt).subtract(WriteOffAmt);
//
if (alloc.get_ID() == 0 && !alloc.save(get_TrxName()))
{
log.log(Level.SEVERE, "Could not create Allocation Hdr");
rs.close();
pstmt.close();
return false;
}
MAllocationLine aLine = null;
if (isSOTrx)
aLine = new MAllocationLine (alloc, PayAmt,
DiscountAmt, WriteOffAmt, OverUnderAmt);
else
aLine = new MAllocationLine (alloc, PayAmt.negate(),
DiscountAmt.negate(), WriteOffAmt.negate(), OverUnderAmt.negate());
aLine.setDocInfo(C_BPartner_ID, 0, C_Invoice_ID);
aLine.setC_Payment_ID(getC_Payment_ID());
if (!aLine.save(get_TrxName()))
log.log(Level.SEVERE, "Could not create Allocation Line");
}
rs.close();
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, "allocatePaySelection", e);
}
try
{
if (pstmt != null)
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
// Should start WF
boolean ok = true;
if (alloc.get_ID() == 0)
{
log.fine("No Allocation created - C_Payment_ID="
+ getC_Payment_ID());
ok = false;
}
else
{
alloc.processIt(DocAction.ACTION_Complete);
ok = alloc.save(get_TrxName());
m_processMsg = "@C_AllocationHdr_ID@: " + alloc.getDocumentNo();
}
return ok;
} // allocatePaySelection
/**
* De-allocate Payment.
* Unkink Invoices and Orders and delete Allocations
*/
private void deAllocate()
{
if (getC_Order_ID() != 0)
setC_Order_ID(0);
// if (getC_Invoice_ID() == 0)
// return;
// De-Allocate all
MAllocationHdr[] allocations = MAllocationHdr.getOfPayment(getCtx(),
getC_Payment_ID(), get_TrxName());
log.fine("#" + allocations.length);
for (int i = 0; i < allocations.length; i++)
{
allocations[i].set_TrxName(get_TrxName());
allocations[i].setDocAction(DocAction.ACTION_Reverse_Correct);
allocations[i].processIt(DocAction.ACTION_Reverse_Correct);
allocations[i].save();
}
// Unlink (in case allocation did not get it)
if (getC_Invoice_ID() != 0)
{
// Invoice
String sql = "UPDATE C_Invoice "
+ "SET C_Payment_ID = NULL, IsPaid='N' "
+ "WHERE C_Invoice_ID=" + getC_Invoice_ID()
+ " AND C_Payment_ID=" + getC_Payment_ID();
int no = DB.executeUpdate(sql, get_TrxName());
if (no != 0)
log.fine("Unlink Invoice #" + no);
// Order
sql = "UPDATE C_Order o "
+ "SET C_Payment_ID = NULL "
+ "WHERE EXISTS (SELECT * FROM C_Invoice i "
+ "WHERE o.C_Order_ID=i.C_Order_ID AND i.C_Invoice_ID=" + getC_Invoice_ID() + ")"
+ " AND C_Payment_ID=" + getC_Payment_ID();
no = DB.executeUpdate(sql, get_TrxName());
if (no != 0)
log.fine("Unlink Order #" + no);
}
//
setC_Invoice_ID(0);
setIsAllocated(false);
} // deallocate
/**
* Void Document.
* @return true if success
*/
public boolean voidIt()
{
log.info(toString());
if (DOCSTATUS_Closed.equals(getDocStatus())
|| DOCSTATUS_Reversed.equals(getDocStatus())
|| DOCSTATUS_Voided.equals(getDocStatus()))
{
m_processMsg = "Document Closed: " + getDocStatus();
setDocAction(DOCACTION_None);
return false;
}
// If on Bank Statement, don't void it - reverse it
if (getC_BankStatementLine_ID() > 0)
return reverseCorrectIt();
// Not Processed
if (DOCSTATUS_Drafted.equals(getDocStatus())
|| DOCSTATUS_Invalid.equals(getDocStatus())
|| DOCSTATUS_InProgress.equals(getDocStatus())
|| DOCSTATUS_Approved.equals(getDocStatus())
|| DOCSTATUS_NotApproved.equals(getDocStatus()) )
{
addDescription(Msg.getMsg(getCtx(), "Voided") + " (" + getPayAmt() + ")");
setPayAmt(Env.ZERO);
setDiscountAmt(Env.ZERO);
setWriteOffAmt(Env.ZERO);
setOverUnderAmt(Env.ZERO);
setIsAllocated(false);
// Unlink & De-Allocate
deAllocate();
}
else
return reverseCorrectIt();
//
setProcessed(true);
setDocAction(DOCACTION_None);
return true;
} // voidIt
/**
* Close Document.
* @return true if success
*/
public boolean closeIt()
{
log.info(toString());
setDocAction(DOCACTION_None);
return true;
} // closeIt
/**
* Reverse Correction
* @return true if success
*/
public boolean reverseCorrectIt()
{
log.info(toString());
// Std Period open?
Timestamp dateAcct = getDateAcct();
if (!MPeriod.isOpen(getCtx(), dateAcct,
isReceipt() ? MDocType.DOCBASETYPE_ARReceipt : MDocType.DOCBASETYPE_APPayment))
dateAcct = new Timestamp(System.currentTimeMillis());
// Auto Reconcile if not on Bank Statement
boolean reconciled = false; // getC_BankStatementLine_ID() == 0;
// Create Reversal
MPayment reversal = new MPayment (getCtx(), 0, get_TrxName());
copyValues(this, reversal);
reversal.setClientOrg(this);
reversal.setC_Order_ID(0);
reversal.setC_Invoice_ID(0);
reversal.setDateAcct(dateAcct);
//
reversal.setDocumentNo(getDocumentNo() + REVERSE_INDICATOR); // indicate reversals
reversal.setDocStatus(DOCSTATUS_Drafted);
reversal.setDocAction(DOCACTION_Complete);
//
reversal.setPayAmt(getPayAmt().negate());
reversal.setDiscountAmt(getDiscountAmt().negate());
reversal.setWriteOffAmt(getWriteOffAmt().negate());
reversal.setOverUnderAmt(getOverUnderAmt().negate());
//
reversal.setIsAllocated(true);
reversal.setIsReconciled(reconciled); // to put on bank statement
reversal.setIsOnline(false);
reversal.setIsApproved(true);
reversal.setR_PnRef(null);
reversal.setR_Result(null);
reversal.setR_RespMsg(null);
reversal.setR_AuthCode(null);
reversal.setR_Info(null);
reversal.setProcessing(false);
reversal.setOProcessing("N");
reversal.setProcessed(false);
reversal.setPosted(false);
reversal.setDescription(getDescription());
reversal.addDescription("{->" + getDocumentNo() + ")");
reversal.save(get_TrxName());
// Post Reversal
if (!reversal.processIt(DocAction.ACTION_Complete))
{
m_processMsg = "Reversal ERROR: " + reversal.getProcessMsg();
return false;
}
reversal.closeIt();
reversal.setDocStatus(DOCSTATUS_Reversed);
reversal.setDocAction(DOCACTION_None);
reversal.save(get_TrxName());
// Unlink & De-Allocate
deAllocate();
setIsReconciled (reconciled);
setIsAllocated (true); // the allocation below is overwritten
// Set Status
addDescription("(" + reversal.getDocumentNo() + "<-)");
setDocStatus(DOCSTATUS_Reversed);
setDocAction(DOCACTION_None);
setProcessed(true);
// Create automatic Allocation
MAllocationHdr alloc = new MAllocationHdr (getCtx(), false,
getDateTrx(), getC_Currency_ID(),
Msg.translate(getCtx(), "C_Payment_ID") + ": " + reversal.getDocumentNo(), get_TrxName());
alloc.setAD_Org_ID(getAD_Org_ID());
if (!alloc.save())
log.warning("Automatic allocation - hdr not saved");
else
{
// Original Allocation
MAllocationLine aLine = new MAllocationLine (alloc, getPayAmt(true),
Env.ZERO, Env.ZERO, Env.ZERO);
aLine.setDocInfo(getC_BPartner_ID(), 0, 0);
aLine.setPaymentInfo(getC_Payment_ID(), 0);
if (!aLine.save(get_TrxName()))
log.warning("Automatic allocation - line not saved");
// Reversal Allocation
aLine = new MAllocationLine (alloc, reversal.getPayAmt(true),
Env.ZERO, Env.ZERO, Env.ZERO);
aLine.setDocInfo(reversal.getC_BPartner_ID(), 0, 0);
aLine.setPaymentInfo(reversal.getC_Payment_ID(), 0);
if (!aLine.save(get_TrxName()))
log.warning("Automatic allocation - reversal line not saved");
}
alloc.processIt(DocAction.ACTION_Complete);
alloc.save(get_TrxName());
//
StringBuffer info = new StringBuffer (reversal.getDocumentNo());
info.append(" - @C_AllocationHdr_ID@: ").append(alloc.getDocumentNo());
// Update BPartner
if (getC_BPartner_ID() != 0)
{
MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), get_TrxName());
bp.setTotalOpenBalance();
bp.save(get_TrxName());
}
m_processMsg = info.toString();
return true;
} // reverseCorrectionIt
/**
* Get Bank Statement Line of payment or 0
* @return id or 0
*/
private int getC_BankStatementLine_ID()
{
String sql = "SELECT C_BankStatementLine_ID FROM C_BankStatementLine WHERE C_Payment_ID=?";
int id = DB.getSQLValue(get_TrxName(), sql, getC_Payment_ID());
if (id < 0)
return 0;
return id;
} // getC_BankStatementLine_ID
/**
* Reverse Accrual - none
* @return true if success
*/
public boolean reverseAccrualIt()
{
log.info(toString());
return false;
} // reverseAccrualIt
/**
* Re-activate
* @return true if success
*/
public boolean reActivateIt()
{
log.info(toString());
if (reverseCorrectIt())
return true;
return false;
} // reActivateIt
/**
* String Representation
* @return info
*/
public String toString ()
{
StringBuffer sb = new StringBuffer ("MPayment[");
sb.append(get_ID()).append("-").append(getDocumentNo())
.append(",Receipt=").append(isReceipt())
.append(",PayAmt=").append(getPayAmt())
.append(",Discount=").append(getDiscountAmt())
.append(",WriteOff=").append(getWriteOffAmt())
.append(",OverUnder=").append(getOverUnderAmt());
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
/**
* 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.PAYMENT, getC_Payment_ID());
// if (re == null)
return null;
// return re.getPDF(file);
} // createPDF
/*************************************************************************
* Get Summary
* @return Summary of Document
*/
public String getSummary()
{
StringBuffer sb = new StringBuffer();
sb.append(getDocumentNo());
// : Total Lines = 123.00 (#1)
sb.append(": ")
.append(Msg.translate(getCtx(),"PayAmt")).append("=").append(getPayAmt())
.append(",").append(Msg.translate(getCtx(),"WriteOffAmt")).append("=").append(getWriteOffAmt());
// - Description
if (getDescription() != null && getDescription().length() > 0)
sb.append(" - ").append(getDescription());
return sb.toString();
} // getSummary
/**
* Get Process Message
* @return clear text error message
*/
public String getProcessMsg()
{
return m_processMsg;
} // getProcessMsg
/**
* Get Document Owner (Responsible)
* @return AD_User_ID
*/
public int getDoc_User_ID()
{
return getCreatedBy();
} // getDoc_User_ID
/**
* Get Document Approval Amount
* @return amount payment(AP) or write-off(AR)
*/
public BigDecimal getApprovalAmt()
{
if (isReceipt())
return getWriteOffAmt();
return getPayAmt();
} // getApprovalAmt
} // MPayment
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -