首页 > 解决方案 > 如何修改流程准备发票

问题描述

我一直在图表上寻找一种方法来实现这一点,但我不知道从哪里开始。我需要有人告诉我通过什么事件我可以实现所陈述的内容。

  1. 在任何给定的一天或一周内,可能会有多次交付或取货的材料成为引用不同项目的客户的销售订单。客户 A 一周内有 5 个销售订单,地点、条款和税区相同,并且没有采购订单/客户订单编号。2 个用于项目 1234,3 个用于项目 5678。当我们处理“准备发票”时,我们需要创建 2 个发票,1 个用于项目 1234,1 个用于项目 5678。当前逻辑将为所有 5 个订单创建一张发票。

提前致谢。

在此处输入图像描述

标签: acumaticaacumatica-kb

解决方案


如果你做一些调查,你会注意到一些事情。

首先Orders是网格数据视图。

在此处输入图像描述

浏览该屏幕的源代码,您会注意到该数据视图有一个数据视图委托orders,其调用如下:

    public virtual IEnumerable orders()
    {
        // ... //
        PXSelectBase<SOOrder> cmd = GetSelectCommand(filter);
        // ... //
    }

该方法GetSelectCommand(filter)定义如下:

    protected virtual PXSelectBase<SOOrder> GetSelectCommand(SOOrderFilter filter)
    {
        PXSelectBase<SOOrder> cmd;

        switch (filter.Action)
        {
            // ... //
            case WellKnownActions.SOOrderScreen.PrepareInvoice:
                cmd = BuildCommandPrepareInvoice();
                break;
            // ... //
        }

        return cmd;
    }

该方法BuildCommandPrepareInvoice()是这样定义的,它进一步过滤了返回的订单:

    protected virtual PXSelectBase<SOOrder> BuildCommandPrepareInvoice()
    {
        var cmd =
            new PXSelectJoinGroupBy<SOOrder,
                    InnerJoin<SOOrderType, On<SOOrderType.orderType, Equal<SOOrder.orderType>, And<SOOrderType.aRDocType, NotEqual<ARDocType.noUpdate>>>,
                    LeftJoin<Carrier, On<SOOrder.shipVia, Equal<Carrier.carrierID>>,
                    LeftJoin<SOOrderShipment, On<SOOrderShipment.orderType, Equal<SOOrder.orderType>, And<SOOrderShipment.orderNbr, Equal<SOOrder.orderNbr>>>,
                    LeftJoinSingleTable<ARInvoice, On<ARInvoice.docType, Equal<SOOrderShipment.invoiceType>, And<ARInvoice.refNbr, Equal<SOOrderShipment.invoiceNbr>>>,
                    LeftJoinSingleTable<Customer, On<SOOrder.customerID, Equal<Customer.bAccountID>>>>>>>,
                Where<SOOrder.hold, Equal<boolFalse>, And<SOOrder.cancelled, Equal<boolFalse>,
                    And<Where<Customer.bAccountID, IsNull, Or<Match<Customer, Current<AccessInfo.userName>>>>>>>,
                Aggregate<
                    GroupBy<SOOrder.orderType,
                    GroupBy<SOOrder.orderNbr,
                    GroupBy<SOOrder.approved>>>>>(this);

        if (PXAccess.FeatureInstalled<FeaturesSet.inventory>())
        {
            cmd.WhereAnd<
                Where<Sub<Sub<Sub<SOOrder.shipmentCntr,
                                                                SOOrder.openShipmentCntr>,
                                                                SOOrder.billedCntr>,
                                                                SOOrder.releasedCntr>, Greater<short0>,
                    Or2<Where<SOOrder.orderQty, Equal<decimal0>,
                                And<SOOrder.curyUnbilledMiscTot, Greater<decimal0>>>,
                    Or<Where<SOOrderType.requireShipping, Equal<boolFalse>, And<ARInvoice.refNbr, IsNull>>>>>>();
        }
        else
        {
            cmd.WhereAnd<
                Where<SOOrder.curyUnbilledMiscTot, Greater<decimal0>, And<SOOrderShipment.shipmentNbr, IsNull,
                    Or<Where<SOOrderType.requireShipping, Equal<boolFalse>, And<ARInvoice.refNbr, IsNull>>>>>>();
        }

        return cmd;
    }

我相信您可以使用定义您要查找的内容的方法来覆盖此方法,特别是最后一部分。

我意识到这不是一个可行的答案;但是,我希望它会有所帮助。


推荐阅读