0
votes

gone through a variety of the articles, and none seem to "Work". In particular, 2021r1, not getting ANY of the PXTrace statement in the output

Challenge: Static method of the graph directly called from ARPaymentEntry, and 4-5 overloads (From .\App_Data\CodeRepository\PX.Objects\AR\ARDocumentRelease.cs) Eventually ends up calling a single method within that graph, starting with "public static void ReleaseDoc(" No clear place to add a delegate, though that seems the "most correct" method (E.g. question 37262565, comment from cbetabeta) - Yet the initialize event doesn't appear to be firing (possibly JIT optimization? Direct call into static method doesn't really need the class to be instantiated, I'd guess)

Also need a complete solution - e.g. Must handle the call from Payment Entry as well as from AR Document Release process

Sample Code:

using PX.Data;
using PX.Objects.AR;
using PX.Objects.GL;
using System.Collections;
using System.Collections.Generic;
using static PX.Objects.AR.ARDocumentRelease;

namespace Test.GraphExtensions
{
    public class ARDocumentReleaseTestABC : PXGraphExtension<ARDocumentRelease>
    {
        // Tries include:
        // https://html.developreference.com/article/11055300/How+to+customize+the+Process+button+on+the+AP505200+screen.+Acumatica
        // https://stackguides.com/questions/36784480/customize-release-ap-document-in-acumatica-system
        // https://stackguides.com/questions/37262565/how-can-i-execute-code-from-the-release-release-all-buttons-in-the-release-ar
        // https://living-sun.com/es/acumatica/2179-extend-arpaymententry-release-action-acumatica.html
        #region IsActive - Turn off if no setup record

        public static bool IsActive()
        {
            return true;
        }

        #endregion IsActive - Turn off if no setup record
        public virtual void BalancedARDocument_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "dc1703c7-f8b7-4ce1-b838-d51475f4d477"));
            
        }
        public override void Initialize()
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8ecc4f83-9ac8-4bb6-bad7-ac2aabc5b58e"));
          
        }
        public static void ReleaseDocRBRR(ARRegister ardoc, bool isAborted)
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} {1} {2}", "20ae0d5e-44eb-42f2-ad15-0b9e307d2a86", isAborted, (ardoc == null)));
        }

        [PXUIField(DisplayName = "Release", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Update)]
        [PXProcessButton]
    //    [PXOverride]
        public virtual IEnumerable Release(PXAdapter adapter)
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "0ccff0b7-7702-4083-b717-17b031e27be5"));
            List<ARRegister> list = new List<ARRegister>();
            return list;
        }
    }
}
4
The ARDocumentRelease.ReleaseDoc static method doesn't instantiate a copy of the ARDocumentRelease graph, but it does instantiate a couple other graphs. If you let us know what you are trying to accomplish we might be able provide you with a good method to override. You can also check the ARReleaseProcess graph, as that is frequently where I override logic when changing the release process for ARPayments. - Sean Prouty

4 Answers

2
votes

The proper place to override is either ARReleaseProcess.OnBeforeRelease if you need your code to fire before the release code or ARReleaseProcess.ReleaseDocProc.

Also, if you just need to run your code after the release, it is recommended that you add your code to onreleasecomplete Delegate in ARReleaseProcess.ReleaseDocProc.

Also, if you just need to run your code after the document release and you do not necessarily need to have it run exactly in the same transaction, please consider adding a separate process that picks up released documents and processes them further. You can either schedule that process ti run in the backgroud every minute or put a trigger with Business Events.

0
votes

I think its the namespace that is the issue:

namespace PX.Objects.AR
{
  public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
  {
    #region Event Handlers
        public override void Initialize()
    {
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8ecc4f83-9ac8-4bb6-bad7-ac2aabc5b58e"));
      
    }
    #endregion
  }
}
0
votes

Seems I had a variety of issues, in particular was an extension to the wrong graph. Hooking up with Dmitrii's answer, I indicate at least some of the events that are hit, so others can use in the future

Code modified per @dmitrii-naumov's answer:

using PX.Data;
using PX.Objects.AR;
using PX.Objects.GL;
using System.Collections.Generic;

namespace Test.ABCD
{
    public class ARDocumentReleaseTestABCD : PXGraphExtension<ARReleaseProcess>
    {
        #region IsActive - Turn off if no setup record

        public static bool IsActive()
        {
            return true;
        }

        #endregion IsActive - Turn off if no setup record

        public override void Initialize()
        {
            // Hit
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8ecc4f83-9ac8-4bb6-bad7-ac2aabc5b58e"));
        }

        public delegate List<ARRegister> ReleaseDocProcDelegate(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete);

        [PXOverride]
        public List<ARRegister> ReleaseDocProc(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete, ReleaseDocProcDelegate del)
        {
            // Hit
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8f153b0b-dd57-4893-aa8c-d29ea69528e4"));
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "9b1caa30-5abf-4f21-8c45-a55c4047441a"));
            return null;
        }

        [PXOverride]
        public virtual ARRegister OnBeforeRelease(ARRegister ardoc)
        {
            // Hit
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "741a01ad-5a37-40a8-ad10-a1fcd6659f7e"));
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "9b1caa30-5abf-4f21-8c45-a55c4047441a"));
            return ardoc;
        }
    }
}
0
votes

This version implements OnReleaseComplete, from code Dmitrii provided to me (I'll take the blame for mistakes, but he got the event hooked up correctly, so do get the OnComplete event displayed in the log):

public class ARDocumentReleaseTESTABC : PXGraphExtension<ARReleaseProcess>
{
    #region IsActive 

    public static bool IsActive()
    {
        return true;
    }

    #endregion IsActive

    public void OnReleaseComplete(ARRegister doc)
    {
        ///code
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "7d22cef8-c14d-4111-bcc5-405be006ea6b"));
    }

    #region ReleaseDocProc
    public delegate List<ARRegister> ReleaseDocProcDelegate(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete);

    [PXOverride]
    public List<ARRegister> ReleaseDocProc(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete, ReleaseDocProcDelegate del)
    {
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "d508b521-976c-452b-9765-57f532a0a513"));
        onreleasecomplete += OnReleaseComplete;
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "309e2e6b-6fb8-4c75-ab8a-40e56c173562"));
        return del(je, ardoc, pmBatchList, onreleasecomplete);
    }
    #endregion
}