代码之家  ›  专栏  ›  技术社区  ›  Maxime

扩展术语计算

  •  0
  • Maxime  · 技术社区  · 7 年前

    我正在尝试扩展发票条款的计算(字段termsid,在bills and ajustments屏幕上(ap301000)

    Acumatica的标准行为是:当您更新termsid字段时,它会自动更新DueDate字段和折扣日期字段。

    所以我的想法是查看apinvoiceentry中的代码并查找termsid_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);
            }
        }
    }
    

    但除了删除调整的缓存之外,它似乎什么也没做。我不知道该延长什么,以便增加另一种计算期限日期的方法。

    (目标是允许以下计算: -我取发票日期,加上30天,如果我低于下个月的10天,我将到期日期设置为下个月的10天,否则我将到期日期设置为下个月的10天)。

    谢谢,

    2 回复  |  直到 7 年前
        1
  •  1
  •   Hugues Beauséjour    7 年前

    我在DueDate上添加了一个FieldUpdated事件处理程序,并检查了调用堆栈以查找修改DueDate的方法: enter image description here

    包含逻辑的是[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
    

    在terms属性中,您可以找到修改到期日期的代码。 您可以考虑提供自定义属性或绕过该逻辑。

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

    可以创建从现有属性(例如:terms)派生的新属性(例如:myterms)并重写方法(例如:calctterms)。然后重新定义/扩展使用该属性(termsid)的字段,使其使用属性(myterms)而不是(terms)。

    这个 重大问题 当您要更改的代码位于无法重写的方法中时,在这种情况下,您需要复制、在自定义属性中批量粘贴代码并放弃继承。

    它的起点是属性代码。要获取它,请使用自定义项目编辑器中的“查看源代码”功能: enter image description here

    然后使用“在文件中查找”获取属性代码: enter image description here

        2
  •  0
  •   Simon ML    7 年前

    实现apinvoice_DueDate_FieldUpdated事件处理程序,它将在更改术语时引发。