public static List <FeatureRequest> GetAll()
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetObject <List <FeatureRequest> >(MethodBase.GetCurrentMethod()));
            }
            //Create an ODThread so that we can safely change the database connection settings without affecting the calling method's connection.
            ODThread odThread = new ODThread(new ODThread.WorkerDelegate((ODThread o) => {
                //Always set the thread static database connection variables to set the serviceshq db conn.
#if DEBUG
                new DataConnection().SetDbT("localhost", "bugs", "root", "", "", "", DatabaseType.MySql, true);
#else
                new DataConnection().SetDbT("server", "bugs", "root", "", "", "", DatabaseType.MySql, true);
#endif
                #region WebServiceCustomerUpdates.FeatureRequestGetList
                string command = "SELECT request.RequestId,Approval,Description,Difficulty,"
                                 + "vote.AmountPledged,IFNULL(vote.Points,0) AS points,vote.IsCritical,request.PatNum,"
                                 + "TotalCritical,TotalPledged,TotalPoints,Weight "
                                 + "FROM request "
                                 + "LEFT JOIN vote ON vote.PatNum=1486 AND vote.RequestId=request.RequestId "
                                 + "WHERE (Approval=" + POut.Int((int)ApprovalEnum.New) + " "
                                 + "OR Approval=" + POut.Int((int)ApprovalEnum.Approved) + " "
                                 + "OR Approval=" + POut.Int((int)ApprovalEnum.InProgress) + " "
                                 + "OR Approval=" + POut.Int((int)ApprovalEnum.Complete) + ") "
                                 + "ORDER BY Approval, Weight DESC, points DESC";
                DataTable raw = Db.GetTable(command);
                DataRow row;
                DataTable table = new DataTable();
                table.TableName = "Table";
                table.Columns.Add("approval");
                table.Columns.Add("Description");
                table.Columns.Add("Difficulty");
                table.Columns.Add("isMine");
                table.Columns.Add("myVotes");
                table.Columns.Add("RequestId");
                table.Columns.Add("totalVotes");
                table.Columns.Add("Weight");
                table.Columns.Add("personalVotes");
                table.Columns.Add("personalCrit");
                table.Columns.Add("personalPledged");
                double myPledge;
                bool myCritical;
                double totalPledged;
                int totalCritical;
                for (int i = 0; i < raw.Rows.Count; i++)
                {
                    row = table.NewRow();
                    row["RequestId"] = raw.Rows[i]["RequestId"].ToString();
                    //myVotes,myCritical,myPledge------------------------------------------------------
                    row["myVotes"]       = raw.Rows[i]["Points"].ToString();
                    row["personalVotes"] = raw.Rows[i]["Points"].ToString();
                    if (row["myVotes"].ToString() == "0")
                    {
                        row["myVotes"] = "";
                    }
                    myCritical = PIn.Bool(raw.Rows[i]["IsCritical"].ToString());
                    if (myCritical == true)
                    {
                        row["personalCrit"] = "1";
                        if (row["myVotes"].ToString() != "")
                        {
                            row["myVotes"] += "\r\n";
                        }
                        row["myVotes"] += "Critical";
                    }
                    else
                    {
                        row["personalCrit"] = "0";
                    }
                    myPledge = PIn.Double(raw.Rows[i]["AmountPledged"].ToString());
                    if (myPledge != 0)
                    {
                        if (row["myVotes"].ToString() != "")
                        {
                            row["myVotes"] += "\r\n";
                        }
                        row["myVotes"]        += myPledge.ToString("c0");
                        row["personalPledged"] = myPledge.ToString();
                    }
                    else
                    {
                        row["personalPledged"] = "0";
                    }
                    //TotalPoints,TotalCritical,TotalPledged-----------------------------------------------
                    row["totalVotes"] = raw.Rows[i]["TotalPoints"].ToString();
                    if (row["totalVotes"].ToString() == "0")
                    {
                        row["totalVotes"] = "";
                    }
                    totalCritical = PIn.Int(raw.Rows[i]["TotalCritical"].ToString());
                    if (totalCritical != 0)
                    {
                        if (row["totalVotes"].ToString() != "")
                        {
                            row["totalVotes"] += "\r\n";
                        }
                        row["totalVotes"] += "Critical:" + totalCritical.ToString();
                    }
                    totalPledged = PIn.Double(raw.Rows[i]["TotalPledged"].ToString());
                    if (totalPledged != 0)
                    {
                        if (row["totalVotes"].ToString() != "")
                        {
                            row["totalVotes"] += "\r\n";
                        }
                        row["totalVotes"] += totalPledged.ToString("c0");
                    }
                    //end
                    row["approval"] = ((ApprovalEnum)PIn.Int(raw.Rows[i]["Approval"].ToString())).ToString();
                    if (raw.Rows[i]["PatNum"].ToString() == "1486")
                    {
                        row["isMine"] = "X";
                    }
                    else
                    {
                        row["isMine"] = "";
                    }
                    row["Difficulty"]  = raw.Rows[i]["Difficulty"].ToString();
                    row["Description"] = raw.Rows[i]["Description"].ToString();
                    row["Weight"]      = raw.Rows[i]["Weight"].ToString();
                    table.Rows.Add(row);
                }
                o.Tag = table;
                #endregion
            }));

            odThread.AddExceptionHandler(new ODThread.ExceptionDelegate((Exception e) => { }));            //Do nothing
            odThread.Name = "featureMarkAsInProgressThread";
            odThread.Start(true);
            if (!odThread.Join(2000))              //Give this thread up to 2 seconds to complete.
            {
                return(new List <FeatureRequest>());
            }
            DataTable             tableRequests       = (DataTable)odThread.Tag;
            List <FeatureRequest> listFeatureRequests = new List <FeatureRequest>();

            foreach (DataRow dataRow in tableRequests.Rows)
            {
                FeatureRequest req = new FeatureRequest();
                #region Convert DataTable Into FeatureRequest
                long.TryParse(dataRow["RequestId"].ToString(), out req.FeatReqNum);
                string[] votes = dataRow["totalVotes"].ToString().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                string   vote  = votes.FirstOrDefault(x => !x.StartsWith("Critical") && !x.StartsWith("$"));
                if (!string.IsNullOrEmpty(vote))
                {
                    long.TryParse(vote, out req.Votes);
                }
                vote = votes.FirstOrDefault(x => x.StartsWith("Critical"));
                if (!string.IsNullOrEmpty(vote))
                {
                    long.TryParse(vote, out req.Critical);
                }
                vote = votes.FirstOrDefault(x => x.StartsWith("$"));
                if (!string.IsNullOrEmpty(vote))
                {
                    float.TryParse(vote, out req.Pledge);
                }
                req.Difficulty  = PIn.Long(dataRow["Difficulty"].ToString());
                req.Weight      = PIn.Float(dataRow["Weight"].ToString());
                req.Approval    = dataRow["Weight"].ToString();
                req.Description = dataRow["Description"].ToString();
                #endregion
                listFeatureRequests.Add(req);
            }
            return(listFeatureRequests);
        }
        ///<summary>Gets all feature request.  Optionally pass in a list of Request IDs to only get those feature requests.</summary>
        public static List <FeatureRequest> GetAll(List <long> listRequestIDs = null)
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetObject <List <FeatureRequest> >(MethodBase.GetCurrentMethod(), listRequestIDs));
            }
            DataTable table = new DataTable();

            DataAction.RunBugsHQ(() => {
                #region WebServiceCustomerUpdates.FeatureRequestGetList
                string command = "SELECT request.RequestId,Approval,Description,Difficulty,"
                                 + "vote.AmountPledged,IFNULL(vote.Points,0) AS points,vote.IsCritical,request.PatNum,"
                                 + "TotalCritical,TotalPledged,TotalPoints,Weight "
                                 + "FROM request "
                                 + "LEFT JOIN vote ON vote.PatNum=1486 AND vote.RequestId=request.RequestId "
                                 + "WHERE Approval IN (" + POut.Int((int)ApprovalEnum.New)
                                 + "," + POut.Int((int)ApprovalEnum.Approved)
                                 + "," + POut.Int((int)ApprovalEnum.InProgress)
                                 + "," + POut.Int((int)ApprovalEnum.Complete) + ") ";
                if (!listRequestIDs.IsNullOrEmpty())
                {
                    command += $"AND request.RequestId IN ({string.Join(",",listRequestIDs)}) ";
                }
                command      += "ORDER BY Approval, Weight DESC, points DESC";
                DataTable raw = Db.GetTable(command);
                DataRow row;
                table.TableName = "Table";
                table.Columns.Add("approval");
                table.Columns.Add("Description");
                table.Columns.Add("Difficulty");
                table.Columns.Add("isMine");
                table.Columns.Add("myVotes");
                table.Columns.Add("RequestId");
                table.Columns.Add("totalVotes");
                table.Columns.Add("Weight");
                table.Columns.Add("personalVotes");
                table.Columns.Add("personalCrit");
                table.Columns.Add("personalPledged");
                double myPledge;
                bool myCritical;
                double totalPledged;
                int totalCritical;
                for (int i = 0; i < raw.Rows.Count; i++)
                {
                    row = table.NewRow();
                    row["RequestId"] = raw.Rows[i]["RequestId"].ToString();
                    //myVotes,myCritical,myPledge------------------------------------------------------
                    row["myVotes"]       = raw.Rows[i]["Points"].ToString();
                    row["personalVotes"] = raw.Rows[i]["Points"].ToString();
                    if (row["myVotes"].ToString() == "0")
                    {
                        row["myVotes"] = "";
                    }
                    myCritical = PIn.Bool(raw.Rows[i]["IsCritical"].ToString());
                    if (myCritical == true)
                    {
                        row["personalCrit"] = "1";
                        if (row["myVotes"].ToString() != "")
                        {
                            row["myVotes"] += "\r\n";
                        }
                        row["myVotes"] += "Critical";
                    }
                    else
                    {
                        row["personalCrit"] = "0";
                    }
                    myPledge = PIn.Double(raw.Rows[i]["AmountPledged"].ToString());
                    if (myPledge != 0)
                    {
                        if (row["myVotes"].ToString() != "")
                        {
                            row["myVotes"] += "\r\n";
                        }
                        row["myVotes"]        += myPledge.ToString("c0");
                        row["personalPledged"] = myPledge.ToString();
                    }
                    else
                    {
                        row["personalPledged"] = "0";
                    }
                    //TotalPoints,TotalCritical,TotalPledged-----------------------------------------------
                    row["totalVotes"] = raw.Rows[i]["TotalPoints"].ToString();
                    if (row["totalVotes"].ToString() == "0")
                    {
                        row["totalVotes"] = "";
                    }
                    totalCritical = PIn.Int(raw.Rows[i]["TotalCritical"].ToString());
                    if (totalCritical != 0)
                    {
                        if (row["totalVotes"].ToString() != "")
                        {
                            row["totalVotes"] += "\r\n";
                        }
                        row["totalVotes"] += "Critical:" + totalCritical.ToString();
                    }
                    totalPledged = PIn.Double(raw.Rows[i]["TotalPledged"].ToString());
                    if (totalPledged != 0)
                    {
                        if (row["totalVotes"].ToString() != "")
                        {
                            row["totalVotes"] += "\r\n";
                        }
                        row["totalVotes"] += totalPledged.ToString("c0");
                    }
                    //end
                    row["approval"] = ((ApprovalEnum)PIn.Int(raw.Rows[i]["Approval"].ToString())).ToString();
                    if (raw.Rows[i]["PatNum"].ToString() == "1486")
                    {
                        row["isMine"] = "X";
                    }
                    else
                    {
                        row["isMine"] = "";
                    }
                    row["Difficulty"]  = raw.Rows[i]["Difficulty"].ToString();
                    row["Description"] = raw.Rows[i]["Description"].ToString();
                    row["Weight"]      = raw.Rows[i]["Weight"].ToString();
                    table.Rows.Add(row);
                }
                #endregion
            }, false);
            List <FeatureRequest> listFeatureRequests = new List <FeatureRequest>();
            foreach (DataRow dataRow in table.Rows)
            {
                FeatureRequest req = new FeatureRequest();
                #region Convert DataTable Into FeatureRequest
                long.TryParse(dataRow["RequestId"].ToString(), out req.FeatReqNum);
                string[] votes = dataRow["totalVotes"].ToString().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                string   vote  = votes.FirstOrDefault(x => !x.StartsWith("Critical") && !x.StartsWith("$"));
                if (!string.IsNullOrEmpty(vote))
                {
                    long.TryParse(vote, out req.Votes);
                }
                vote = votes.FirstOrDefault(x => x.StartsWith("Critical"));
                if (!string.IsNullOrEmpty(vote))
                {
                    long.TryParse(vote, out req.Critical);
                }
                vote = votes.FirstOrDefault(x => x.StartsWith("$"));
                if (!string.IsNullOrEmpty(vote))
                {
                    float.TryParse(vote, out req.Pledge);
                }
                req.Difficulty  = PIn.Long(dataRow["Difficulty"].ToString());
                req.Weight      = PIn.Float(dataRow["Weight"].ToString());
                req.Approval    = dataRow["Weight"].ToString();
                req.Description = dataRow["Description"].ToString();
                #endregion
                listFeatureRequests.Add(req);
            }
            return(listFeatureRequests);
        }