在Acumatica中创建PO时向请求者发送通知

时间:2018-02-27 14:30:42

标签: acumatica

当从Acumatica 6.1中的申请单创建采购订单时,我需要能够向原始请求者发送电子邮件。

根据Acumatica,通知屏幕无法处理此功能,因此我使用此代码扩展POOrder条目图表,该图表在创建采购订单时从申请单发送电子邮件至客户的联系电子邮件(以及RQRequisitionEntryExt触发器):

public class POOrderEntryExt : PXGraphExtension<POOrderEntry>
{
    private bool sendEmailNotification = false;

    public bool SendEmailNotification
    {
        get
        {
            return sendEmailNotification;
        }
        set
        {
            sendEmailNotification = value;
        }
    }

    [PXOverride]
    public void Persist(Action del)
    {
        using (var ts = new PXTransactionScope())
        {
            if (del != null)
            {
                del();
            }

            if (SendEmailNotification)
            {
                bool sent = false;
                string sError = "Failed to send E-mail.";

                try
                {
                    Notification rowNotification = PXSelect<Notification,
                        Where<Notification.name, Equal<Required<Notification.name>>>>
                        .Select(Base, "PurchaseOrderNotification");

                    if (rowNotification == null)
                        throw new PXException("Notification Template was not found.");

                    var order = Base.Document.Current;
                    var requisition = (RQRequisition)PXSelect<RQRequisition,
                        Where<RQRequisition.reqNbr, Equal<Current<POOrder.rQReqNbr>>>>
                        .SelectSingleBound(Base, new object[] { order });


                    if (requisition.CustomerID != null)
                    {
                        var customer = (BAccountR)PXSelectorAttribute.Select<RQRequisition.customerID>(
                            Base.Caches[typeof(RQRequisition)], requisition);
                        if (customer != null)
                        {
                            var defCustContact = (Contact)PXSelectorAttribute.Select<BAccountR.defContactID>(
                                Base.Caches[typeof(BAccountR)], customer);

                            if (String.IsNullOrEmpty(defCustContact.EMail))
                                throw new PXException("E-mail is not specified for Customer Contact.");

                            var sender = TemplateNotificationGenerator.Create(order,
                                rowNotification.NotificationID.Value);
                            sender.RefNoteID = order.NoteID;
                            sender.MailAccountId = rowNotification.NFrom.HasValue ?
                                                   rowNotification.NFrom.Value :
                                                   PX.Data.EP.MailAccountManager.DefaultMailAccountID;
                            sender.To = defCustContact.EMail;
                            sent |= sender.Send().Any();
                        }
                    }

                }
                catch (Exception Err)
                {
                    sent = false;
                    sError = Err.Message;
                }

                if (!sent)
                    throw new PXException(sError);
            }
            ts.Complete();
        }
    }
}

这是修改RQRequisitionEntry:

 public class RQRequisitionEntryExt : PXGraphExtension<RQRequisitionEntry>
{
    public PXAction<RQRequisition> createPOOrder;
    [PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntry)]
    [PXUIField(DisplayName = Messages.CreateOrders)]
    public IEnumerable CreatePOOrder(PXAdapter adapter)
    {
        PXGraph.InstanceCreated.AddHandler<POOrderEntry>((graph) =>
        {
            graph.GetExtension<POOrderEntryExt>().SendEmailNotification = true;
        });

        return Base.createPOOrder.Press(adapter);
    }
}

为了向请求中的请求者(员工)联系电子邮件发送电子邮件,我修改了POOrderEntryExt以从Request对象和Employee的联系电子邮件中提取信息(我离开了RQRequisitionEntryExt相同且到位):

public class POOrderEntryExt : PXGraphExtension<POOrderEntry>
{
    private bool sendEmailNotification = false;

    public bool SendEmailNotification
    {
        get
        {
            return sendEmailNotification;
        }
        set
        {
            sendEmailNotification = value;
        }
    }

    [PXOverride]
    public void Persist(Action del)
    {
        using (var ts = new PXTransactionScope())
        {
            if (del != null)
            {
                del();
            }

            if (SendEmailNotification)
            {
                bool sent = false;
                string sError = "Failed to send E-mail.";

                try
                {
                    Notification rowNotification = PXSelect<Notification,
                        Where<Notification.name, Equal<Required<Notification.name>>>>
                        .Select(Base, "PurchaseOrderNotification");

                    if (rowNotification == null)
                        throw new PXException("Notification Template was not found.");

                    var order = Base.Document.Current;
                    var requisition = (RQRequisition)PXSelect<RQRequisition,
                        Where<RQRequisition.reqNbr, Equal<Current<POOrder.rQReqNbr>>>>
                        .SelectSingleBound(Base, new object[] { order });

                    var request = (RQRequest)PXSelectJoin<RQRequest,
                        InnerJoin<RQRequisitionContent,
                          On<RQRequisitionContent.orderNbr, Equal<RQRequest.orderNbr>>>,
                        Where<RQRequisitionContent.reqNbr, Equal<POOrder.rQReqNbr>>>
                        .SelectSingleBound(Base, new object[] { order });

                    if (request.EmployeeID != null)
                    {
                        var employee = (BAccountR)PXSelectorAttribute.Select<RQRequest.employeeID>(
                              Base.Caches[typeof(RQRequest)], request);
                        if (employee != null)
                        {
                             var defEmpContact = (Contact)PXSelectorAttribute.Select<BAccountR.defContactID>(
                                 Base.Caches[typeof(BAccountR)], employee);

                            if (String.IsNullOrEmpty(defEmpContact.EMail))
                                throw new PXException("E-mail is not specified for Employee Contact.");

                            var sender = TemplateNotificationGenerator.Create(order,
                                rowNotification.NotificationID.Value);
                            sender.RefNoteID = order.NoteID;
                            sender.MailAccountId = rowNotification.NFrom.HasValue ?
                                                   rowNotification.NFrom.Value :
                                                   PX.Data.EP.MailAccountManager.DefaultMailAccountID;
                            sender.To = defEmpContact.EMail;
                            sent |= sender.Send().Any();
                        }

                        else
                            throw new PXException("Customer not found.");
                    }

                    else
                        throw new PXException("Request not found.");
                }
                catch (Exception Err)
                {
                    sent = false;
                    sError = Err.Message;
                }

                if (!sent)
                    throw new PXException(sError);
            }
            ts.Complete();
        }
    }
}

我可以在我的开发环境中获取原始代码来发送电子邮件,但我的修改后的代码只返回外部&#34;无法发送电子邮件&#34;错误。

任何人都可以帮我指出正确的方向让我的修改工作吗?

1 个答案:

答案 0 :(得分:1)

因为在Acumatica中 RQRequisition RQRequest 之间存在一对多的关系,我认为更好的方法是遍历链接到当前请求的所有请求,撰写请求者的电子邮件列表。之后,我们可以继续向所有请求者发送电子邮件,作为创建订单操作的一部分:

"hip-photo"