Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Acumatica 扩展术语计算_Acumatica - Fatal编程技术网

Acumatica 扩展术语计算

Acumatica 扩展术语计算,acumatica,Acumatica,我正在尝试扩展发票条款的计算(账单和调整屏幕(AP301000)上的字段TermsID) Acumatica的标准行为是:当您更新termsID字段时,它会自动更新dueDate字段和discountDate字段 因此,我的想法是查看APInvoiceEntry中的代码并查找术语Sid_FieldUpdated protected virtual void APInvoice_TermsID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs

我正在尝试扩展发票条款的计算(账单和调整屏幕(AP301000)上的字段TermsID)

Acumatica的标准行为是:当您更新termsID字段时,它会自动更新dueDate字段和discountDate字段

因此,我的想法是查看APInvoiceEntry中的代码并查找术语Sid_FieldUpdated

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;
        }
    }           
}