public static List<ProjectVM> JsonFileDeserializer()
        {
            try
            {

                string jsonFilePath = System.Configuration.ConfigurationManager.AppSettings["jsonDataFilePath"];

                StreamReader myFile = new StreamReader(jsonFilePath);
                string myString = myFile.ReadToEnd();

                myFile.Close();

                var items = JsonConvert.DeserializeObject<List<ProductsApp.Models.Json.RootObject>>(myString);
                ProjectVM proVM;
                List<ProjectVM> list = new List<ProjectVM>();
                foreach (ProductsApp.Models.Json.RootObject r in items)
                {
                    proVM = new ProjectVM();
                    proVM.id = r.id;
                    proVM.name = r.name;
                    proVM.exit_date = r.exit_date;
                    proVM.project_cost = r.project_cost;
                    proVM.burndown = r.burndown;
                    proVM.producer_name = r.producer_name;
                    proVM.hosting_platform = r.hosting_platform;
                    proVM.status = r.status;
                    proVM.progress = r.progress;
                    //ProductsApp.Models.Json.Parent p = new Models.Json.Parent();
                    //proVM.parent = new Models.Parent();
                    //proVM.parent.id = p.id;
                    //proVM.parent.name = p.name;
                    //proVM.parent

                    proVM.live_url = r.live_url;
                    proVM.development_start_date = r.development_start_date;
                    proVM.launch_date = r.launch_date;
                    proVM.TotalTimeSpent = r.TotalTimeSpent;
                    proVM.EstimatedTime = r.EstimatedTime;
                    proVM.market = r.market;

                    list.Add(proVM);
                }

                return list;

            }
            catch
            {

                return null;
            }
        }
        public string putXMLData(string destinationUrl, string requestXml, ProjectVM provm)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
                byte[] bytes;
                bytes = System.Text.Encoding.ASCII.GetBytes(requestXml);
                request.ContentType = "application/xml; encoding='utf-8'";
                request.ContentLength = bytes.Length;
                request.Method = "PUT";
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Close();
                HttpWebResponse response;
                response = (HttpWebResponse)request.GetResponse();

                int statusCode = Convert.ToInt32(response.StatusCode);

                if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created)
                {

                    SqlQueries.Project_Main_Tbl insertUpdateProjectMainTable = new SqlQueries.Project_Main_Tbl();
                    string DBResult = insertUpdateProjectMainTable.InsertOrUpdate(provm);
                    if (DBResult == "Success")
                    {
                        return "Success";
                    }
                    else
                    {
                        Logger.Debug("AddProService.putXMLData: Sql DB Insert Failed: " + DBResult);
                        return "Api Server failure";
                    }
                }
                else if (statusCode == 404)
                {
                    Logger.Debug("AddProService.putXMLData: 404 status code redmine: Redmine Unreachable/Not Responding");
                    return "Redmine Unreachable/Not Responding";
                }
                else if (statusCode == 422)
                {
                    Logger.Debug("AddProService.putXMLData: 422 status code redmine : Data Invalid");
                    return "Data Invalid";
                }
                else
                {
                    Logger.Debug("AddProService.putXMLData: Unknown Status: " + statusCode.ToString());
                    return "Failed";
                }

            }
            catch (WebException we)
            {
                Logger.Error("AddProService.putXMLData " + we.ToString());
                return "Redmine Server Not Responding";
            }
            catch (Exception ex)
            {
                Logger.Error("AddProService.putXMLData " + ex.ToString());
                return "Api Server failure";

            }
        }
        public static string CreateUpdate(Project data)
        {
            string returnResult = string.Empty;
            try
            {

                if (data == null)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Null Project Data ");
                    returnResult = "Invalid Data Recieved";
                    return returnResult;
                }
                if (data.response_put && data.id == 0)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Can't Update Project With No Id");
                    returnResult = "Can't Update Project With No Id";
                    return returnResult;
                }

                string dateFromatDB = "dd-MMM-yyyy";
                string dateFromatData = "yyyy-MM-dd";
                string exit_date = string.Empty;
                double project_cost = 0;
                string producer_name = string.Empty;
                string market = string.Empty;
                string hosting_platform = string.Empty;
                string status = string.Empty;
                double progress = 0;
                string live_url = string.Empty;
                string development_start_date = string.Empty;
                string launch_date = string.Empty;
                string post_result = string.Empty;

                for (int i = 0; i < data.custom_fields.Count; i++)
                {
                    if (data.custom_fields[i].name == "Exit Date")
                        exit_date = data.custom_fields[i].value;
                    if (data.custom_fields[i].name == "Estimates Shared with Client")
                    {
                        Double.TryParse(data.custom_fields[i].value, out project_cost);
                        project_cost = project_cost * (Convert.ToDouble((ConfigurationSettings.AppSettings["cost"])));
                    }
                    if (data.custom_fields[i].name == "Producer")
                        producer_name = data.custom_fields[i].value;
                    if (data.custom_fields[i].name == "Market")
                        market = data.custom_fields[i].value;
                    if (data.custom_fields[i].name == "Project Technology")
                        hosting_platform = data.custom_fields[i].value;
                    if (data.custom_fields[i].name == "Live URL")
                        live_url = data.custom_fields[i].value;
                    if (data.custom_fields[i].name == "Development Start Date")
                        development_start_date = data.custom_fields[i].value;
                    if (data.custom_fields[i].name == "Launch Date")
                        launch_date = data.custom_fields[i].value;
                }
                //Parse datetime for DataValidation class
                #region Date validation
                DateTime exitDate;
                DateTime launchDate;
                DateTime startDate;
                bool isExitDateValid = DateTime.TryParseExact(exit_date, dateFromatData, CultureInfo.InvariantCulture, DateTimeStyles.None, out exitDate);
                bool isDevStartDateValid = DateTime.TryParseExact(development_start_date, dateFromatData, CultureInfo.InvariantCulture, DateTimeStyles.None, out startDate);
                bool isLaunchDateValid = DateTime.TryParseExact(launch_date, dateFromatData, CultureInfo.InvariantCulture, DateTimeStyles.None, out launchDate);

                if (!string.IsNullOrWhiteSpace(exit_date) && !isExitDateValid)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Invalid Exit Date Format");
                    returnResult = "Invalid Exit Date Format";
                    return returnResult;

                }
                if (!string.IsNullOrWhiteSpace(development_start_date) && !isDevStartDateValid)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Invalid Exit Date Format");
                    returnResult = "Invalid Start Date Format";
                    return returnResult;
                }

                if (!string.IsNullOrWhiteSpace(launch_date) && !isLaunchDateValid)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Invalid Exit Date Format");
                    returnResult = "Invalid Launch Date Format";
                    return returnResult;
                }

                if ((startDate > launchDate) || (launchDate > exitDate) || (startDate > exitDate))
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Start Date > Launch Date > Exit Date");
                    returnResult = "Start Date > Launch Date > Exit Date";
                    return returnResult;
                }
                #endregion

                exit_date = exitDate.ToString(dateFromatDB);
                launch_date = launchDate.ToString(dateFromatDB);
                development_start_date = startDate.ToString(dateFromatDB);

                ProjectVM provm = new ProjectVM();
                provm.id = data.id;
                provm.name = data.name;
                provm.exit_date = exit_date;
                provm.project_cost = project_cost;
                provm.producer_name = producer_name;
                provm.market = market;
                provm.hosting_platform = hosting_platform;
                provm.status = status;
                provm.progress = progress;
                provm.live_url = live_url;
                provm.development_start_date = development_start_date;
                provm.launch_date = launch_date;

                string requestUri = System.Configuration.ConfigurationManager.AppSettings["hostUrl"] + "projects.xml?key=" + System.Configuration.ConfigurationManager.AppSettings["apiKey"];

                AddProService aps = new AddProService();

                string XmlizedString = XmlFormater(data);

                String finalString = XmlizedString.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "");

                if (data.response_put == false)
                {
                    post_result = aps.postXMLData(requestUri, finalString, provm);
                }
                else
                {
                    int idchange = data.id;
                    string requesturi_put = ConfigurationSettings.AppSettings["hostUrl"] + "projects/" + idchange + ".xml?key=" + ConfigurationSettings.AppSettings["apiKey"];
                    post_result = aps.putXMLData(requesturi_put, finalString, provm);

                }

                if (post_result == "Success")
                {
                    return "Success";
                }
                else
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Post Failed" + post_result);
                    return post_result;
                }

            }
            catch (Exception ex)
            {
                Logger.Error("CreateUpdateCampaign.CreateUpdate " + ex.ToString());
                returnResult = "Api Server Exception";
                return returnResult;
            }
        }
        public List<ProjectVM> GetAllProjects()
        {
            try
            {
                int limit = 100;
                int offset = 0;
                int totalCount = 1;

                List<ProjectVM> projectVM = new List<ProjectVM>();
                List<Project> project_list = new List<Project>();

                while (totalCount > offset)
                {
                    string url = ConfigurationSettings.AppSettings["hostUrl"] + "projects.json?limit=" + limit + "&offset=" + offset + "&key=" + ConfigurationSettings.AppSettings["apiKey"];
                    WebRequest request = WebRequest.Create(url);
                    WebResponse response = request.GetResponse();

                    var time = new Total_TimeService();
                    var issue = new IssueService();
                    string[] result;

                    using (Stream responseStream = response.GetResponseStream())
                    {
                        #region // Get single project
                        StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                        string str = reader.ReadToEnd();

                        RootObject root =
                                        (RootObject)Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(str);
                        project_list = root.projects;

                        totalCount = root.total_count;
                        offset = root.offset;
                        limit = root.limit;

                        ProjectVM proVM;
                        for (int i = 0; i < project_list.Count; i++, offset++)
                        {

                            if (project_list[i].custom_fields[2].value == "Campaign Factory" && project_list[i].status.ToString() == "1")
                            {
                                proVM = new ProjectVM();

                                proVM.id = project_list[i].id;

                                proVM.parent = project_list[i].parent;

                                proVM.TotalTimeSpent = time.GetTimePerProject(proVM.id);

                                try
                                {
                                    proVM.EstimatedTime = Convert.ToDouble(project_list[i].custom_fields[1].value);

                                }
                                catch
                                {
                                    proVM.EstimatedTime = 0.0;
                                }
                                if (project_list[i].custom_fields[9].value == "")
                                {
                                    proVM.exit_date = "NA";
                                }
                                else
                                {
                                    DateTime d = Convert.ToDateTime(project_list[i].custom_fields[9].value);
                                    proVM.exit_date = d.ToString("dd-MMM-yyyy");
                                }

                                if (project_list[i].custom_fields[10].value == "")
                                {
                                    proVM.development_start_date = "NA";
                                }
                                else
                                {
                                    DateTime d1 = Convert.ToDateTime(project_list[i].custom_fields[10].value);
                                    proVM.development_start_date = d1.ToString("dd-MMM-yyyy");
                                }

                                proVM.project_cost = (proVM.EstimatedTime) * (Convert.ToDouble((ConfigurationSettings.AppSettings["cost"])));

                                if (proVM.EstimatedTime < proVM.TotalTimeSpent)
                                    proVM.burndown = false;
                                else
                                    proVM.burndown = true;

                                try
                                {
                                    proVM.launch_date = Convert.ToDateTime(project_list[i].custom_fields[0].value).ToString("dd-MMM-yyyy");
                                }
                                catch
                                {
                                    proVM.launch_date = "";
                                }

                                proVM.producer_name = project_list[i].custom_fields[4].value;

                                proVM.market = project_list[i].custom_fields[5].value;

                                proVM.hosting_platform = project_list[i].custom_fields[3].value;
                                proVM.live_url = project_list[i].custom_fields[7].value;

                                result = issue.GetProgressPerProject(proVM.id);

                                proVM.status = result[0];
                                proVM.progress = Convert.ToDouble(result[1]);
                                proVM.name = project_list[i].name;

                                projectVM.Add(proVM);
                            }
                        }
                        #endregion
                    }

                }
                return projectVM;
            }
            catch (WebException we)
            {
                Logger.Error("ProjectService.GetAllProjects" + we.ToString());
                return null;
            }
            catch (Exception ex)
            {
                Logger.Error("ProjectService.GetAllProjects" + ex.ToString());
                return null;
            }
        }
        public static string CreateUpdate(Project data, string redmineUserId)
        {
            string returnResult = string.Empty;
            try
            {

                if (data == null)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Null Project Data ");
                    returnResult = "Invalid Data Recieved";
                    return returnResult;
                }
                if (data.response_put && data.id == 0)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Can't Update Project With No Id");
                    returnResult = "Can't Update Project With No Id";
                    return returnResult;
                }

                string dateFromatDB = "dd-MMM-yyyy";
                string dateFromatData = "yyyy-MM-dd";
                string exit_date = string.Empty;
                double project_cost = 0;
                string producer_name = string.Empty;
                string market = string.Empty;
                string hosting_platform = string.Empty;
                string status = string.Empty;
                double progress = 0;
                string live_url = string.Empty;
                string development_start_date = string.Empty;
                string launch_date = string.Empty;
                string post_result = string.Empty;
                string due_date = string.Empty;
                string image_url = string.Empty;
                string pending_with = string.Empty;
                double estimateTime = 0;
                string qa_url = string.Empty;
                if (data.custom_fields != null)
                {
                    for (int i = 0; i < data.custom_fields.Count; i++)
                    {
                        if (data.custom_fields[i].name == "Image")
                            image_url = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Exit Date")
                            exit_date = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Estimates Shared with Client")
                        {
                            Double.TryParse(data.custom_fields[i].value, out estimateTime);
                            //estimateTime=project_cost;
                            project_cost = estimateTime * (Convert.ToDouble((ConfigurationManager.AppSettings["cost"])));
                        }
                        if (data.custom_fields[i].name == "Due Date")
                            due_date = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "QA CName")
                            qa_url = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Producer")
                            producer_name = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Market")
                            market = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Project Technology")
                            hosting_platform = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Live URL")
                            live_url = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Development Start Date")
                            development_start_date = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Launch Date")
                            launch_date = data.custom_fields[i].value;
                        if (data.custom_fields[i].name == "Pending With")
                            pending_with = data.custom_fields[i].value;

                    }
                }
                //Parse datetime for DataValidation class
                #region Date validation
                DateTime exitDate;
                DateTime launchDate;
                DateTime startDate;
                DateTime dueDate;

                bool isExitDateValid = DateTime.TryParseExact(exit_date, dateFromatData, CultureInfo.InvariantCulture, DateTimeStyles.None, out exitDate);
                bool isDevStartDateValid = DateTime.TryParseExact(development_start_date, dateFromatData, CultureInfo.InvariantCulture, DateTimeStyles.None, out startDate);
                bool isLaunchDateValid = DateTime.TryParseExact(launch_date, dateFromatData, CultureInfo.InvariantCulture, DateTimeStyles.None, out launchDate);
                bool isDueDateValid = DateTime.TryParseExact(due_date, dateFromatData, CultureInfo.InvariantCulture, DateTimeStyles.None, out dueDate);

                if (!string.IsNullOrWhiteSpace(exit_date) && !isExitDateValid)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Invalid Exit Date Format");
                    returnResult = "Invalid Exit Date Format";
                    return returnResult;

                }
                if (!string.IsNullOrWhiteSpace(development_start_date) && !isDevStartDateValid)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Invalid Start Date Format");
                    returnResult = "Invalid Start Date Format";
                    return returnResult;
                }

                if (!string.IsNullOrWhiteSpace(launch_date) && !isLaunchDateValid)
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Invalid Launch Date Format");
                    returnResult = "Invalid Launch Date Format";
                    return returnResult;
                }

                if (((startDate > launchDate) || (launchDate > exitDate) || (startDate > exitDate)) && ((launch_date != "") && (exit_date != "")))
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Start Date < Launch Date < Exit Date");
                    returnResult = "Start Date < Launch Date < Exit Date";
                    return returnResult;
                }
                #endregion

                exit_date = exitDate.ToString(dateFromatDB);
                launch_date = launchDate.ToString(dateFromatDB);
                development_start_date = startDate.ToString(dateFromatDB);
                due_date = dueDate.ToString(dateFromatDB);

                ProjectVM provm = new ProjectVM();
                provm.id = data.id;
                provm.name = data.name;
                provm.exit_date = exit_date;
                provm.project_cost = project_cost;
                provm.producer_name = producer_name;
                provm.market = market;
                provm.hosting_platform = hosting_platform;
                provm.status = status;
                provm.progress = progress;
                provm.live_url = live_url;
                provm.development_start_date = development_start_date;
                provm.launch_date = launch_date;
                provm.EstimatedTime = estimateTime;
                provm.due_date = due_date;
                provm.image_url = image_url;
                provm.pending_with = pending_with;
                provm.qa_url = qa_url;

                string getUserApiKey = "Select [RedmineApiKey] from [Users] where [RedmineUserId] = '" + redmineUserId + "'";
                string UserApiKey = dc.GetSingleCell(getUserApiKey);

                string getPendingWith = "Select [pending_with] from [Project_Main] where [Project_Id] = '" + data.id + "'";
                string pendingWith = dc.GetSingleCell(getPendingWith);

                #region // Send mails on change of pending_with status
                if (data.response_put)
                {
                    if (!EmailService.EstimateToDevlopmentMovedMail(data.id.ToString(), data.name))
                        Logger.Debug("CreateUpdateCampaign.CreateUpdate: Unable to send EstimateToDevlopmentMovedMails ");

                    if ((pending_with.Trim().ToUpper() != pendingWith.Trim().ToUpper()) && !string.IsNullOrEmpty(pending_with))
                    {
                        if (!EmailService.EstimateToDevlopmentMovedMail(data.id.ToString() , data.name))
                            Logger.Debug("CreateUpdateCampaign.CreateUpdate: Unable to send EstimateToDevlopmentMovedMails ");
                    }
                }
                #endregion

                string requestUri = System.Configuration.ConfigurationManager.AppSettings["hostUrl"] + "projects.xml?key=" + UserApiKey;//System.Configuration.ConfigurationManager.AppSettings["apiKey"];

                AddProService aps = new AddProService();

                string XmlizedString = XmlFormater(data);

                String finalString = XmlizedString.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "");

                if (data.response_put == false)
                {
                    post_result = aps.postXMLData(requestUri, finalString, provm);
                }
                else
                {
                    int idchange = data.id;
                    string requesturi_put = ConfigurationManager.AppSettings["hostUrl"] + "projects/" + idchange + ".xml?key=" + UserApiKey;// ConfigurationManager.AppSettings["apiKey"];
                    post_result = aps.putXMLData(requesturi_put, finalString, provm);
                    if (post_result != "Success")
                    {
                        Logger.Debug("CreateUpdateCampaign.CreateUpdate : requestUri " + requesturi_put);
                        Logger.Debug("CreateUpdateCampaign.CreateUpdate : xml " + finalString);

                    }
                }

                if (post_result == "Success")
                {
                    return "Success";
                }
                else
                {
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : Post Failed" + post_result);
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : requestUri " + requestUri);
                    Logger.Debug("CreateUpdateCampaign.CreateUpdate : xml " + finalString);
                    return post_result;
                }

            }
            catch (Exception ex)
            {
                Logger.Error("CreateUpdateCampaign.CreateUpdate " + ex.ToString());
                returnResult = "Api Server Exception";
                return returnResult;
            }
        }
        public HttpResponseMessage UpdateProjectDynamic(ProjectVM data)
        {
            string query = @"UPDATE [dbo].[Project_Main] SET "; ;

            List<SqlParameter> list = new List<SqlParameter>();
            SqlParameter param;

            if (data.id != 0)
            {
                //return ;//cant update project without id
                query += @" [Project_Id] = @Project_Id ";
                if (data.name != null)
                {
                    query += @",[Name] = @Name";
                    param = new SqlParameter("@Name", SqlDbType.VarChar) { Value = data.name };
                    list.Add(param);
                }
                if (data.exit_date != null)
                {
                    query += @",[Exit_Date] = @Exit_Date";
                    param = new SqlParameter("@Exit_Date", SqlDbType.Date) { Value = Convert.ToDateTime(data.exit_date).ToString("yyyy-MM-dd") };
                    list.Add(param);
                }
                if (data.project_cost != 0.0)
                {
                    query += @",[Project_Cost] = @Project_Cost";
                    param = new SqlParameter("@Project_Cost", SqlDbType.Decimal) { Value = data.project_cost };
                    list.Add(param);
                }
                if (data.producer_name != null)
                {
                    query += @",[Producer_Name] = @Producer_Name";
                    param = new SqlParameter("@Producer_Name", SqlDbType.VarChar) { Value = data.producer_name };
                    list.Add(param);
                }
                if (data.market != null)
                {
                    query += @",[Market] = @Market";
                    param = new SqlParameter("@Market", SqlDbType.VarChar) { Value = data.market };
                    list.Add(param);
                }
                if (data.hosting_platform != null)
                {
                    query += @",[Hosting_Platform] = @Hosting_Platform";
                    param = new SqlParameter("@Hosting_Platform", SqlDbType.VarChar) { Value = data.hosting_platform };
                    list.Add(param);
                }
                if (data.status != null)
                {
                    query += @",[Phase_Status] = @Phase_Status";
                    param = new SqlParameter("@Phase_Status", SqlDbType.VarChar) { Value = data.status };
                    list.Add(param);
                }
                if (data.progress != 0.0)
                {
                    query += @",[Progress] = @Progress";
                    param = new SqlParameter("@Progress", SqlDbType.Decimal) { Value = data.progress };
                    list.Add(param);
                }
                if (data.live_url != null)
                {
                    query += @",[Live_Url] = @Live_Url";
                    param = new SqlParameter("@Live_Url", SqlDbType.VarChar) { Value = data.live_url };
                    list.Add(param);
                }
                if (data.development_start_date != null)
                {
                    query += @",[Development_Start_Date] = @Development_Start_Date";
                    param = new SqlParameter("@Development_Start_Date", SqlDbType.Date) { Value = Convert.ToDateTime(data.development_start_date).ToString("yyyy-MM-dd") };
                    list.Add(param);
                }
                if (data.launch_date != null)
                {
                    query += @",[Launch_Date] = @Launch_Date";
                    param = new SqlParameter("@Launch_Date", SqlDbType.Date) { Value = Convert.ToDateTime(data.launch_date).ToString("yyyy-MM-dd") };
                    list.Add(param);
                }
                if (data.due_date != null)
                {
                    query += @",[due_date] = @due_date";
                    param = new SqlParameter("@due_date", SqlDbType.Date) { Value = Convert.ToDateTime(data.due_date).ToString("yyyy-MM-dd") };
                    list.Add(param);
                }
                if (data.pending_with != null)
                {
                    query += @",[pending_with] = @pending_with";
                    param = new SqlParameter("@pending_with", SqlDbType.VarChar) { Value = data.pending_with };
                    list.Add(param);
                }
                if (data.image_url != null)
                {
                    query += @",[image_url] = @image_url";
                    param = new SqlParameter("@image_url", SqlDbType.VarChar) { Value = data.image_url };
                    list.Add(param);
                }
                query += @" WHERE [Project_Id] = @Project_Id";
                param = new SqlParameter("@Project_Id", SqlDbType.BigInt) { Value = data.id };
                list.Add(param);
            }

            SqlParameter[] sqlParam = list.ToArray();

            DatabaseConnection dc = new DatabaseConnection();
            dc.InsertUpdateDeleteDynamic(query, sqlParam);

            //int id = 0;
            //string dateFormat = "yyyy-MM-dd";
            //string exit_date = string.Empty;
            //double project_cost = 0.0;
            //string producer_name = string.Empty;
            //string market = string.Empty;
            //string hosting_platform = string.Empty;
            //string status = string.Empty;
            //double progress = 0.0;
            //string live_url = string.Empty;
            //string development_start_date = string.Empty;
            //string launch_date = string.Empty;
            //string post_result = string.Empty;
            //string due_date = string.Empty;
            //string image_url = string.Empty;
            //double estimateTime = 0.0;

            //foreach (PropertyInfo property in properties)
            //{
            //    object propertyValue = property.GetValue(data, null);
            //    Type propType = property.PropertyType;
            //    string propName = property.Name;
            //    switch (propName)
            //    {
            //        case "id":

            //            break;
            //    }

            //    //if (propType == typeof(int))
            //    //{
            //    //    Int64 interger = Convert.ToInt64(propertyValue);
            //    //    if (interger != 0)
            //    //        listOfProperties += property.Name.ToString() + ",";
            //    //}
            //    //if (propType == typeof(double))
            //    //{
            //    //    double doubleVal = Convert.ToDouble(propertyValue);
            //    //    if (doubleVal != Double.MinValue)
            //    //        listOfProperties += property.Name.ToString() + ",";
            //    //}
            //    //if (propType == typeof(string))
            //    //{
            //    //    string stringVal = Convert.ToString(propertyValue);
            //    //    if (!string.IsNullOrEmpty(stringVal))
            //    //        listOfProperties += property.Name.ToString() + ",";
            //    //}
            //}

            return Request.CreateResponse(HttpStatusCode.OK, "");//"Authentication error!! Please try again");
        }
            /// <summary>
            /// <para>Update Campaign table </para>
            /// <para>returns "Project VM Null" string if parameter is null </para>
            /// <para>returns "Project ID Invalid" string if id is null </para>
            ///  <para>returns "Success" or "Fail" string on update  </para>
            ///  <para>returns string which contains Exception: for uncaught exception</para>
            /// </summary>
            /// <param name="proVM">PojectVM class</param>
            /// <returns>string value regarding status of update</returns>
            public string UpdateCampaignDynamicParam(ProjectVM data)
            {
                try
                {
                    string query = @"UPDATE [dbo].[Project_Main] SET "; ;

                    List<SqlParameter> list = new List<SqlParameter>();
                    SqlParameter param;

                    if (data.id != 0)
                    {
                        //return ;//cant update project without id
                        query += @" [Project_Id] = @Project_Id ";
                        if (!string.IsNullOrEmpty(data.name))
                        {
                            query += @",[Name] = @Name";
                            param = new SqlParameter("@Name", SqlDbType.VarChar) { Value = data.name };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.exit_date) && Convert.ToDateTime(data.exit_date) != DateTime.MinValue)
                        {
                            query += @",[Exit_Date] = @Exit_Date";
                            param = new SqlParameter("@Exit_Date", SqlDbType.Date) { Value = Convert.ToDateTime(data.exit_date).ToString("yyyy-MM-dd") };
                            list.Add(param);
                        }
                        if (data.project_cost != 0.0)
                        {
                            query += @",[Project_Cost] = @Project_Cost";
                            param = new SqlParameter("@Project_Cost", SqlDbType.Decimal) { Value = data.project_cost };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.producer_name))
                        {
                            query += @",[Producer_Name] = @Producer_Name";
                            param = new SqlParameter("@Producer_Name", SqlDbType.VarChar) { Value = data.producer_name };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.market))
                        {
                            query += @",[Market] = @Market";
                            param = new SqlParameter("@Market", SqlDbType.VarChar) { Value = data.market };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.hosting_platform))
                        {
                            query += @",[Hosting_Platform] = @Hosting_Platform";
                            param = new SqlParameter("@Hosting_Platform", SqlDbType.VarChar) { Value = data.hosting_platform };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.status))
                        {
                            query += @",[Phase_Status] = @Phase_Status";
                            param = new SqlParameter("@Phase_Status", SqlDbType.VarChar) { Value = data.status };
                            list.Add(param);
                        }
                        if (data.progress != 0.0)
                        {
                            query += @",[Progress] = @Progress";
                            param = new SqlParameter("@Progress", SqlDbType.Decimal) { Value = data.progress };
                            list.Add(param);
                        }
                        if (data.EstimatedTime != 0.0)
                        {
                            query += @",[EstimatedTime] = @EstimatedTime";
                            param = new SqlParameter("@EstimatedTime", SqlDbType.Decimal) { Value = data.EstimatedTime };
                            list.Add(param);
                        }
                        if (data.TotalTimeSpent != 0.0)
                        {
                            query += @",[TotalTimeSpent] = @TotalTimeSpent";
                            param = new SqlParameter("@TotalTimeSpent", SqlDbType.Decimal) { Value = data.TotalTimeSpent };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.live_url))
                        {
                            query += @",[Live_Url] = @Live_Url";
                            param = new SqlParameter("@Live_Url", SqlDbType.VarChar) { Value = data.live_url };
                            list.Add(param);
                        }
                        if (data.development_start_date != null && Convert.ToDateTime(data.development_start_date) != DateTime.MinValue)
                        {
                            query += @",[Development_Start_Date] = @Development_Start_Date";
                            param = new SqlParameter("@Development_Start_Date", SqlDbType.Date) { Value = Convert.ToDateTime(data.development_start_date).ToString("yyyy-MM-dd") };
                            list.Add(param);
                        }
                        if (data.launch_date != null && Convert.ToDateTime(data.launch_date) != DateTime.MinValue)
                        {
                            query += @",[Launch_Date] = @Launch_Date";
                            param = new SqlParameter("@Launch_Date", SqlDbType.Date) { Value = Convert.ToDateTime(data.launch_date).ToString("yyyy-MM-dd") };
                            list.Add(param);
                        }
                        if (data.due_date != null && Convert.ToDateTime(data.due_date) != DateTime.MinValue)
                        {
                            query += @",[due_date] = @due_date";
                            param = new SqlParameter("@due_date", SqlDbType.Date) { Value = Convert.ToDateTime(data.due_date).ToString("yyyy-MM-dd") };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.pending_with))
                        {
                            query += @",[pending_with] = @pending_with";
                            param = new SqlParameter("@pending_with", SqlDbType.VarChar) { Value = data.pending_with };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.image_url))
                        {
                            query += @",[image_url] = @image_url";
                            param = new SqlParameter("@image_url", SqlDbType.VarChar) { Value = data.image_url };
                            list.Add(param);
                        }
                        if (!string.IsNullOrEmpty(data.qa_url))
                        {
                            query += @",[qa_url] = @qa_url";
                            param = new SqlParameter("@qa_url", SqlDbType.VarChar) { Value = data.qa_url };
                            list.Add(param);
                        }

                        query += @" WHERE [Project_Id] = @Project_Id";
                        param = new SqlParameter("@Project_Id", SqlDbType.BigInt) { Value = data.id };
                        list.Add(param);
                    }

                    SqlParameter[] sqlParam = list.ToArray();

                    DatabaseConnection dc = new DatabaseConnection();
                    if (dc.InsertUpdateDeleteDynamic(query, sqlParam))
                        return "Success";
                    else
                        return "Failed";

                }
                catch (Exception ex)
                {
                    Logger.Error("SqlQueries.Project_Main_Tbl.UpdateCampaignDynamicParam : " + ex.ToString());
                    return "Exception: " + ex.ToString();
                }
            }
            /// <summary>
            /// <para>Insert or update Project_Main table </para>
            /// <para>returns "Project VM Null" string if parameter is null </para>
            /// <para>returns "Project ID Invalid" string if id is null </para>
            ///  <para>returns "Success" or "Fail" string on insert/update  </para>
            ///  <para>returns string which contains Exception: for uncaught exception</para>
            /// </summary>
            /// <param name="proVM">PojectVM class</param>
            /// <returns>string value regarding status of insert/update</returns>
            public string InsertOrUpdate(ProjectVM proVM)
            {
                try
                {
                    ProjectVM p = new ProjectVM();
                    if (proVM == null)
                        return "Project VM Null";

                    int arrayLength = 19;
                    #region  //paramNameSql
                    string[] paramNameSql = new string[arrayLength];
                    paramNameSql[0] = "@Project_Id";
                    paramNameSql[1] = "@EstimatedTime";
                    paramNameSql[2] = "@TotalTimeSpent";
                    paramNameSql[3] = "@Burndown";
                    paramNameSql[4] = "@Development_Start_Date";
                    paramNameSql[5] = "@Exit_Date";
                    paramNameSql[6] = "@Hosting_Platform";
                    paramNameSql[7] = "@Launch_Date";
                    paramNameSql[8] = "@Live_Url";
                    paramNameSql[9] = "@Market";
                    paramNameSql[10] = "@Name";
                    paramNameSql[11] = "@Producer_Name";
                    paramNameSql[12] = "@Progress";
                    paramNameSql[13] = "@Project_Cost";
                    paramNameSql[14] = "@Phase_Status";
                    paramNameSql[15] = "@pending_with";
                    paramNameSql[16] = "@due_date";
                    paramNameSql[17] = "@image_url";
                    paramNameSql[18] = "@qa_url";
                    #endregion

                    #region // sql dbtype array
                    SqlDbType[] dbType = new SqlDbType[arrayLength];
                    dbType[0] = SqlDbType.BigInt;//"@Project_Id";
                    dbType[1] = SqlDbType.Decimal;//"@EstimatedTime";
                    dbType[2] = SqlDbType.Decimal;//"@TotalTimeSpent";
                    dbType[3] = SqlDbType.Bit;// "@Burndown";
                    dbType[4] = SqlDbType.Date;// "@Development_Start_Date";
                    dbType[5] = SqlDbType.Date;// "@Exit_Date";
                    dbType[6] = SqlDbType.VarChar;//"@Hosting_Platform";
                    dbType[7] = SqlDbType.Date; // "@Launch_Date";
                    dbType[8] = SqlDbType.VarChar;// "@Live_Url";
                    dbType[9] = SqlDbType.VarChar;// "@Market";
                    dbType[10] = SqlDbType.VarChar; //"@Name";
                    dbType[11] = SqlDbType.VarChar;// "@Producer_Name";
                    dbType[12] = SqlDbType.Decimal;// "@Progress";
                    dbType[13] = SqlDbType.Decimal;// "@Project_Cost";
                    dbType[14] = SqlDbType.VarChar;// "@Phase_Status";
                    dbType[15] = SqlDbType.VarChar;// "@pending_with";
                    dbType[16] = SqlDbType.Date;// "@due_date";
                    dbType[17] = SqlDbType.VarChar;// "@image_url";
                    dbType[18] = SqlDbType.VarChar;//@qa_url;

                    #endregion

                    #region// data values & paramValue array

                    DataValidation dv = new DataValidation();
                    dv.id = proVM.id;
                    dv.name = proVM.name;
                    dv.exit_date = proVM.exit_date;
                    dv.project_cost = proVM.project_cost;
                    dv.burndown = proVM.burndown;
                    dv.producer_name = proVM.producer_name;
                    dv.market = proVM.market;
                    dv.hosting_platform = proVM.hosting_platform;
                    dv.phase_status = proVM.status;
                    dv.progress = proVM.progress;
                    dv.live_url = proVM.live_url;
                    dv.development_start_date = proVM.development_start_date;
                    dv.launch_date = proVM.launch_date;
                    dv.TotalTimeSpent = proVM.TotalTimeSpent;
                    dv.EstimatedTime = proVM.EstimatedTime;

                    dv.pending_with = proVM.pending_with;
                    dv.due_date = proVM.due_date;
                    dv.image_url = proVM.image_url;
                    dv.qa_url = proVM.qa_url;

                    string[] paramValue = new string[arrayLength];
                    paramValue[0] = dv.id.ToString();//"@Project_Id";
                    paramValue[1] = dv.EstimatedTime.ToString();// "@EstimatedTime";
                    paramValue[2] = dv.TotalTimeSpent.ToString();// "@TotalTimeSpent";
                    paramValue[3] = dv.burndown.ToString();// "@Burndown";
                    paramValue[4] = dv.development_start_date;// "@Development_Start_Date";
                    paramValue[5] = dv.exit_date;// "@Exit_Date";
                    paramValue[6] = dv.hosting_platform;// "@Hosting_Platform";
                    paramValue[7] = dv.launch_date;// "@Launch_Date";
                    paramValue[8] = dv.live_url;// "@Live_Url";
                    paramValue[9] = dv.market;// "@Market";
                    paramValue[10] = dv.name;// "@Name";
                    paramValue[11] = dv.producer_name;// "@Producer_Name";
                    paramValue[12] = dv.progress.ToString();// "@Progress";
                    paramValue[13] = dv.project_cost.ToString();// "@Project_Cost";
                    paramValue[14] = dv.phase_status;// "@Phase_Status";
                    paramValue[15] = dv.pending_with;// "@pending_with";
                    paramValue[16] = dv.due_date; // "@due_date";
                    paramValue[17] = dv.image_url; // "@image_url";
                    paramValue[18] = dv.qa_url;//

                    if (dv.id == 74)
                    {
                        string sr = string.Empty;
                    }
                    #endregion

                    string projectTableId = dc.GetSingleCell("Select Id from Project_Main where Project_Id = '" + dv.id + "'");
                    SqlParameter[] param = dc.MySqlParamCreate(arrayLength, paramNameSql, dbType, paramValue);

                    #region //sql query insert/update
                    if (string.IsNullOrWhiteSpace(projectTableId))
                    {
                        //insert into db
                        string insertQuery = @"INSERT INTO [dbo].[Project_Main] ([Project_Id], [EstimatedTime], [TotalTimeSpent]
                   ,[Burndown], [Development_Start_Date] ,[Exit_Date] ,[Hosting_Platform] ,[Launch_Date] ,[Live_Url] ,[Market]
                   ,[Name] ,[Producer_Name] ,[Progress] ,[Project_Cost] ,[Phase_Status] ,[pending_with] ,[due_date] ,[image_url],[qa_url] )
                 VALUES
                   (@Project_Id ,@EstimatedTime ,@TotalTimeSpent ,@Burndown ,@Development_Start_Date ,@Exit_Date ,@Hosting_Platform
                   ,@Launch_Date ,@Live_Url ,@Market ,@Name ,@Producer_Name ,@Progress ,@Project_Cost ,@Phase_Status ,@pending_with ,@due_date ,@image_url , @qa_url)";

                        if (dc.InsertUpdateDelete(insertQuery, param))
                            return "Success";
                        else
                        {
                            Logger.Debug("SqlQueries.Project_Main_Tbl.InsertOrUpdate: Failed To Insert Query");
                            return "Fail";
                        }
                    }
                    else
                    {
                        //update into row db

                        string updateQuery = @"UPDATE [dbo].[Project_Main]
                                               SET [EstimatedTime] = @EstimatedTime
                                                  ,[TotalTimeSpent] = @TotalTimeSpent
                                                  ,[Burndown] = @Burndown
                                                  ,[Development_Start_Date] = @Development_Start_Date
                                                  ,[Exit_Date] = @Exit_Date
                                                  ,[Hosting_Platform] = @Hosting_Platform
                                                  ,[Launch_Date] = @Launch_Date
                                                  ,[Live_Url] = @Live_Url
                                                  ,[Market] = @Market
                                                  ,[Name] = @Name
                                                  ,[Producer_Name] = @Producer_Name
                                                  ,[Progress] = @Progress
                                                  ,[Project_Cost] = @Project_Cost
                                                  ,[Phase_Status] = @Phase_Status
                                                  ,[pending_with] = @pending_with
                                                  ,[due_date] = @due_date
                                                  ,[image_url] = @image_url
                                                  ,[qa_url] = @qa_url
                                               WHERE [Id] = '" + projectTableId + "'";

                        if (dc.InsertUpdateDelete(updateQuery, param))
                            return "Success";
                        else
                        {
                            Logger.Debug("SqlQueries.Project_Main_Tbl.InsertOrUpdate: Failed To Update Query");
                            return "Fail";
                        }
                    }
                    #endregion

                }
                catch (Exception ex)
                {
                    Logger.Error("SqlQueries.Project_Main_Tbl.InsertOrUpdate : " + ex.ToString());
                    return "Exception: " + ex.ToString();
                }
            }
        public string postXMLData(string destinationUrl, string requestXml, ProjectVM provm)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
                byte[] bytes;
                bytes = System.Text.Encoding.ASCII.GetBytes(requestXml);
                request.ContentType = "application/xml; encoding='utf-8'";
                request.ContentLength = bytes.Length;
                request.Method = "POST";
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Close();
                HttpWebResponse response;
                response = (HttpWebResponse)request.GetResponse();

                int statusCode = Convert.ToInt32(response.StatusCode);

                if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created)
                {
                    int id = 0;

                    string[] strArr = response.Headers["Location"].ToString().Split('/');
                    int.TryParse(strArr[strArr.Length - 1], out id);//getting id of created project
                    provm.id = id;
                    List<string> userRole = null;

                    SqlQueries.Project_Main_Tbl insertUpdateProjectMainTable = new SqlQueries.Project_Main_Tbl();
                    string DBResult = insertUpdateProjectMainTable.InsertOrUpdate(provm);
                    if (DBResult == "Success")
                    {
                        AddUserToProjectMembership(id.ToString(), GetUsersFromGroup(out userRole), userRole);
                        return "Success";
                    }
                    else
                    {
                        Logger.Debug("AddProService.postXMLData: Sql DB Insert Failed: " + DBResult);
                        return "Api Server failure";
                    }
                }
                else if (statusCode == 404)
                {
                    Logger.Debug("AddProService.postXMLData: 404 status code redmine: Redmine Unreachable/Not Responding");
                    return "Redmine Unreachable/Not Responding";
                }
                else if (statusCode == 422)
                {
                    Logger.Debug("AddProService.postXMLData: 422 status code redmine : Data Invalid");
                    return "Data Invalid";
                }
                else
                {
                    Logger.Debug("AddProService.postXMLData: Unknown Status: " + statusCode.ToString());
                    return "Failed";
                }

            }
            catch (WebException we)
            {
                Logger.Error("AddProService.postXMLData " + we.ToString());
                return "Redmine Server Not Responding";
            }
            catch (Exception ex)
            {
                Logger.Error("AddProService.postXMLData " + ex.ToString());
                return "Api Server failure";

            }
        }