Acumatica Клонирует документ APQuickCheck — затем всплывающее окно

#acumatica

Вопрос:

Я работаю над пользовательским экраном на основе сетки, чтобы пользователи могли повторно выдавать устаревшие быстрые проверки (у клиента много таких устаревших проверок).

Снимок Экрана

Нажатие кнопки «Переоформить» обнаруживает последний устаревший чек в серии, который был аннулирован. Это тот, кого я хочу «клонировать».

У меня есть экземпляр графика APQuickCheckEntry с документом, который я хочу скопировать, загруженным в память:

 APQuickCheckEntry graph = PXGraph.CreateInstance<APQuickCheckEntry>();
graph.Document.Current = graph.Document.Search<APQuickCheck.refNbr>(doc.RefNbr, doc.DocType);
 

Здесь мне нужно скопировать/добавить/вставить или клонировать? Не знаю, что здесь делать. Это должно быть «глубокое копирование», как функция копирования/вставки пользовательского интерфейса. За кулисами мне также нужно установить пару других значений. Затем всплывающее диалоговое окно для пользователя, чтобы изменить/сохранить новую быструю проверку.

Я могу открыть диалоговое окно с быстрой проверкой источника, например:

 PXRedirectHelper.TryRedirect(graph.Document.Cache, graph.Document.Current, "Re-Issue Check", PXRedirectHelper.WindowMode.NewWindow);
 

но не уверен, как это клонировать и открыть новую запись (пользователь также должен иметь возможность отменить, если он не хочет сохранять новую быструю проверку).

Обновить

Я считаю, что приближаюсь к этому, изучая VoidCheckProc на графике APQuickCheckEntry.

                     APQuickCheckEntry graphCurrent = PXGraph.CreateInstance<APQuickCheckEntry>();
                graphCurrent.Document.Current = graphCurrent.Document.Search<APQuickCheck.refNbr>(doc.RefNbr, doc.DocType);

                APQuickCheckEntry graph = PXGraph.CreateInstance<APQuickCheckEntry>();

                foreach (PXResult<APQuickCheck, CurrencyInfo> res in PXSelectJoin<APQuickCheck,
                    InnerJoin<CurrencyInfo, On<CurrencyInfo.curyInfoID, Equal<APQuickCheck.curyInfoID>>>,
                    Where<APQuickCheck.docType, Equal<Required<APQuickCheck.docType>>,
                        And<APQuickCheck.refNbr, Equal<Required<APQuickCheck.refNbr>>>>>.Select(this, doc.DocType, doc.RefNbr))
                    {

                    CurrencyInfo info = PXCache<CurrencyInfo>.CreateCopy(res);
                    info.CuryInfoID = null;
                    info.IsReadOnly = false;
                    info = PXCache<CurrencyInfo>.CreateCopy(graph.currencyinfo.Insert(info));

                    APQuickCheck payment = new APQuickCheck
                    {
                        // DocType = APDocType.QuickCheck,
                        DocType = null,
                        RefNbr = null,
                        CuryInfoID = info.CuryInfoID
                    };


                    payment = PXCache<APQuickCheck>.CreateCopy(res);
                    payment.DocType = null;
                    payment.Voided = false;
                    payment.RefNbr = null;
                    payment.Status = APDocStatus.Hold;
                    payment.ExtRefNbr = null;
                        payment.Hold = true;
                        payment.OpenDoc = true;
                        payment.Released = false;
                        payment.LineCntr = 0;
                        payment.AdjCntr = 0;
                        payment.BatchNbr = null;
                        payment.AdjDate = doc.DocDate;
                        payment.AdjFinPeriodID = doc.AdjFinPeriodID;
                        payment.AdjTranPeriodID = doc.AdjTranPeriodID;
                        payment.CuryDocBal = payment.CuryOrigDocAmt   payment.CuryOrigDiscAmt;
                        payment.CuryLineTotal = 0m;
                        payment.CuryTaxTotal = 0m;
                        payment.CuryOrigWhTaxAmt = 0m;
                        payment.CuryChargeAmt = 0;
                        payment.CuryVatExemptTotal = 0;
                        payment.CuryVatTaxableTotal = 0;
                        payment.ClosedDate = null;
                        payment.ClosedFinPeriodID = null;
                        payment.ClosedTranPeriodID = null;
                        payment.Printed = false;
                        payment.PrintCheck = true; 
                        payment.Cleared = false;
                        payment.ClearDate = null;
                    


                    graph.Document.Insert(payment);


                    if (info != null)
                    {
                        CurrencyInfo b_info = PXSelect<CurrencyInfo, Where<CurrencyInfo.curyInfoID, Equal<Current<APQuickCheck.curyInfoID>>>>.Select(graphCurrent, null);
                        b_info.CuryID = info.CuryID;
                        b_info.CuryEffDate = info.CuryEffDate;
                        b_info.CuryRateTypeID = info.CuryRateTypeID;
                        b_info.CuryRate = info.CuryRate;
                        b_info.RecipRate = info.RecipRate;
                        b_info.CuryMultDiv = info.CuryMultDiv;
                        graph.currencyinfo.Update(b_info);
                    }
                }

                foreach (APTran srcTran in PXSelect<APTran, Where<APTran.tranType, Equal<Required<APTran.tranType>>, And<APTran.refNbr, Equal<Required<APTran.refNbr>>>>>.Select(graphCurrent, doc.DocType, doc.RefNbr))
                {
                    //TODO Create new APTran and explicitly fill the required fields
                    APTran tran = PXCache<APTran>.CreateCopy(srcTran);
                    tran.TranType = null;
                    tran.RefNbr = null;
                    tran.TranID = null;
                    tran.DrCr = null;
                    tran.Released = null;
                    tran.CuryInfoID = null;
                    tran.NoteID = null;

                    tran = graph.Transactions.Insert(tran);

                }

                foreach (APTaxTran tax in PXSelect<APTaxTran, Where<APTaxTran.tranType, Equal<Required<APTaxTran.tranType>>, And<APTaxTran.refNbr, Equal<Required<APTaxTran.refNbr>>>>>.Select(graphCurrent, doc.DocType, doc.RefNbr))
                {
                    APTaxTran new_artax = new APTaxTran();
                    new_artax.TaxID = tax.TaxID;

                    new_artax = graph.Taxes.Insert(new_artax);

                    if (new_artax != null)
                    {
                        new_artax = PXCache<APTaxTran>.CreateCopy(new_artax);
                        new_artax.TaxRate = tax.TaxRate;
                        new_artax.CuryTaxableAmt = tax.CuryTaxableAmt;
                        new_artax.CuryTaxAmt = tax.CuryTaxAmt;
                        new_artax.CuryTaxDiscountAmt = tax.CuryTaxDiscountAmt;
                        new_artax.CuryTaxableDiscountAmt = tax.CuryTaxableDiscountAmt;
                        new_artax = graph.Taxes.Update(new_artax);
                    }
                }

                PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);
 

However, getting this error when I try to save the new quick check: CA Error: Attempt to rewrite existing CATran

Error message

UPDATE 2

Сейчас он у меня в основном работает. Похоже, моя главная проблема заключалась в том, что я не очищал CATranID и NoteID. Я могу опубликовать свой полный код здесь, если кому-то интересно. Это было много взлома, чтобы понять, но я относительно новичок в Acumatica dev. Я нахожу существующие объекты ERP сложными, что понятно, так как многое происходит.