Экран счетов и заметок по электронной почте Действие счета / заметки в Acumatica

#acumatica

#acumatica

Вопрос:

Мы создали несколько настраиваемых отчетов, и они будут открываться в зависимости от типа заказа на продажу на вкладке «Сведения». Таким же образом мы хотим отправить отчет на основе типа заказа, когда мы используем действие накладной / заметки по электронной почте в меню Действия.

Мы попытались переопределить код, но по-прежнему видим, что отчет по умолчанию отправляется по электронной почте. Как я могу это исправить? Мой код приведен ниже:

         [PXOverride]
        public PXAction<ARInvoice> sendARInvoiceMemo;
        [PXUIField(DisplayName = "Send AR Invoice/Memo", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
        [PXLookupButton]
        public IEnumerable SendARInvoiceMemo(PXAdapter adapter, String reportID)
        {
            PXReportRequiredException ex = null;

            foreach (ARInvoice doc in adapter.Get<ARInvoice>())
            {
                var parameters = new Dictionary<string, string>();

                ARTran TranData = PXSelectReadonly<ARTran, Where<ARTran.tranType, Equal<Required<ARTran.tranType>>,
                    And<ARTran.refNbr, Equal<Required<ARTran.refNbr>>>>>.Select(Base, doc.DocType, doc.RefNbr);
                if (TranData != null)
                {
                    if (TranData.SOOrderType == "WS" || TranData.SOOrderType == "WO" || TranData.SOOrderType == "TS" || TranData.SOOrderType == "IM")
                    {
                        if (reportID == null) reportID = "KR501011";
                        Dictionary<string, string> mailParams = new Dictionary<string, string>();
                        if (reportID == "KR501011")
                        {
                            mailParams["DocType"] = doc.DocType;
                            mailParams["RefNbr"] = doc.RefNbr;
                            if (!ReportNotificationGenerator.Send(reportID, mailParams).Any())
                            {
                                throw new PXException(ErrorMessages.MailSendFailed);
                            }
                        }
                        Base.Clear();
                        Base.Document.Current = Base.Document.Search<ARInvoice.refNbr>(doc.RefNbr, doc.DocType);
                    }

                    if (TranData.SOOrderType == "RS" || TranData.SOOrderType == "RO" || TranData.SOOrderType == "PS" || TranData.SOOrderType == "QT")
                    {
                        if (reportID == null) reportID = "KR501012";
                        Dictionary<string, string> mailParams = new Dictionary<string, string>();
                        if (reportID == "KR501012")
                        {
                            mailParams["DocType"] = doc.DocType;
                            mailParams["RefNbr"] = doc.RefNbr;
                            if (!ReportNotificationGenerator.Send(reportID, mailParams).Any())
                            {
                                throw new PXException(ErrorMessages.MailSendFailed);
                            }
                        }
                        Base.Clear();
                        Base.Document.Current = Base.Document.Search<ARInvoice.refNbr>(doc.RefNbr, doc.DocType);
                    }
                }
            }           

            if (ex != null) throw ex;

            return adapter.Get();
        }
 

Комментарии:

1. Похоже, что вы назначаете пользовательский идентификатор отчета только в том случае, если идентификатор отчета равен null. Вы уверены, что в этот момент идентификатор отчета равен нулю?

Ответ №1:

Обратите внимание, версия не была указана, поэтому моя работа была выполнена с 2020r2.

SendARInvoiceMemo не вызывается действием «Счет / заметка по электронной почте». Скорее, Notification это делегат для этого действия.

Обратите внимание, что уведомление на самом деле не вызывает идентификатор отчета, скорее оно зависит от компакт-диска с уведомлениями и ваших настроек рассылки, чтобы определить, какой отчет запускать. Я изменил код, чтобы перейти к новому notificationCD, который я создал, под названием INVOICEALT. Это настроено на мой альтернативный идентификатор отчета.

     [PXOverride()]
    [PXUIField(DisplayName = "Notifications", Visible = false)]
    [PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntryF)]
    public virtual IEnumerable Notification(PXAdapter adapter,
    [PXString]
    string notificationCD)
    {
        foreach (ARInvoice doc in adapter.Get().RowCast<ARInvoice>())
        {
            Base.Document.Current = doc;

            Dictionary<string, string> parameters = new Dictionary<string, string>
            {
                ["DocType"] = doc.DocType,
                ["RefNbr"] = doc.RefNbr
            };

            using (var ts = new PXTransactionScope())
            {
                if (ProjectDefaultAttribute.IsProject(Base, doc.ProjectID) amp;amp; Base.Activity.IsProjectSourceActive(doc.ProjectID, notificationCD))
                {
                    Base.Activity.SendNotification(PMNotificationSource.Project, notificationCD, doc.BranchID, parameters);
                }
                else
                {
                    //Base.Activity.SendNotification(ARNotificationSource.Customer, notificationCD, doc.BranchID, parameters); //This is what was there
                    //Inserted switch based on Sales Order Type >>

                    ARTran TranData = PXSelectReadonly<ARTran, Where<ARTran.tranType, Equal<Required<ARTran.tranType>>,
                        And<ARTran.refNbr, Equal<Required<ARTran.refNbr>>>>>.Select(Base, doc.DocType, doc.RefNbr);
                    switch (TranData.SOOrderType)
                    {
                        case "IN":
                            Base.Activity.SendNotification(ARNotificationSource.Customer, "INVOICEALT", doc.BranchID, parameters);
                            break;
                        default:
                            Base.Activity.SendNotification(ARNotificationSource.Customer, notificationCD, doc.BranchID, parameters);
                            break;
                    }
                    //<< Inserted switch based on Sales Order Type
                }
                Base.Save.Press();

                ts.Complete();
            }

            yield return doc;
        }
    }
 

В качестве альтернативы вышесказанному, если вы просто говорите о пользователях, выполняющих действие, вы можете скрыть действие счета / заметки по электронной почте и ввести новое действие.

     public PXAction<ARInvoice> sendARInvoiceMemoA<
    [PXUIField(DisplayName = "Alt Email Invoice/Memo", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
    [PXLookupButton]
    public IEnumerable SendARInvoiceMemoAlt(PXAdapter adapter, String reportID)
    {
        PXReportRequiredException ex = null;

        foreach (ARInvoice doc in adapter.Get<ARInvoice>())
        {
            var parameters = new Dictionary<string, string>();

            ARTran TranData = PXSelectReadonly<ARTran, Where<ARTran.tranType, Equal<Required<ARTran.tranType>>,
                And<ARTran.refNbr, Equal<Required<ARTran.refNbr>>>>>.Select(Base, doc.DocType, doc.RefNbr);
            if (TranData != null)
            {
                if (TranData.SOOrderType == "SO")// || TranData.SOOrderType == "WS" || TranData.SOOrderType == "WO" || TranData.SOOrderType == "TS" || TranData.SOOrderType == "IM")
                {
                    if (reportID == null) reportID = "AR641000";
                    Dictionary<string, string> mailParams = new Dictionary<string, string>();
                    if (reportID == "AR641000")
                    {
                        mailParams["DocType"] = doc.DocType;
                        mailParams["RefNbr"] = doc.RefNbr;
                        if (!ReportNotificationGenerator.Send(reportID, mailParams).Any())
                        {
                            throw new PXException(ErrorMessages.MailSendFailed);
                        }
                    }
                    Base.Clear();
                    Base.Document.Current = Base.Document.Search<ARInvoice.refNbr>(doc.RefNbr, doc.DocType);
                }

                if (TranData.SOOrderType == "IN")// || TranData.SOOrderType == "RS" || TranData.SOOrderType == "RO" || TranData.SOOrderType == "PS" || TranData.SOOrderType == "QT")
                {
                    if (reportID == null) reportID = "AR641001";
                    Dictionary<string, string> mailParams = new Dictionary<string, string>();
                    if (reportID == "AR641001")
                    {
                        mailParams["DocType"] = doc.DocType;
                        mailParams["RefNbr"] = doc.RefNbr;
                        if (!ReportNotificationGenerator.Send(reportID, mailParams).Any())
                        {
                            throw new PXException(ErrorMessages.MailSendFailed);
                        }
                    }
                    Base.Clear();
                    Base.Document.Current = Base.Document.Search<ARInvoice.refNbr>(doc.RefNbr, doc.DocType);
                }
            }
        }

        if (ex != null) throw ex;

        return adapter.Get();
    }

    public override void Initialize()
    {
        base.Initialize();

        Base.ActionsMenuItem.AddMenuAction(sendARInvoiceMemoAlt);
    }