2017-10-25 26 views
0

T300トレーニングクラスのように請求書を発行したときに契約を生成して有効にしようとしています。契約テンプレートに契約項目が定義されていない場合に機能します。しかし、契約テンプレートは任意の契約項目がある場合、それはエラーで失敗します。Acumatica - 契約テンプレートに契約項目がある場合の契約エラーを設定して有効にする

CTエラー:SAAS001は、マルチ通貨が有効かどうかは問題ではありません、この通貨で

を一切セットアップ価格を持っていません。 SAAS001契約項目の設定価格は0で、更新価格は$ 5000です。非在庫品目SAAS001にはデフォルト価格が設定されています。テンプレートのUSD通貨の基本価格が設定されています。

+0

ARReleasePro cess –

答えて

1

一つ以上の詳細は契約テンプレートである場合は、CTBillEngineを設定し、契約を有効にするためには、それは、完全方法がなければなりません、読んで(データベースにコミット最初でなければなりませんPXTransactionScopeで呼び出されます)。

このビジネスケースに対処するために、あなたはが上書きReleaseDocProcにを永続から契約のセットアップおよび活性化を移動する必要があり方法:

using PX.Data; 
using PX.Objects.CS; 
using PX.Objects.CT; 
using PX.Objects.GL; 
using System; 
using System.Collections.Generic; 

namespace PX.Objects.AR 
{ 
    public class ARReleaseProcess_Extension : PXGraphExtension<ARReleaseProcess> 
    { 
     public bool SetupContract = false; 
     private List<Contract> setupContracts = new List<Contract>(); 

     public delegate List<ARRegister> ReleaseDocProcDel(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, ReleaseDocProcDel del) 
     { 
      var result = del(je, ardoc, pmBatchList, onreleasecomplete); 

      CTBillEngine engine = PXGraph.CreateInstance<CTBillEngine>(); 
      if (SetupContract) 
      { 
       foreach (var contract in setupContracts) 
       { 
        engine.SetupAndActivate(contract.ContractID, contract.ActivationDate); 
       } 
      } 

      return result; 
     } 

     public delegate void PersistDelegate(); 
     [PXOverride] 
     public void Persist(PersistDelegate baseMethod) 
     { 
      ARRegister invoice = Base.ARDocument.Current; 
      if (SetupContract) 
      { 
       ContractMaint contractMaint = PXGraph.CreateInstance<ContractMaint>(); 
       foreach (ARTran tran in PXSelect<ARTran, 
        Where<ARTran.tranType, Equal<Required<ARInvoice.docType>>, 
         And<ARTran.refNbr, Equal<Required<ARInvoice.refNbr>>>>, 
        OrderBy<Asc<ARTran.tranType, Asc<ARTran.refNbr, 
          Asc<ARTran.lineNbr>>>>> 
        .Select(Base, invoice.DocType, invoice.RefNbr)) 
       { 
        Contract contract = CreateActivateContract(contractMaint, 
         invoice.DocDate, invoice.CustomerID, invoice.CustomerLocationID); 
        setupContracts.Add(contract); 
       } 
      } 
      baseMethod(); 
     } 

     private Contract CreateActivateContract(ContractMaint contractMaint, 
      DateTime? invoiceDate, int? customerID, int? customerLocationID) 
     { 
      contractMaint.Clear(); 

      Contract contract = (Contract)contractMaint.Contracts.Cache.CreateInstance(); 
      contract = contractMaint.Contracts.Insert(contract); 

      Contract template = PXSelect<Contract, 
       Where<Contract.isTemplate, Equal<boolTrue>, 
        And<Contract.contractCD, Equal<Required<Contract.contractCD>>>>> 
       .Select(Base, "SIMCARD"); 
      if (template == null) 
      { 
       throw new PXException("The SIMCARD contract template was not found."); 
      } 

      contract.TemplateID = template.ContractID; 
      contract.CustomerID = customerID; 
      contract = contractMaint.Contracts.Update(contract); 
      contract.LocationID = customerLocationID; 
      contract.StartDate = invoiceDate; 
      contract.ActivationDate = invoiceDate; 
      contract = contractMaint.Contracts.Update(contract); 

      contractMaint.Save.Press(); 
      return contract; 
     } 
    } 
} 

するために作成した元のカスタマイズを維持することを確認しますSOInvoiceEntry BLC:

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

    namespace PX.Objects.SO 
    { 
     public class SOInvoiceEntry_Extension : PXGraphExtension<SOInvoiceEntry> 
     { 
      public delegate IEnumerable ReleaseDelegate(PXAdapter adapter); 
      [PXOverride] 
      public IEnumerable Release(PXAdapter adapter, ReleaseDelegate baseMethod) 
      { 
       PXGraph.InstanceCreated.AddHandler<ARReleaseProcess>((graph) => 
       { 
        // Setting the SetupContract flag to create, set up, and activate 
        // the contracts at the SOInvoice release 
        graph.GetExtension<ARReleaseProcess_Extension>().SetupContract = true; 
       }); 

       return baseMethod(adapter); 
      } 
     } 
    } 
+0

ContractItemテーブルにInventoryIDが見つかった場合、ARTranとContractItemの間の結合を追加しようとしました。 –

+0

は、BQLが正しいと思われます。 –

+0

foreach(ARTranはPXSelect >、 ここで、>、 そして>>>、 OrderBy >>>>> –

関連する問題