Acumatica 扩展术语计算
我正在尝试扩展发票条款的计算(账单和调整屏幕(AP301000)上的字段TermsID) Acumatica的标准行为是:当您更新termsID字段时,它会自动更新dueDate字段和discountDate字段 因此,我的想法是查看APInvoiceEntry中的代码并查找术语Sid_FieldUpdatedAcumatica 扩展术语计算,acumatica,Acumatica,我正在尝试扩展发票条款的计算(账单和调整屏幕(AP301000)上的字段TermsID) Acumatica的标准行为是:当您更新termsID字段时,它会自动更新dueDate字段和discountDate字段 因此,我的想法是查看APInvoiceEntry中的代码并查找术语Sid_FieldUpdated protected virtual void APInvoice_TermsID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs
protected virtual void APInvoice_TermsID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
Terms terms = (Terms)PXSelectorAttribute.Select<APInvoice.termsID>(sender, e.Row);
if (terms != null && terms.InstallmentType != TermsInstallmentType.Single)
{
foreach (APAdjust adj in Adjustments.Select())
{
Adjustments.Cache.Delete(adj);
}
}
}
protected virtual void APInvoice\u TermsID\u FieldUpdated(PXCache发送方,PXFieldUpdatedEventArgs e)
{
Terms Terms=(Terms)PXSelectorAttribute.Select(发件人,e.Row);
if(terms!=null&&terms.InstallmentType!=TermsInstallmentType.Single)
{
foreach(调整中的调整。选择())
{
调整。缓存。删除(adj);
}
}
}
但是除了删除调整的缓存外,它似乎什么也没做。我不知道为了添加另一种计算条款日期的方法,应该扩展什么
(目标是允许进行以下计算:
-我取发票日期,加上30天,如果我在下个月的第10天以下,我将到期日期设置为下个月的第10天,否则我将到期日期设置为下个月的第10天)
谢谢,实现一个APInvoice\u DueDate\u FieldUpdate事件处理程序,它将在术语更改时引发。我在DueDate上添加了一个FieldUpdate事件处理程序,并检查了调用堆栈以找到修改DueDate的方法: 包含逻辑的是[Terms(…)]属性:
#region TermsID
public abstract class termsID : IBqlField
{
}
/// <summary>
/// The <see cref="PX.Objects.CS.Terms">credit terms</see> associated with the document (unavailable for prepayments and debit adjustments).\
/// Defaults to the <see cref="Vendor.TermsID">credit terms of the vendor</see>.
/// </summary>
[PXDBString(10, IsUnicode = true)]
[PXDefault(typeof(Search<Vendor.termsID,
Where<Vendor.bAccountID, Equal<Current<APInvoice.vendorID>>,
And<Current<APInvoice.docType>, NotEqual<APDocType.debitAdj>>>>),
PersistingCheck = PXPersistingCheck.Nothing)]
[PXUIField(DisplayName = "Terms", Visibility = PXUIVisibility.Visible)]
[APTermsSelector]
[Terms(typeof(APInvoice.docDate), typeof(APInvoice.dueDate), typeof(APInvoice.discDate), typeof(APInvoice.curyOrigDocAmt), typeof(APInvoice.curyOrigDiscAmt))]
public virtual string TermsID
{
get;
set;
}
#endregion
#区域TermsID
公共抽象类termsID:IBqlField
{
}
///
///与单据关联的贷方条款(预付款和借方调整不可用)\
///默认为供应商的信用条款。
///
[PXDBString(10,IsUnicode=true)]
[PXDefault(类型)(搜索最终,您要修改哪些字段,APInvoice.dueDate和APInvoice.discDate?另外,您要修改哪种文档类型的dueDate?我这么问是因为大多数逻辑似乎只适用于预付款。是的,我试图修改这两个字段,但不是重写我想要修改的术语行为背后的逻辑eutilize,但我找不到如何使用termsID更新duedate和discDate。我希望它主要用于账单。(账单和调整屏幕)。我的问题更多的是关于:更新terms字段时负责计算dueDate的eventhandler在哪里,这样我就可以扩展它。我知道如何在termsID字段上添加一个eventhandler,检查它是否等于某个硬编码值,然后根据我的需要设置dueDate,但我觉得它既难看又不可靠icient,因为不重用框架的Resources在某些情况下,值更改会引发FieldUpdate事件,使其成为开始调试的最佳场所。您可以检查调用堆栈并返回触发值更改的初始事件。这完全是我要找的,我想没有框架项RMSATtributeTextension与PXgrapherXTension相同?我更新了答案,解释了如何覆盖/扩展属性。您还可以通过搜索:公共类SOINVOICETERMSATTRITE:TERMSATTRITE来检查框架源代码中的示例,如SOINVOICETERMSATTRITE
public static void CalcTermsDates(Terms terms, DateTime? docDate, out DateTime? dueDate, out DateTime? discDate)
{
dueDate = null;
discDate = null;
if (docDate != null && terms != null)
{
DateTime DocDate = docDate.Value;
switch (terms.DueType)
{
case TermsDueType.FixedNumberOfDays:
dueDate = DocDate.AddDays((double)terms.DayDue00);
break;
case TermsDueType.Prox:
DateTime sameDayOfNextMonth = DocDate.AddMonths(1);
DateTime firstDayOfNextMonth = new DateTime(sameDayOfNextMonth.Year, sameDayOfNextMonth.Month, 1);
dueDate = firstDayOfNextMonth.AddDays((double)terms.DayDue00);
break;
case TermsDueType.DayOfNextMonth:
dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue00).AddMonths(1);
break;
case TermsDueType.DayOfTheMonth:
int monthShift = DocDate.Day > (int)terms.DayDue00 ? 1 : 0;
dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue00).AddMonths(monthShift);
break;
case TermsDueType.Custom:
int nextmonth = 0;
if (DocDate.Day >= terms.DayFrom00 && DocDate.Day <= terms.DayTo00)
{
if (terms.DayDue00 <= terms.DayTo00)
{
nextmonth = 1;
}
dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue00).AddMonths(nextmonth);
}
if (DocDate.Day >= terms.DayFrom01 && DocDate.Day <= terms.DayTo01)
{
if (terms.DayDue01 <= terms.DayTo01)
{
nextmonth = 1;
}
dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue01).AddMonths(nextmonth);
}
break;
case TermsDueType.EndOfMonth:
dueDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(1).AddDays(-1);
break;
case TermsDueType.EndOfNextMonth:
dueDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(2).AddDays(-1);
break;
default:
break;
}
if (terms.InstallmentType == TermsInstallmentType.Multiple)
{
discDate = dueDate;
}
else
{
switch (terms.DiscType)
{
case TermsDueType.FixedNumberOfDays:
discDate = DocDate.AddDays((double)terms.DayDisc);
break;
case TermsDueType.Prox:
DateTime sameDayOfNextMonth = DocDate.AddMonths(1);
DateTime firstDayOfNextMonth = new DateTime(sameDayOfNextMonth.Year, sameDayOfNextMonth.Month, 1);
discDate = firstDayOfNextMonth.AddDays((double)terms.DayDisc);
break;
case TermsDueType.DayOfNextMonth:
discDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDisc).AddMonths(1);
break;
case TermsDueType.DayOfTheMonth:
int monthShift;
if (terms.DueType == TermsDueType.DayOfNextMonth && DocDate.Day <= (int)terms.DayDue00)
monthShift = DocDate.Day >= (int)terms.DayDisc ? 1 : 0;
else if (terms.DueType == TermsDueType.EndOfNextMonth)
monthShift = DocDate.Day >= (int)terms.DayDisc ? 1 : 0;
else
monthShift = DocDate.Day > (int)terms.DayDue00 ? 1 : 0;
discDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDisc).AddMonths(monthShift);
break;
case TermsDueType.EndOfMonth:
discDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(1).AddDays(-1);
break;
case TermsDueType.EndOfNextMonth:
discDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(2).AddDays(-1);
break;
default:
break;
}
}
if (discDate > dueDate)
{
discDate = dueDate;
}
}
}