📄 mpayment.java
字号:
else
{
approved = pp.processCC ();
if (approved)
setErrorMessage(null);
else
setErrorMessage("From " + getCreditCardName() + ": " + getR_RespMsg());
}
}
catch (Exception e)
{
log.log(Level.SEVERE, "processOnline", e);
setErrorMessage("Payment Processor Error");
}
setIsApproved(approved);
return approved;
} // processOnline
/**
* Process Online Payment.
* implements ProcessCall after standard constructor
* Called when pressing the Process_Online button in C_Payment
*
* @param ctx Context
* @param pi Process Info
* @return true if the next process should be performed
*/
public boolean startProcess (Properties ctx, ProcessInfo pi, Trx trx)
{
log.info("startProcess - " + pi.getRecord_ID());
boolean retValue = false;
//
if (pi.getRecord_ID() != get_ID())
{
log.log(Level.SEVERE, "startProcess - Not same Payment - " + pi.getRecord_ID());
return false;
}
// Process it
retValue = processOnline();
save();
return retValue; // Payment processed
} // startProcess
/**
* Before Save
* @param newRecord new
* @return save
*/
protected boolean beforeSave (boolean newRecord)
{
// We have a charge
if (getC_Charge_ID() != 0)
{
if (newRecord || is_ValueChanged("C_Charge_ID"))
{
setC_Order_ID(0);
setC_Invoice_ID(0);
setWriteOffAmt(Env.ZERO);
setDiscountAmt(Env.ZERO);
setIsOverUnderPayment(false);
setOverUnderAmt(Env.ZERO);
setIsPrepayment(false);
}
}
// We need a BPartner
else if (getC_BPartner_ID() == 0 && !isCashTrx())
{
if (getC_Invoice_ID() != 0)
;
else if (getC_Order_ID() != 0)
;
else
{
log.saveError("Error", Msg.parseTranslation(getCtx(), "@NotFound@: @C_BPartner_ID@"));
return false;
}
}
// Prepayment: No charge and order or project (not as acct dimension)
if (newRecord
|| is_ValueChanged("C_Charge_ID") || is_ValueChanged("C_Invoice_ID")
|| is_ValueChanged("C_Order_ID") || is_ValueChanged("C_Project_ID"))
setIsPrepayment (getC_Charge_ID() == 0
&& getC_BPartner_ID() != 0
&& (getC_Order_ID() != 0
|| (getC_Project_ID() != 0 && getC_Invoice_ID() == 0)));
if (isPrepayment())
{
if (newRecord
|| is_ValueChanged("C_Order_ID") || is_ValueChanged("C_Project_ID"))
{
setWriteOffAmt(Env.ZERO);
setDiscountAmt(Env.ZERO);
setIsOverUnderPayment(false);
setOverUnderAmt(Env.ZERO);
}
}
// Document Type/Receipt
if (getC_DocType_ID() == 0)
setC_DocType_ID();
else
{
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID());
setIsReceipt(dt.isSOTrx());
}
setDocumentNo();
//
if (getDateAcct() == null)
setDateAcct(getDateTrx());
//
if (!isOverUnderPayment())
setOverUnderAmt(Env.ZERO);
// Organization
if ((newRecord || is_ValueChanged("C_BankAccount_ID"))
&& getC_Charge_ID() == 0) // allow different org for charge
{
MBankAccount ba = MBankAccount.get(getCtx(), getC_BankAccount_ID());
if (ba.getAD_Org_ID() != 0)
setAD_Org_ID(ba.getAD_Org_ID());
}
return true;
} // beforeSave
/**
* After Save
* @param newRecord new
* @param success success
* @return success
*/
protected boolean afterSave (boolean newRecord, boolean success)
{
if (success) {
//
String sql = "UPDATE C_Payment"
+ " SET SourceRecord_ID ="
+ getC_Payment_ID()
+ " WHERE C_Payment_ID=" + getC_Payment_ID();
int no = DB.executeUpdate(sql, get_TrxName());
}
if (!success || newRecord)
return success;
return true;
} // afterSave
/**
* Get Allocated Amt in Payment Currency
* @return amount or null
*/
public BigDecimal getAllocatedAmt ()
{
BigDecimal retValue = null;
if (getC_Charge_ID() != 0)
return getPayAmt();
//
String sql = "SELECT SUM(currencyConvert(al.Amount,"
+ "ah.C_Currency_ID, p.C_Currency_ID,ah.DateTrx,p.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_Payment p ON (al.C_Payment_ID=p.C_Payment_ID) "
+ "WHERE al.C_Payment_ID=?"
+ " AND ah.IsActive='Y' AND al.IsActive='Y'";
// + " AND al.C_Invoice_ID IS NOT NULL";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, getC_Payment_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, "getAllocatedAmt", e);
}
try
{
if (pstmt != null)
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
// log.fine("getAllocatedAmt - " + retValue);
// ? ROUND(NVL(v_AllocatedAmt,0), 2);
return retValue;
} // getAllocatedAmt
/**
* Test Allocation (and set allocated flag)
* @return true if updated
*/
public boolean testAllocation()
{
// Cash Trx always allocated
if (isCashTrx())
{
if (!isAllocated())
{
setIsAllocated(true);
return true;
}
return false;
}
//
BigDecimal alloc = getAllocatedAmt();
if (alloc == null)
alloc = Env.ZERO;
BigDecimal total = getPayAmt();
if (!isReceipt())
total = total.negate();
boolean test = total.compareTo(alloc) == 0;
boolean change = test != isAllocated();
if (change)
setIsAllocated(test);
log.fine("Allocated=" + test
+ " (" + alloc + "=" + total + ")");
return change;
} // testAllocation
/**
* Set Allocated Flag for payments
* @param ctx context
* @param C_BPartner_ID if 0 all
* @param trxName trx
*/
public static void setIsAllocated (Properties ctx, int C_BPartner_ID, String trxName)
{
int counter = 0;
String sql = "SELECT * FROM C_Payment "
+ "WHERE IsAllocated='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 ())
{
MPayment pay = new MPayment (ctx, rs, trxName);
if (pay.testAllocation())
if (pay.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);
} // setIsAllocated
/**************************************************************************
* Set Error Message
* @param errorMessage error message
*/
public void setErrorMessage(String errorMessage)
{
m_errorMessage = errorMessage;
} // setErrorMessage
/**
* Get Error Message
* @return error message
*/
public String getErrorMessage()
{
return m_errorMessage;
} // getErrorMessage
/**
* Set Bank Account for Payment.
* @param C_BankAccount_ID C_BankAccount_ID
*/
public void setC_BankAccount_ID (int C_BankAccount_ID)
{
if (C_BankAccount_ID == 0)
{
setPaymentProcessor();
if (getC_BankAccount_ID() == 0)
throw new IllegalArgumentException("Can't find Bank Account");
}
else
super.setC_BankAccount_ID(C_BankAccount_ID);
} // setC_BankAccount_ID
/**
* Set BankAccount and PaymentProcessor
* @return true if found
*/
public boolean setPaymentProcessor ()
{
return setPaymentProcessor (getTenderType(), getCreditCardType());
} // setPaymentProcessor
/**
* Set BankAccount and PaymentProcessor
* @param tender TenderType see TENDER_
* @param CCType CC Type see CC_
* @return true if found
*/
public boolean setPaymentProcessor (String tender, String CCType)
{
m_mPaymentProcessor = null;
// Get Processor List
if (m_mPaymentProcessors == null || m_mPaymentProcessors.length == 0)
m_mPaymentProcessors = MPaymentProcessor.find (getCtx(), tender, CCType, getAD_Client_ID(),
getC_Currency_ID(), getPayAmt(), get_TrxName());
// Relax Amount
if (m_mPaymentProcessors == null || m_mPaymentProcessors.length == 0)
m_mPaymentProcessors = MPaymentProcessor.find (getCtx(), tender, CCType, getAD_Client_ID(),
getC_Currency_ID(), Env.ZERO, get_TrxName());
if (m_mPaymentProcessors == null || m_mPaymentProcessors.length == 0)
return false;
// Find the first right one
for (int i = 0; i < m_mPaymentProcessors.length; i++)
{
if (m_mPaymentProcessors[i].accepts (tender, CCType))
{
m_mPaymentProcessor = m_mPaymentProcessors[i];
}
}
if (m_mPaymentProcessor != null)
setC_BankAccount_ID (m_mPaymentProcessor.getC_BankAccount_ID());
//
return m_mPaymentProcessor != null;
} // setPaymentProcessor
/**
* Get Accepted Credit Cards for PayAmt (default 0)
* @return credit cards
*/
public ValueNamePair[] getCreditCards ()
{
return getCreditCards(getPayAmt());
} // getCreditCards
/**
* Get Accepted Credit Cards for amount
* @param amt trx amount
* @return credit cards
*/
public ValueNamePair[] getCreditCards (BigDecimal amt)
{
try
{
if (m_mPaymentProcessors == null || m_mPaymentProcessors.length == 0)
m_mPaymentProcessors = MPaymentProcessor.find (getCtx (), null, null,
getAD_Client_ID (), getC_Currency_ID (), amt, get_TrxName());
//
HashMap<String,ValueNamePair> map = new HashMap<String,ValueNamePair>(); // to eliminate duplicates
for (int i = 0; i < m_mPaymentProcessors.length; i++)
{
if (m_mPaymentProcessors[i].isAcceptAMEX ())
map.put (CREDITCARDTYPE_Amex, getCreditCardPair (CREDITCARDTYPE_Amex));
if (m_mPaymentProcessors[i].isAcceptDiners ())
map.put (CREDITCARDTYPE_Diners, getCreditCardPair (CREDITCARDTYPE_Diners));
if (m_mPaymentProcessors[i].isAcceptDiscover ())
map.put (CREDITCARDTYPE_Discover, getCreditCardPair (CREDITCARDTYPE_Discover));
if (m_mPaymentProcessors[i].isAcceptMC ())
map.put (CREDITCARDTYPE_MasterCard, getCreditCardPair (CREDITCARDTYPE_MasterCard));
if (m_mPaymentProcessors[i].isAcceptCorporate ())
map.put (CREDITCARDTYPE_PurchaseCard, getCreditCardPair (CREDITCARDTYPE_PurchaseCard));
if (m_mPaymentProcessors[i].isAcceptVisa ())
map.put (CREDITCARDTYPE_Visa, getCreditCardPair (CREDITCARDTYPE_Visa));
} // for all payment processors
//
ValueNamePair[] retValue = new ValueNamePair[map.size ()];
map.values ().toArray (retValue);
log.fine("getCreditCards - #" + retValue.length + " - Processors=" + m_mPaymentProcessors.length);
return retValue;
}
catch (Exception ex)
{
ex.printStackTrace();
return null;
}
} // getCreditCards
/**
* Get Type and name pair
* @param CreditCardType credit card Type
* @return pair
*/
private ValueNamePair getCreditCardPair (String CreditCardType)
{
return new ValueNamePair (CreditCardType, getCreditCardName(CreditCardType));
} // getCreditCardPair
/**************************************************************************
* Credit Card Number
* @param CreditCardNumber CreditCard Number
*/
public void setCreditCardNumber (String CreditCardNumber)
{
super.setCreditCardNumber (MPaymentValidate.checkNumeric(CreditCardNumber));
} // setCreditCardNumber
/**
* Verification Code
* @param newCreditCardVV CC verification
*/
public void setCreditCardVV(String newCreditCardVV)
{
super.setCreditCardVV (MPaymentValidate.checkNumeric(newCreditCardVV));
} // setCreditCardVV
/**
* Two Digit CreditCard MM
* @param CreditCardExpMM Exp month
*/
public void setCreditCardExpMM (int CreditCardExpMM)
{
if (CreditCardExpMM < 1 || CreditCardExpMM > 12)
;
else
super.setCreditCardExpMM (CreditCardExpMM);
} // setCreditCardExpMM
/**
* Two digit CreditCard YY (til 2020)
* @param newCreditCardExpYY 2 or 4 digit year
*/
public void setCreditCardExpYY (int newCreditCardExpYY)
{
int CreditCardExpYY = newCreditCardExpYY;
if (newCreditCardExpYY > 1999)
CreditCardExpYY = newCreditCardExpYY-2000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -