【问题标题】:Create SO via REST Web Service Endpoint does not apply Discounts通过 REST Web 服务端点创建 SO 不适用折扣
【发布时间】:2018-06-29 02:55:16
【问题描述】:

当通过 REST API 调用创建销售订单时,适用的折扣不会像通过标准 Acumatica 屏幕创建相同 SO 时那样自动应用。折扣应该适用,而不是“手动”——在通过 API 创建后运行“重新计算价格”操作将适用折扣。

是否必须在 API 调用中指定折扣代码,或者是否有某种方法可以让它们像在屏幕上一样自动应用?通过 API 接收的订单被赋予一个唯一的订单类型,因此我们可以合理地对这些特定订单类型的 SOOrderEntry 图进行自定义,当最初创建 SO 以运行“重新计算价格”但我找不到方法也可以成功触发 Base Action。

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    目前,通过 Web API 或导入方案创建或更新的所有销售订单和 AR 发票都完全跳过折扣。要通过 Web API 启动折扣计算,您应该执行以下操作:

    1. 在 SOOrderEntry BLC 扩展中创建一个隐藏操作以重新计算当前订单的折扣:

      public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
      {
          public PXAction<SOOrder> RecalculateDiscountsFromImport;
          [PXButton]
          [PXUIField(DisplayName = "Recalculate Discounts", 
              MapEnableRights = PXCacheRights.Select, 
              MapViewRights = PXCacheRights.Select, 
              Visible = false)]
          public void recalculateDiscountsFromImport()
          {
              foreach (SOLine line in Base.Transactions.Select())
              {
                  SOLine oldLine = Base.Transactions.Cache.CreateCopy(line) as SOLine;
                  DiscountEngine<SOLine>.RecalculateDiscountsLine<SOOrderDiscountDetail>(
                      Base.Transactions.Cache,
                      Base.Transactions, 
                      line, 
                      line, 
                      Base.DiscountDetails,
                      Base.Document.Current.BranchID, 
                      Base.Document.Current.CustomerLocationID,    
                      Base.Document.Current.OrderDate.Value);
                  TX.TaxAttribute.Calculate<SOLine.taxCategoryID>(
                      Base.Transactions.Cache, 
                      new PXRowUpdatedEventArgs(line, oldLine, false));
              }
              Base.Transactions.Cache.IsDirty = true;
          }
      }
      
    2. 在扩展端点中为上述自定义操作添加映射,并在销售订单创建并保存在 Acumatica 中后,通过合同 API 在单独的请求中调用该操作。

    【讨论】:

    • 在不显示 UI 的情况下从图表中自动创建 SO 时是否需要这样做?我们认为在这种情况下应用折扣的方式也存在差异。
    • 据我所知,DiscountEngine 类中存在的唯一验证是if (Graph.IsImport) return;。您的折扣代码是否可能设置为仅手动选择(在 AR209000 上选中手动选项)?
    • 谢谢鲁斯兰。我在实现这一点时遇到了几件事,它需要在循环之后使用Base.Actions.PressSave() 来保持更改。此外,虽然这在通过附加调试器的 API 调用执行时通过 GUI(属性 visible=true)完美工作,但我可以观察到对RecalculateDiscountLine 的调用已处理并对内存中的对象应用折扣,然后查看因此,尽管订单总数已更新,但行更新。尽管这可能与其他自定义有关。尽管我发现了一些似乎可以按需工作的东西。
    【解决方案2】:

    根据 RuslanDev 的回答和一些更改,这是实现的操作,然后在后续 API 调用中执行:

        public PXAction<SOOrder> RecalculateDiscountsFromImport;
        [PXButton]
        [PXUIField(DisplayName = "Recalculate Discounts",
            MapEnableRights = PXCacheRights.Select,
            MapViewRights = PXCacheRights.Select,
            Visible = false)]
        public void recalculateDiscountsFromImport()
        {
            foreach (SOLine line in Base.Transactions.Select())
            {
                DiscountEngine<SOLine>.RecalculateDiscountsLine<SOOrderDiscountDetail>(
                    Base.Transactions.Cache,
                    Base.Transactions,
                    line,
                    line,
                    Base.DiscountDetails,
                    Base.Document.Current.BranchID,
                    Base.Document.Current.CustomerLocationID,
                    Base.Document.Current.OrderDate.Value);
                Base.Transactions.Update(line);
                Base.Transactions.SetValueExt<SOLine.manualDisc>(line, false);
            }
            Base.Actions.PressSave();
        }
    

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2016-12-14
      • 2014-10-18
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多