protected virtual void BuildParentList(GLTranReclHist tran, List <GLTranReclHist> result)
        {
            if (tran.ParentTran == null)
            {
                return;
            }

            tran.ParentTran.SortOrder = tran.SortOrder - 1;
            tran.ParentTran.IsParent  = tran.ReclassType == ReclassType.Split;

            BuildParentList(tran.ParentTran, result);

            result.Add(tran.ParentTran);

            var reverseTran = (GLTranReclHist)TransView.Cache.Locate(new GLTranReclHist(tran.ParentTran.Module, tran.ParentTran.BatchNbr, tran.ParentTran.LineNbr - 1));

            if (reverseTran == null)
            {
                return;
            }

            reverseTran.SortOrder = tran.ParentTran.SortOrder;
            reverseTran.IsSplited = tran.ParentTran?.IsSplited == true;
            result.Add(reverseTran);
        }
        protected virtual int?SortChildTrans(GLTranReclHist tran, bool hasSplitsInChain)
        {
            bool isNotIncluded = (tran.ReclassRemainingAmt ?? 0m) == 0m && hasSplitsInChain && !IsCurrentTran(tran);

            var reverseTran = (GLTranReclHist)TransView.Cache.Locate(new GLTranReclHist(tran.Module, tran.BatchNbr, tran.LineNbr - 1));

            if (reverseTran != null)
            {
                reverseTran.SortOrder  = tran.SortOrder;
                reverseTran.ParentTran = tran.ParentTran;
                reverseTran.IsSplited  = tran.IsSplited;
            }
            else if (tran.ParentTran != null)
            {
                throw new PXException(Messages.ReversingEntryHasNotBeenFound);
            }

            if (!tran.ChildTrans.Any())
            {
                return(tran.SortOrder);
            }

            int? lastSortOrder  = tran.SortOrder;
            bool splitsDetected = false;

            foreach (GLTranReclHist lowerTran in tran.ChildTrans.Where(m => m.ReclassType == ReclassType.Split))
            {
                lastSortOrder      += 1;
                lowerTran.SortOrder = lastSortOrder;
                splitsDetected     |= lowerTran.ReclassType == ReclassType.Split;
                lastSortOrder       = SortChildTrans(lowerTran, hasSplitsInChain);
            }

            foreach (GLTranReclHist lowerTran in tran.ChildTrans.Where(m => m.ReclassType == ReclassType.Common))
            {
                lastSortOrder      += 1;
                lowerTran.SortOrder = lastSortOrder;
                splitsDetected     |= lowerTran.ReclassType == ReclassType.Split;
                lastSortOrder       = SortChildTrans(lowerTran, hasSplitsInChain);
            }

            if (isNotIncluded)
            {
                tran.SortOrder        = null;
                reverseTran.SortOrder = null;
            }

            tran.IsParent = splitsDetected;

            return(lastSortOrder);
        }
        protected bool IsCurrentTran(GLTranReclHist tran)
        {
            var currentTran = CurrentReclassTranView.Cache.Inserted.Select <GLTran>().SingleOrDefault();

            return(tran.Module == currentTran.Module && tran.BatchNbr == currentTran.BatchNbr && tran.LineNbr == currentTran.LineNbr);
        }