// OPERATIONS
        /// <summary>
        ///	Returns the maximum minutes that a user can spend in a branch without overflowing the maximum money constraint in any group
        /// </summary>
        /// <param name="groupId"></param>
        /// <param name="minutes"></param>
        /// <returns>bool</returns>
        public bool GetBranchMaxAvailableMinutes(long groupId, ref long minutes, 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 lGrpAccMinutes = 0;
                long lGrpMaxMinutes = 0;

                minutes = 999999999;

                while (treeGroup != null)
                {
                    if (isComputeEx1)
                    {
                        lGrpAccMinutes = treeGroup.GetRealAccMinutes();
                    }
                    else
                    {
                        lGrpAccMinutes = treeGroup.GetAccMinutes();
                    }

                    lGrpMaxMinutes = treeGroup.GetMaxMinutes();

                    if (lGrpMaxMinutes != GlobalDefs.DEF_UNDEFINED_VALUE)
                    {
                        minutes = Math.Min(lGrpMaxMinutes - lGrpAccMinutes, minutes);
                    }

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

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

            return(fnResult);
        }