//TODO: Handle exceptions;
        private ZCRMRole GetZCRMRole(JObject roleDetails)
        {
            ZCRMRole role = ZCRMRole.GetInstance((long)roleDetails["id"], (string)roleDetails["name"]);

            role.Label     = (string)roleDetails["display_label"];
            role.AdminUser = (bool)roleDetails["admin_user"];
            ZCRMRole reportingTo = null;

            if (roleDetails["reporting_to"].Type != JTokenType.Null)
            {
                JObject reportingToObject = (JObject)roleDetails["reporting_to"];
                reportingTo = ZCRMRole.GetInstance((long)reportingToObject["id"], (string)reportingToObject["name"]);
            }
            role.ReportingTo = reportingTo;
            return(role);
        }
        //TODO: Handle exceptions;
        private ZCRMRole GetZCRMRole(JObject roleDetails)
        {
            ZCRMRole role = ZCRMRole.GetInstance((long)roleDetails["id"], (string)roleDetails["name"]);

            role.Label = (string)roleDetails["display_label"];
            if (roleDetails.ContainsKey("forecast_manager") && roleDetails["forecast_manager"].Type != JTokenType.Null)
            {
                JObject  forecast_manager = (JObject)roleDetails["forecast_manager"];
                ZCRMUser user             = ZCRMUser.GetInstance();
                if (forecast_manager.ContainsKey("id") && forecast_manager["id"].Type != JTokenType.Null)
                {
                    user.Id = (long)forecast_manager["id"];
                }
                if (forecast_manager.ContainsKey("name") && forecast_manager["name"].Type != JTokenType.Null)
                {
                    user.FullName = (string)forecast_manager["name"];
                }
                role.ForecastManager = user;
            }
            if (roleDetails.ContainsKey("share_with_peers") && roleDetails["share_with_peers"].Type != JTokenType.Null)
            {
                role.ShareWithPeers = (bool)roleDetails["share_with_peers"];
            }
            if (roleDetails.ContainsKey("description") && roleDetails["description"].Type != JTokenType.Null)
            {
                role.Description = (string)roleDetails["description"];
            }
            ZCRMRole reportingTo = null;

            if (roleDetails.ContainsKey("reporting_to") && roleDetails["reporting_to"].Type != JTokenType.Null)
            {
                JObject reportingToObject = (JObject)roleDetails["reporting_to"];
                reportingTo = ZCRMRole.GetInstance((long)reportingToObject["id"], (string)reportingToObject["name"]);
            }
            role.ReportingTo = reportingTo;
            role.AdminUser   = (bool)roleDetails["admin_user"];
            return(role);
        }
        private JObject ConstructJSONForUser(ZCRMUser user)
        {
            JObject  userJSON = new JObject();
            ZCRMRole role     = user.Role;

            if (role != null)
            {
                userJSON["role"] = role.Id.ToString();
            }
            ZCRMProfile profile = user.Profile;

            if (profile != null)
            {
                userJSON["profile"] = profile.Id.ToString();
            }
            if (user.Country != null)
            {
                userJSON["country"] = user.Country;
            }
            if (user.City != null)
            {
                userJSON["city"] = user.City;
            }
            if (user.Signature != null)
            {
                userJSON["signature"] = user.Signature;
            }
            if (user.NameFormat != null)
            {
                userJSON["name_format"] = user.NameFormat;
            }
            if (user.Language != null)
            {
                userJSON["language"] = user.Language;
            }
            if (user.Locale != null)
            {
                userJSON["locale"] = user.Locale;
            }
            if (user.DefaultTabGroup != null)
            {
                userJSON["default_tab_group"] = user.DefaultTabGroup;
            }
            if (user.Street != null)
            {
                userJSON["street"] = user.Street;
            }
            if (user.Alias != null)
            {
                userJSON["alias"] = user.Alias;
            }
            if (user.State != null)
            {
                userJSON["state"] = user.State;
            }
            if (user.CountryLocale != null)
            {
                userJSON["country_locale"] = user.CountryLocale;
            }
            if (user.Fax != null)
            {
                userJSON["fax"] = user.Fax;
            }
            if (user.FirstName != null)
            {
                userJSON["first_name"] = user.FirstName;
            }
            if (user.EmailId != null)
            {
                userJSON["email"] = user.EmailId;
            }
            if (user.Zip != null)
            {
                userJSON["zip"] = user.Zip;
            }
            if (user.DecimalSeparator != null)
            {
                userJSON["decimal_separator"] = user.DecimalSeparator;
            }
            if (user.Website != null)
            {
                userJSON["website"] = user.Website;
            }
            if (user.TimeFormat != null)
            {
                userJSON["time_format"] = user.TimeFormat;
            }
            if (user.Mobile != null)
            {
                userJSON["mobile"] = user.Mobile;
            }
            if (user.LastName != null)
            {
                userJSON["last_name"] = user.LastName;
            }
            if (user.TimeZone != null)
            {
                userJSON["time_zone"] = user.TimeZone;
            }
            if (user.Phone != null)
            {
                userJSON["phone"] = user.Phone;
            }
            if (user.DateOfBirth != null)
            {
                userJSON["dob"] = user.DateOfBirth;
            }
            if (user.DateFormat != null)
            {
                userJSON["date_format"] = user.DateFormat;
            }
            if (user.Status != null)
            {
                userJSON["status"] = user.Status;
            }

            foreach (KeyValuePair <string, object> token in user.Data)
            {
                userJSON[token.Key] = JToken.FromObject(token.Value);
            }

            userJSON["personal_account"] = user.IsPersonalAccount;
            return(userJSON);
        }
        private ZCRMUser GetZCRMUser(JObject userDetails)
        {
            ZCRMUser user = ZCRMUser.GetInstance((long)userDetails["id"], (string)userDetails["full_name"]);

            user.EmailId   = (string)userDetails["email"];
            user.FirstName = (string)userDetails["first_name"];
            user.LastName  = (string)userDetails["last_name"];
            user.Language  = (string)userDetails["language"];
            user.Mobile    = (string)userDetails["mobile"];
            user.Status    = (string)userDetails["status"];
            user.ZuId      = (long?)userDetails["zuid"];
            if (userDetails.ContainsKey("profile"))
            {
                JObject     profileObject = (JObject)userDetails["profile"];
                ZCRMProfile profile       = ZCRMProfile.GetInstance((long)profileObject["id"], (string)profileObject["name"]);
                user.Profile = profile;
            }
            if (userDetails.ContainsKey("role"))
            {
                JObject  roleObject = (JObject)userDetails["role"];
                ZCRMRole role       = ZCRMRole.GetInstance((long)roleObject["id"], (string)roleObject["name"]);
                user.Role = role;
            }

            user.Alias            = (string)userDetails["alias"];
            user.City             = (string)userDetails["city"];
            user.Confirm          = (bool)userDetails["confirm"];
            user.CountryLocale    = (string)userDetails["country_locale"];
            user.DateFormat       = (string)userDetails["date_format"];
            user.TimeFormat       = (string)userDetails["time_format"];
            user.DateOfBirth      = (string)userDetails["dob"];
            user.Country          = (string)userDetails["country"];
            user.Fax              = (string)userDetails["fax"];
            user.Locale           = (string)userDetails["locale"];
            user.NameFormat       = (string)userDetails["name_format"];
            user.Website          = (string)userDetails["website"];
            user.TimeZone         = (string)userDetails["time_zone"];
            user.Street           = (string)userDetails["street"];
            user.State            = (string)userDetails["state"];
            user.MicrosoftAppUser = (bool)userDetails["microsoft"];
            user.Phone            = (string)userDetails["phone"];
            if (userDetails.ContainsKey("created_by") && userDetails["created_by"].Type != JTokenType.Null)
            {
                JObject  createdByObject = (JObject)userDetails["created_by"];
                ZCRMUser createdUser     = ZCRMUser.GetInstance((long)createdByObject["id"], (string)createdByObject["name"]);
                user.CreatedBy   = createdUser;
                user.CreatedTime = CommonUtil.RemoveEscaping((string)JsonConvert.SerializeObject(userDetails["created_time"]));
            }
            if (userDetails.ContainsKey("Modified_By") && userDetails["Modified_By"].Type != JTokenType.Null)
            {
                JObject  modifiedByObject = (JObject)userDetails["Modified_By"];
                ZCRMUser modifiedByUser   = ZCRMUser.GetInstance((long)modifiedByObject["id"], (string)modifiedByObject["name"]);
                user.ModifiedBy   = modifiedByUser;
                user.ModifiedTime = CommonUtil.RemoveEscaping((string)JsonConvert.SerializeObject(userDetails["Modified_Time"]));
            }
            if (userDetails.ContainsKey("Reporting_To") && userDetails["Reporting_To"].Type != JTokenType.Null)
            {
                JObject  reportingToObject = (JObject)userDetails["Reporting_To"];
                ZCRMUser reportingTo       = ZCRMUser.GetInstance((long)reportingToObject["id"], (string)reportingToObject["name"]);
                user.ReportingTo = reportingTo;
            }
            if (userDetails.ContainsKey("signature") && userDetails["signature"].Type != JTokenType.Null)
            {
                user.Signature = (string)userDetails["signature"];
            }
            if (userDetails.ContainsKey("number") && userDetails["number"].Type != JTokenType.Null)
            {
                user.Number = (int)userDetails["number"];
            }
            if (userDetails.ContainsKey("offset") && userDetails["offset"].Type != JTokenType.Null)
            {
                user.OffSet = (long)userDetails["offset"];
            }
            if (userDetails.ContainsKey("customize_info") && userDetails["customize_info"].Type != JTokenType.Null)
            {
                user.CustomizeInfo = GetZCRMUserCustomizeInfo((JObject)userDetails["customize_info"]);
            }
            if (userDetails.ContainsKey("personal_account") && userDetails["personal_account"].Type != JTokenType.Null)
            {
                user.IsPersonalAccount = (bool)userDetails["personal_account"];
            }
            if (userDetails.ContainsKey("default_tab_group") && userDetails["default_tab_group"].Type != JTokenType.Null)
            {
                user.DefaultTabGroup = (string)userDetails["default_tab_group"];
            }
            if (userDetails.ContainsKey("theme") && userDetails["theme"].Type != JTokenType.Null)
            {
                user.Theme = GetZCRMUserTheme((JObject)userDetails["theme"]);
            }
            if (userDetails.ContainsKey("zip") && userDetails["zip"].Type != JTokenType.Null)
            {
                user.Zip = (string)userDetails["zip"];
            }
            if (userDetails.ContainsKey("decimal_separator") && userDetails["decimal_separator"].Type != JTokenType.Null)
            {
                user.DecimalSeparator = (string)userDetails["decimal_separator"];
            }
            if (userDetails.ContainsKey("territories") && userDetails["territories"].Type != JTokenType.Null)
            {
                JArray jsonArray = (JArray)userDetails["territories"];
                List <ZCRMTerritory> territories = new List <ZCRMTerritory>();
                foreach (JObject territory in jsonArray)
                {
                    territories.Add(GetZCRMTerritory(territory));
                }
                user.Territories = territories;
            }
            if (userDetails.ContainsKey("Isonline") && userDetails["Isonline"].Type != JTokenType.Null)
            {
                user.IsOnline = (bool)userDetails["Isonline"];
            }
            if (userDetails.ContainsKey("Currency") && userDetails["Currency"].Type != JTokenType.Null)
            {
                user.Currency = (string)userDetails["Currency"];
            }
            foreach (KeyValuePair <string, JToken> token in userDetails)
            {
                if (!ZCRMUser.defaultKeys.Contains(token.Key))
                {
                    user.SetFieldValue(token.Key, (object)token.Value);
                }
            }
            return(user);
        }
        private ZCRMUser GetZCRMUser(JObject userDetails)
        {
            ZCRMUser user = ZCRMUser.GetInstance((long)userDetails["id"], (string)userDetails["full_name"]);

            user.EmailId   = (string)userDetails["email"];
            user.FirstName = (string)userDetails["first_name"];
            user.LastName  = (string)userDetails["last_name"];
            user.Language  = (string)userDetails["language"];
            user.Mobile    = (string)userDetails["mobile"];
            user.Status    = (string)userDetails["status"];
            user.ZuId      = (long?)userDetails["zuid"];
            if (userDetails.ContainsKey("profile"))
            {
                JObject     profileObject = (JObject)userDetails["profile"];
                ZCRMProfile profile       = ZCRMProfile.GetInstance((long)profileObject["id"], (string)profileObject["name"]);
                user.Profile = profile;
            }
            if (userDetails.ContainsKey("role"))
            {
                JObject  roleObject = (JObject)userDetails["role"];
                ZCRMRole role       = ZCRMRole.GetInstance((long)roleObject["id"], (string)roleObject["name"]);
                user.Role = role;
            }

            user.Alias         = (string)userDetails["alias"];
            user.City          = (string)userDetails["city"];
            user.Confirm       = (bool)userDetails["confirm"];
            user.CountryLocale = (string)userDetails["country_locale"];
            user.DateFormat    = (string)userDetails["date_format"];
            user.TimeFormat    = (string)userDetails["time_format"];
            user.DateOfBirth   = (string)userDetails["dob"];
            user.Country       = (string)userDetails["country"];
            user.Fax           = (string)userDetails["fax"];
            user.Locale        = (string)userDetails["locale"];
            user.NameFormat    = (string)userDetails["name_format"];
            user.Website       = (string)userDetails["website"];
            user.TimeZone      = (string)userDetails["time_zone"];
            user.Street        = (string)userDetails["street"];
            user.State         = (string)userDetails["state"];
            if (userDetails.ContainsKey("created_by") && userDetails["created_by"].Type != JTokenType.Null)
            {
                JObject  createdByObject = (JObject)userDetails["created_by"];
                ZCRMUser createdUser     = ZCRMUser.GetInstance((long)createdByObject["id"], (string)createdByObject["name"]);
                user.CreatedBy   = createdUser;
                user.CreatedTime = (string)userDetails["created_time"];
            }
            if (userDetails.ContainsKey("Modified_By") && userDetails["Modified_By"].Type != JTokenType.Null)
            {
                JObject  modifiedByObject = (JObject)userDetails["Modified_By"];
                ZCRMUser modifiedByUser   = ZCRMUser.GetInstance((long)modifiedByObject["id"], (string)modifiedByObject["name"]);
                user.ModifiedBy   = modifiedByUser;
                user.ModifiedTime = (string)userDetails["Modified_Time"];
            }
            if (userDetails.ContainsKey("Reporting_To") && userDetails["Reporting_To"].Type != JTokenType.Null)
            {
                JObject  reportingToObject = (JObject)userDetails["Reporting_To"];
                ZCRMUser reportingTo       = ZCRMUser.GetInstance((long)reportingToObject["id"], (string)reportingToObject["name"]);
                user.ReportingTo = reportingTo;
            }

            return(user);
        }