/// <summary>
        ///	Returns the maximum money that a user can spend in a branch without overflowing the maximum money constraint in any group
        /// </summary>
        /// <param name="tree"></param>
        /// <param name="groupId"></param>
        /// <param name="money"></param>
        /// <returns>bool</returns>
        public bool GetBranchMaxAvailableMoney(long groupId, ref long money, bool isComputeEx1 = false)
        {
            trace?.Write(TraceLevel.Debug, "CM1GroupTree::GetBranchMaxAvailableMoney");
            bool fnResult = true;

            try
            {
                CM1Group treeGroup = GetGroupFromGrpId(groupId);
                if (treeGroup == null)
                {
                    throw new ArgumentNullException(nameof(groupId), "Could not obtain group of current operation");
                }

                long lGrpAccMoney = 0;
                long lGrpMaxMoney = 0;

                money = 999999999;

                while (treeGroup != null)
                {
                    lGrpAccMoney = (isComputeEx1) ? treeGroup.GetRealAccMoney() : treeGroup.GetAccMoney();
                    lGrpMaxMoney = treeGroup.GetMaxMoney();

                    if (lGrpMaxMoney != GlobalDefs.DEF_UNDEFINED_VALUE)
                    {
                        money = Math.Min(lGrpMaxMoney - lGrpAccMoney, money);
                    }

                    treeGroup = GetGroupParent(treeGroup.GetGrpId());
                }

                trace?.Write(TraceLevel.Info, $"Money left for branch of group {groupId}: {money}");
            }
            catch (Exception error)
            {
                trace?.Write(TraceLevel.Error, error.ToLogString());
                fnResult = false;
            }

            return(fnResult);
        }