📄 allocationauto.java
字号:
if (psCheck == null)
continue;
//
BigDecimal totalInvoice = Env.ZERO;
MPaySelectionLine[] psLines = psCheck.getPaySelectionLines(false);
for (int i = 0; i < psLines.length; i++)
{
MPaySelectionLine line = psLines[i];
MInvoice invoice = line.getInvoice();
if (payment.getC_Currency_ID() == invoice.getC_Currency_ID())
{
BigDecimal invoiceAmt = invoice.getOpenAmt(true, null);
BigDecimal overUnder = line.getOpenAmt().subtract(line.getPayAmt())
.subtract(line.getDiscountAmt()).subtract(line.getDifferenceAmt());
invoiceAmt = invoiceAmt.subtract(line.getDiscountAmt())
.subtract(line.getDifferenceAmt()).subtract(overUnder);
if (!invoice.isSOTrx())
invoiceAmt = invoiceAmt.negate();
log.fine("allocatePaymentWithInfo - " + invoice + ", Invoice=" + invoiceAmt);
totalInvoice = totalInvoice.add(invoiceAmt);
}
else // Multi-Currency
{
}
}
if (availableAmt.compareTo(totalInvoice) == 0)
{
if (payment.allocateIt())
{
addLog(0, payment.getDateAcct(), availableAmt, payment.getDocumentNo() + " [n]");
count++;
}
}
} // No direct invoice
}
//**** See if there is a direct link
return count;
} // allocateIndividualPayments
/**
* Allocate Payment:Invoice 1:1
* @return allocations
*/
private int allocateBPOneToOne() throws Exception
{
int count = 0;
for (int p = 0; p < m_payments.length; p++)
{
MPayment payment = m_payments[p];
if (payment.isAllocated())
continue;
BigDecimal allocatedAmt = payment.getAllocatedAmt();
log.info("allocateOneToOne - " + payment + ", Allocated=" + allocatedAmt);
if (allocatedAmt != null && allocatedAmt.signum() != 0)
continue;
BigDecimal availableAmt = payment.getPayAmt()
.add(payment.getDiscountAmt())
.add(payment.getWriteOffAmt())
.add(payment.getOverUnderAmt());
if (!payment.isReceipt())
availableAmt = availableAmt.negate();
log.fine("allocateOneToOne - Available=" + availableAmt);
for (int i = 0; i < m_invoices.length; i++)
{
MInvoice invoice = m_invoices[i];
if (invoice == null || invoice.isPaid())
continue;
if (payment.getC_Currency_ID() == invoice.getC_Currency_ID())
{
// log.fine("allocateBPartnerAll - " + invoice);
BigDecimal openAmt = invoice.getOpenAmt(true, null);
if (!invoice.isSOTrx())
openAmt = openAmt.negate();
BigDecimal difference = availableAmt.subtract(openAmt).abs();
log.fine("allocateOneToOne - " + invoice + ", Open=" + openAmt + " - Difference=" + difference);
if (difference.signum() == 0)
{
Timestamp dateAcct = payment.getDateAcct();
if (invoice.getDateAcct().after(dateAcct))
dateAcct = invoice.getDateAcct();
if (!createAllocation(payment.getC_Currency_ID(), "1:1 (" + availableAmt + ")",
dateAcct, availableAmt, null, null, null,
invoice.getC_BPartner_ID(), payment.getC_Payment_ID(),
invoice.getC_Invoice_ID(), invoice.getAD_Org_ID()))
{
throw new CompiereSystemError("Cannot create Allocation");
}
processAllocation();
count++;
m_invoices[i] = null; // remove invoice
m_payments[p] = null;
payment = null;
break;
}
}
else // Multi-Currency
{
}
} // for all invoices
} // for all payments
return count;
} // allocateOneToOne
/**
* Allocate all Payments/Invoices using Accounting currency
* @return allocations
*/
private int allocateBPartnerAll() throws Exception
{
int C_Currency_ID = MClient.get(getCtx()).getC_Currency_ID();
Timestamp dateAcct = null;
// Payments
BigDecimal totalPayments = Env.ZERO;
for (int p = 0; p < m_payments.length; p++)
{
MPayment payment = m_payments[p];
if (payment.isAllocated())
continue;
BigDecimal allocatedAmt = payment.getAllocatedAmt();
// log.info("allocateBPartnerAll - " + payment + ", Allocated=" + allocatedAmt);
if (allocatedAmt != null && allocatedAmt.signum() != 0)
continue;
BigDecimal availableAmt = payment.getPayAmt()
.add(payment.getDiscountAmt())
.add(payment.getWriteOffAmt())
.add(payment.getOverUnderAmt());
if (!payment.isReceipt())
availableAmt = availableAmt.negate();
// Foreign currency
if (payment.getC_Currency_ID() != C_Currency_ID)
continue;
// log.fine("allocateBPartnerAll - Available=" + availableAmt);
if (dateAcct == null || payment.getDateAcct().after(dateAcct))
dateAcct = payment.getDateAcct();
totalPayments = totalPayments.add(availableAmt);
}
// Invoices
BigDecimal totalInvoices = Env.ZERO;
for (int i = 0; i < m_invoices.length; i++)
{
MInvoice invoice = m_invoices[i];
if (invoice.isPaid())
continue;
// log.info("allocateBPartnerAll - " + invoice);
BigDecimal openAmt = invoice.getOpenAmt(true, null);
if (!invoice.isSOTrx())
openAmt = openAmt.negate();
// Foreign currency
if (invoice.getC_Currency_ID() != C_Currency_ID)
continue;
// log.fine("allocateBPartnerAll - Open=" + openAmt);
if (dateAcct == null || invoice.getDateAcct().after(dateAcct))
dateAcct = invoice.getDateAcct();
totalInvoices = totalInvoices.add(openAmt);
}
BigDecimal difference = totalInvoices.subtract(totalPayments);
log.info("allocateBPartnerAll = Invoices=" + totalInvoices
+ " - Payments=" + totalPayments
+ " = Difference=" + difference);
if (difference.signum() == 0)
{
for (int p = 0; p < m_payments.length; p++)
{
MPayment payment = m_payments[p];
if (payment.isAllocated())
continue;
BigDecimal allocatedAmt = payment.getAllocatedAmt();
if (allocatedAmt != null && allocatedAmt.signum() != 0)
continue;
BigDecimal availableAmt = payment.getPayAmt()
.add(payment.getDiscountAmt())
.add(payment.getWriteOffAmt())
.add(payment.getOverUnderAmt());
if (!payment.isReceipt())
availableAmt = availableAmt.negate();
// Foreign currency
if (payment.getC_Currency_ID() != C_Currency_ID)
continue;
if (!createAllocation(C_Currency_ID, "BP All",
dateAcct, availableAmt, null, null, null,
payment.getC_BPartner_ID(), payment.getC_Payment_ID(), 0, payment.getAD_Org_ID()))
{
throw new CompiereSystemError("Cannot create Allocation");
}
} // for all payments
//
for (int i = 0; i < m_invoices.length; i++)
{
MInvoice invoice = m_invoices[i];
if (invoice.isPaid())
continue;
BigDecimal openAmt = invoice.getOpenAmt(true, null);
if (!invoice.isSOTrx())
openAmt = openAmt.negate();
// Foreign currency
if (invoice.getC_Currency_ID() != C_Currency_ID)
continue;
if (!createAllocation(C_Currency_ID, "BP All",
dateAcct, openAmt, null, null, null,
invoice.getC_BPartner_ID(), 0, invoice.getC_Invoice_ID(), invoice.getAD_Org_ID()))
{
throw new CompiereSystemError("Cannot create Allocation");
}
} // for all invoices
processAllocation();
return 1;
} // Difference OK
return 0;
} // allocateBPartnerAll
/**
* Allocate Oldest First using Accounting currency
* @return allocations
*/
private int allocateBPOldestFirst() throws Exception
{
int C_Currency_ID = MClient.get(getCtx()).getC_Currency_ID();
Timestamp dateAcct = null;
// Payments
BigDecimal totalPayments = Env.ZERO;
for (int p = 0; p < m_payments.length; p++)
{
MPayment payment = m_payments[p];
if (payment.isAllocated())
continue;
if (payment.getC_Currency_ID() != C_Currency_ID)
continue;
BigDecimal allocatedAmt = payment.getAllocatedAmt();
log.info("allocateBPOldestFirst - " + payment + ", Allocated=" + allocatedAmt);
BigDecimal availableAmt = payment.getPayAmt()
.add(payment.getDiscountAmt())
.add(payment.getWriteOffAmt())
.add(payment.getOverUnderAmt());
if (!payment.isReceipt())
availableAmt = availableAmt.negate();
log.fine("allocateBPOldestFirst - Available=" + availableAmt);
if (dateAcct == null || payment.getDateAcct().after(dateAcct))
dateAcct = payment.getDateAcct();
totalPayments = totalPayments.add(availableAmt);
}
// Invoices
BigDecimal totalInvoices = Env.ZERO;
for (int i = 0; i < m_invoices.length; i++)
{
MInvoice invoice = m_invoices[i];
if (invoice.isPaid())
continue;
if (invoice.getC_Currency_ID() != C_Currency_ID)
continue;
BigDecimal openAmt = invoice.getOpenAmt(true, null);
log.fine("allocateBPOldestFirst - " + invoice);
if (!invoice.isSOTrx())
openAmt = openAmt.negate();
// Foreign currency
log.fine("allocateBPOldestFirst - Open=" + openAmt);
if (dateAcct == null || invoice.getDateAcct().after(dateAcct))
dateAcct = invoice.getDateAcct();
totalInvoices = totalInvoices.add(openAmt);
}
// must be either AP or AR balance
if (totalInvoices.signum() != totalPayments.signum())
{
log.fine("allocateBPartnerAll - Signum - Invoices=" + totalInvoices.signum()
+ " <> Payments=" + totalPayments.signum());
return 0;
}
BigDecimal difference = totalInvoices.subtract(totalPayments);
BigDecimal maxAmt = totalInvoices.abs().min(totalPayments.abs());
if (totalInvoices.signum() < 0)
maxAmt = maxAmt.negate();
log.info("allocateBPartnerAll = Invoices=" + totalInvoices
+ " - Payments=" + totalPayments
+ " = Difference=" + difference + " - Max=" + maxAmt);
// Allocate Payments up to max
BigDecimal allocatedPayments = Env.ZERO;
for (int p = 0; p < m_payments.length; p++)
{
MPayment payment = m_payments[p];
if (payment.isAllocated())
continue;
if (payment.getC_Currency_ID() != C_Currency_ID)
continue;
BigDecimal allocatedAmt = payment.getAllocatedAmt();
if (allocatedAmt != null && allocatedAmt.signum() != 0)
continue;
BigDecimal availableAmt = payment.getPayAmt()
.add(payment.getDiscountAmt())
.add(payment.getWriteOffAmt())
.add(payment.getOverUnderAmt());
if (!payment.isReceipt())
availableAmt = availableAmt.negate();
allocatedPayments = allocatedPayments.add(availableAmt);
if ((totalInvoices.signum() > 0 && allocatedPayments.compareTo(maxAmt) > 0)
|| (totalInvoices.signum() < 0 && allocatedPayments.compareTo(maxAmt) < 0))
{
BigDecimal diff = allocatedPayments.subtract(maxAmt);
availableAmt = availableAmt.subtract(diff);
allocatedPayments = allocatedPayments.subtract(diff);
}
log.fine("allocateBPOldestFirst - Payment Allocated=" + availableAmt);
if (!createAllocation(C_Currency_ID, "BP Oldest (" + difference.abs() + ")",
dateAcct, availableAmt, null, null, null,
payment.getC_BPartner_ID(), payment.getC_Payment_ID(), 0, payment.getAD_Org_ID()))
{
throw new CompiereSystemError("Cannot create Allocation");
}
if (allocatedPayments.compareTo(maxAmt) == 0)
break;
} // for all payments
// Allocated Invoices up to max
BigDecimal allocatedInvoices = Env.ZERO;
for (int i = 0; i < m_invoices.length; i++)
{
MInvoice invoice = m_invoices[i];
if (invoice.isPaid())
continue;
if (invoice.getC_Currency_ID() != C_Currency_ID)
continue;
BigDecimal openAmt = invoice.getOpenAmt(true, null);
if (!invoice.isSOTrx())
openAmt = openAmt.negate();
allocatedInvoices = allocatedInvoices.add(openAmt);
if ((totalInvoices.signum() > 0 && allocatedInvoices.compareTo(maxAmt) > 0)
|| (totalInvoices.signum() < 0 && allocatedInvoices.compareTo(maxAmt) < 0))
{
BigDecimal diff = allocatedInvoices.subtract(maxAmt);
openAmt = openAmt.subtract(diff);
allocatedInvoices = allocatedInvoices.subtract(diff);
}
if (openAmt.signum() == 0)
break;
log.fine("allocateBPOldestFirst - Invoice Allocated=" + openAmt);
if (!createAllocation(C_Currency_ID, "BP Oldest (" + difference.abs() + ")",
dateAcct, openAmt, null, null, null,
invoice.getC_BPartner_ID(), 0, invoice.getC_Invoice_ID(), invoice.getAD_Org_ID()))
{
throw new CompiereSystemError("Cannot create Allocation");
}
if (allocatedInvoices.compareTo(maxAmt) == 0)
break;
} // for all invoices
if (allocatedPayments.compareTo(allocatedInvoices) != 0)
{
throw new CompiereSystemError("Allocated Payments=" + allocatedPayments
+ " <> Invoices=" + allocatedInvoices);
}
processAllocation();
return 1;
} // allocateOldestFirst
/**********************************************************************************************
* Create Allocation allocation
* @param C_Currency_ID currency
* @param description decription
* @param Amount amount
* @param DiscountAmt discount
* @param WriteOffAmt write off
* @param OverUnderAmt over under
* @param C_BPartner_ID partner
* @param C_Payment_ID payment
* @param C_Invoice_ID invoice
* @return true if created
*/
private boolean createAllocation (int C_Currency_ID, String description,
Timestamp dateAcct, BigDecimal Amount,
BigDecimal DiscountAmt, BigDecimal WriteOffAmt, BigDecimal OverUnderAmt,
int C_BPartner_ID, int C_Payment_ID, int C_Invoice_ID, int AD_Org_ID)
{
// Process old Allocation
if (m_allocation != null
&& m_allocation.getC_Currency_ID() != C_Currency_ID)
processAllocation();
// New Allocation
if (m_allocation == null)
{
m_allocation = new MAllocationHdr (getCtx(), false, dateAcct, // automatic
C_Currency_ID, "Auto " + description, get_TrxName());
m_allocation.setAD_Org_ID(AD_Org_ID);
if (!m_allocation.save())
return false;
}
// New Allocation Line
MAllocationLine aLine = new MAllocationLine (m_allocation, Amount,
DiscountAmt, WriteOffAmt, OverUnderAmt);
aLine.setC_BPartner_ID(C_BPartner_ID);
aLine.setC_Payment_ID(C_Payment_ID);
aLine.setC_Invoice_ID(C_Invoice_ID);
return aLine.save();
} // createAllocation
/**
* Process Allocation
* @return true if processes/saved or none
*/
private boolean processAllocation()
{
if (m_allocation == null)
return true;
boolean success = m_allocation.processIt(MAllocationHdr.DOCACTION_Complete);
if (success)
success = m_allocation.save();
else
m_allocation.save();
addLog(0, m_allocation.getDateAcct(), null, m_allocation.getDescription());
m_allocation = null;
return success;
} // processAllocation
} // AllocationAuto
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -