📄 mpayment.java
字号:
* @param CreditCardType credit card type
* @return Name
*/
public String getCreditCardName(String CreditCardType)
{
if (CreditCardType == null)
return "--";
else if (CREDITCARDTYPE_MasterCard.equals(CreditCardType))
return "MasterCard";
else if (CREDITCARDTYPE_Visa.equals(CreditCardType))
return "Visa";
else if (CREDITCARDTYPE_Amex.equals(CreditCardType))
return "Amex";
else if (CREDITCARDTYPE_ATM.equals(CreditCardType))
return "ATM";
else if (CREDITCARDTYPE_Diners.equals(CreditCardType))
return "Diners";
else if (CREDITCARDTYPE_Discover.equals(CreditCardType))
return "Discover";
else if (CREDITCARDTYPE_PurchaseCard.equals(CreditCardType))
return "PurchaseCard";
return "?" + CreditCardType + "?";
} // getCreditCardName
/**
* Add to Description
* @param description text
*/
public void addDescription (String description)
{
String desc = getDescription();
if (desc == null)
setDescription(description);
else
setDescription(desc + " | " + description);
} // addDescription
/**
* Get Pay Amt
* @param absolute if true the absolute amount (i.e. negative if payment)
* @return amount
*/
public BigDecimal getPayAmt (boolean absolute)
{
if (isReceipt())
return super.getPayAmt();
return super.getPayAmt().negate();
} // getPayAmt
/**
* Get Pay Amt in cents
* @return amount in cents
*/
public int getPayAmtInCents ()
{
BigDecimal bd = super.getPayAmt().multiply(Env.ONEHUNDRED);
return bd.intValue();
} // getPayAmtInCents
/**************************************************************************
* 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;
// Std Period open?
if (!MPeriod.isOpen(getCtx(), getDateAcct(),
isReceipt() ? MDocType.DOCBASETYPE_ARReceipt : MDocType.DOCBASETYPE_APPayment))
{
m_processMsg = "@PeriodClosed@";
return DocAction.STATUS_Invalid;
}
// Unsuccessful Online Payment
if (isOnline() && !isApproved())
{
if (getR_Result() != null)
m_processMsg = "@OnlinePaymentFailed@";
else
m_processMsg = "@PaymentNotProcessed@";
return DocAction.STATUS_Invalid;
}
// Waiting Payment - Need to create Invoice & Shipment
if (getC_Order_ID() != 0 && getC_Invoice_ID() == 0)
{ // see WebOrder.process
MOrder order = new MOrder (getCtx(), getC_Order_ID(), get_TrxName());
if (DOCSTATUS_WaitingPayment.equals(order.getDocStatus()))
{
order.setC_Payment_ID(getC_Payment_ID());
order.setDocAction(MOrder.DOCACTION_WaitComplete);
order.set_TrxName(get_TrxName());
boolean ok = order.processIt (MOrder.DOCACTION_WaitComplete);
m_processMsg = order.getProcessMsg();
order.save(get_TrxName());
// Set Invoice
MInvoice[] invoices = order.getInvoices();
int length = invoices.length;
if (length > 0) // get last invoice
setC_Invoice_ID (invoices[length-1].getC_Invoice_ID());
//
if (getC_Invoice_ID() == 0)
{
m_processMsg = "@NotFound@ @C_Invoice_ID@";
return DocAction.STATUS_Invalid;
}
} // WaitingPayment
}
// Consistency of Invoice / Document Type and IsReceipt
if (!verifyDocType())
{
m_processMsg = "@PaymentDocTypeInvoiceInconsistent@";
return DocAction.STATUS_Invalid;
}
// Do not pay when Credit Stop/Hold
if (!isReceipt())
{
MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), get_TrxName());
if (MBPartner.SOCREDITSTATUS_CreditStop.equals(bp.getSOCreditStatus()))
{
m_processMsg = "@BPartnerCreditStop@ - @TotalOpenBalance@="
+ bp.getTotalOpenBalance()
+ ", @SO_CreditLimit@=" + bp.getSO_CreditLimit();
return DocAction.STATUS_Invalid;
}
if (MBPartner.SOCREDITSTATUS_CreditHold.equals(bp.getSOCreditStatus()))
{
m_processMsg = "@BPartnerCreditHold@ - @TotalOpenBalance@="
+ bp.getTotalOpenBalance()
+ ", @SO_CreditLimit@=" + bp.getSO_CreditLimit();
return DocAction.STATUS_Invalid;
}
}
m_justPrepared = true;
if (!DOCACTION_Complete.equals(getDocAction()))
setDocAction(DOCACTION_Complete);
return DocAction.STATUS_InProgress;
} // prepareIt
/**
* 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());
// Charge Handling
if (getC_Charge_ID() != 0)
{
setIsAllocated(true);
}
else
{
allocateIt(); // Create Allocation Records
testAllocation();
}
// Project update
if (getC_Project_ID() != 0)
{
// MProject project = new MProject(getCtx(), getC_Project_ID());
}
// Update BP for Prepayments
if (getC_BPartner_ID() != 0 && getC_Invoice_ID() == 0)
{
MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), get_TrxName());
bp.setTotalOpenBalance();
bp.save();
}
// Counter Doc
MPayment counter = createCounterDoc();
if (counter != null)
m_processMsg += " @CounterDoc@: @C_Payment_ID@=" + counter.getDocumentNo();
// User Validation
String valid = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_AFTER_COMPLETE);
if (valid != null)
{
m_processMsg = valid;
return DocAction.STATUS_Invalid;
}
//
setProcessed(true);
setDocAction(DOCACTION_Close);
return DocAction.STATUS_Completed;
} // completeIt
/**
* Create Counter Document
*/
private MPayment createCounterDoc()
{
// Is this a counter doc ?
if (getRef_Payment_ID() != 0)
return null;
// Org Must be linked to BPartner
MOrg org = MOrg.get(getCtx(), getAD_Org_ID());
int counterC_BPartner_ID = org.getLinkedC_BPartner_ID();
if (counterC_BPartner_ID == 0)
return null;
// Business Partner needs to be linked to Org
MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), null);
int counterAD_Org_ID = bp.getAD_OrgBP_ID_Int();
if (counterAD_Org_ID == 0)
return null;
MBPartner counterBP = new MBPartner (getCtx(), counterC_BPartner_ID, null);
MOrgInfo counterOrgInfo = MOrgInfo.get(getCtx(), counterAD_Org_ID);
log.info("Counter BP=" + counterBP.getName());
// Document Type
int C_DocTypeTarget_ID = 0;
MDocTypeCounter counterDT = MDocTypeCounter.getCounterDocType(getCtx(), getC_DocType_ID());
if (counterDT != null)
{
log.fine(counterDT.toString());
if (!counterDT.isCreateCounter() || !counterDT.isValid())
return null;
C_DocTypeTarget_ID = counterDT.getCounter_C_DocType_ID();
}
else // indirect
{
C_DocTypeTarget_ID = MDocTypeCounter.getCounterDocType_ID(getCtx(), getC_DocType_ID());
log.fine("Indirect C_DocTypeTarget_ID=" + C_DocTypeTarget_ID);
if (C_DocTypeTarget_ID <= 0)
return null;
}
// Deep Copy
MPayment counter = new MPayment (getCtx(), 0, get_TrxName());
counter.setAD_Org_ID(counterAD_Org_ID);
counter.setC_BPartner_ID(counterBP.getC_BPartner_ID());
counter.setIsReceipt(!isReceipt());
counter.setC_DocType_ID(C_DocTypeTarget_ID);
counter.setTrxType(getTrxType());
counter.setTenderType(getTenderType());
//
counter.setPayAmt(getPayAmt());
counter.setDiscountAmt(getDiscountAmt());
counter.setTaxAmt(getTaxAmt());
counter.setWriteOffAmt(getWriteOffAmt());
counter.setIsOverUnderPayment (isOverUnderPayment());
counter.setOverUnderAmt(getOverUnderAmt());
counter.setC_Currency_ID(getC_Currency_ID());
counter.setC_ConversionType_ID(getC_ConversionType_ID());
//
counter.setDateTrx (getDateTrx());
counter.setDateAcct (getDateAcct());
counter.setRef_Payment_ID(getC_Payment_ID());
//
String sql = "SELECT C_BankAccount_ID FROM C_BankAccount "
+ "WHERE C_Currency_ID=? AND AD_Org_ID IN (0,?) AND IsActive='Y' "
+ "ORDER BY IsDefault DESC";
int C_BankAccount_ID = DB.getSQLValue(get_TrxName(), sql, getC_Currency_ID(), counterAD_Org_ID);
counter.setC_BankAccount_ID(C_BankAccount_ID);
// Refernces
counter.setC_Activity_ID(getC_Activity_ID());
counter.setC_Campaign_ID(getC_Campaign_ID());
counter.setC_Project_ID(getC_Project_ID());
counter.setUser1_ID(getUser1_ID());
counter.setUser2_ID(getUser2_ID());
counter.save(get_TrxName());
log.fine(counter.toString());
setRef_Payment_ID(counter.getC_Payment_ID());
// Document Action
if (counterDT != null)
{
if (counterDT.getDocAction() != null)
{
counter.setDocAction(counterDT.getDocAction());
counter.processIt(counterDT.getDocAction());
counter.save(get_TrxName());
}
}
return counter;
} // createCounterDoc
/**
* Allocate It.
* Only call when there is NO allocation as it will create duplicates.
* If an invoice exists, it allocates that
* otherwise it allocates Payment Selection.
* @return true if allocated
*/
public boolean allocateIt()
{
// Create invoice Allocation - See also MCash.completeIt
if (getC_Invoice_ID() != 0)
return allocateInvoice();
// Invoices of a AP Payment Selection
if (allocatePaySelection())
return true;
if (getC_Order_ID() != 0)
return false;
// Allocate to multiple Payments based on entry
MPaymentAllocate[] pAllocs = MPaymentAllocate.get(this);
if (pAllocs.length == 0)
return false;
MAllocationHdr alloc = new MAllocationHdr(getCtx(), false,
getDateTrx(), getC_Currency_ID(),
Msg.translate(getCtx(), "C_Payment_ID") + ": " + getDocumentNo(),
get_TrxName());
alloc.setAD_Org_ID(getAD_Org_ID());
if (!alloc.save())
{
log.severe("P.Allocations not created");
return false;
}
// Lines
for (int i = 0; i < pAllocs.length; i++)
{
MPaymentAllocate pa = pAllocs[i];
MAllocationLine aLine = null;
if (isReceipt())
aLine = new MAllocationLine (alloc, pa.getAmount(),
pa.getDiscountAmt(), pa.getWriteOffAmt(), pa.getOverUnderAmt());
else
aLine = new MAllocationLine (alloc, pa.getAmount().negate(),
pa.getDiscountAmt().negate(), pa.getWriteOffAmt().negate(), pa.getOverUnderAmt().negate());
aLine.setDocInfo(pa.getC_BPartner_ID(), 0, pa.getC_Invoice_ID());
aLine.setPaymentInfo(getC_Payment_ID(), 0);
if (!aLine.save(get_TrxName()))
log.warning("P.Allocations - line not saved");
else
{
pa.setC_AllocationLine_ID(aLine.getC_AllocationLine_ID());
pa.save();
}
}
// Should start WF
alloc.processIt(DocAction.ACTION_Complete);
m_processMsg = "@C_AllocationHdr_ID@: " + alloc.getDocumentNo();
return alloc.save(get_TrxName());
} // allocateIt
/**
* Allocate single AP/AR Invoice
*/
private boolean allocateInvoice()
{
// calculate actual allocation
BigDecimal allocationAmt = getPayAmt(); // underpayment
if (getOverUnderAmt().signum() < 0 && getPayAmt().signum() > 0)
allocationAmt = allocationAmt.add(getOverUnderAmt()); // overpayment (negative)
MAllocationHdr alloc = new MAllocationHdr(getCtx(), false,
getDateTrx(), getC_Currency_ID(),
Msg.translate(getCtx(), "C_Payment_ID") + ": " + getDocumentNo() + " [1]", get_TrxName());
alloc.setAD_Org_ID(getAD_Org_ID());
if (!alloc.save())
{
log.log(Level.SEVERE, "Could not create Allocation Hdr");
return false;
}
MAllocationLine aLine = null;
if (isReceipt())
aLine = new MAllocationLine (alloc, allocationAmt,
getDiscountAmt(), getWriteOffAmt(), getOverUnderAmt());
else
aLine = new MAllocationLine (alloc, allocationAmt.negate(),
getDiscountAmt().negate(), getWriteOffAmt().negate(), getOverUnderAmt().negate());
aLine.setDocInfo(getC_BPartner_ID(), 0, getC_Invoice_ID());
aLine.setC_Payment_ID(getC_Payment_ID());
if (!aLine.save(get_TrxName()))
{
log.log(Level.SEVERE, "Could not create Allocation Line");
return false;
}
// Should start WF
alloc.processIt(DocAction.ACTION_Complete);
alloc.save(get_TrxName());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -