/// <summary>
        /// Returns the warning status of the project based on it's current status and expiration details.
        /// </summary>
        public static ProjectWarningInfo GetProjectWarningStatus(int projectStatusCodeId, bool hasUserOptIn, DateTime?expirationDate)
        {
            string statusCode    = Utils.GetCodeByCodeId(projectStatusCodeId).Value;
            double remainingDays = (statusCode == "ACTIVE" || expirationDate == null) ? -1 : (expirationDate.Value.Date - Utils.Today).TotalDays;

            ProjectWarningStatus warningStatus = ProjectWarningStatus.NoWarning;

            switch (statusCode)
            {
            case "FREETRIAL":
                if (remainingDays <= 7 && !hasUserOptIn)
                {
                    warningStatus = ProjectWarningStatus.FreeTrialGrace;
                }
                break;

            case "GRACEPERIOD":
                warningStatus = ProjectWarningStatus.GracePeriod;
                break;

            case "PAYMENTFAILED":
                warningStatus = ProjectWarningStatus.PaymentFailed;
                break;

            case "SUSPENDED":
                warningStatus = ProjectWarningStatus.Suspended;
                break;

            case "CLOSED":
                warningStatus = ProjectWarningStatus.Closed;
                break;

            default:
                break;
            }

            return(new ProjectWarningInfo(warningStatus, (int)Math.Round(remainingDays, 0)));
        }
 public ProjectWarningInfo(ProjectWarningStatus warningStatus, int daysToExpiration)
 {
     WarningStatus    = warningStatus;
     DaysToExpiration = daysToExpiration;
 }