Acumatica - 合同模板包含合同项时设置和激活合同错误

时间:2017-10-25 16:53:16

标签: acumatica

我们正试图在T300培训课程中发布发票时生成和激活合同。如果合同模板没有定义合同项,则它可以工作。但是,如果合同模板包含任何合同项,则会失败并显示错误:

CT错误:SAAS001此货币没有安装价格

启用多种货币无关紧要。 SAAS001合约项目的设置价格为0,续订价格为5000美元。非库存项目SAAS001具有默认价格......我们已为模板上的美元货币设置基准价格。

1 个答案:

答案 0 :(得分:1)

如果合同模板中有一个或多个详细信息,为了 CTBillEngine 设置并激活合同,必须先将其提交到数据库(读取, <必须在 PXTransactionScope 上调用完整的 方法。

要解决此业务案例,您必须将合同设置和激活从 Persist 移至覆盖 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);
            }
        }
    }