// PUT: api/SubContractor/5
        public string Put(int id, HttpRequestMessage value)
        {
            try
            {
                Model.Sub_Contractor sub = new Model.Sub_Contractor();
                sub = (from p in db.Sub_Contractor
                       where p.Sub_Contractor_ID == id
                       select p).First();

                string  message        = HttpContext.Current.Server.UrlDecode(value.Content.ReadAsStringAsync().Result).Substring(5);
                JObject subDetails     = JObject.Parse(message);
                JArray  contactDetails = (JArray)subDetails["contact_details"];

                sub.Name    = (string)subDetails["Name"];
                sub.Address = (string)subDetails["Address"];
                sub.City    = (string)subDetails["City"];
                sub.Zip     = (string)subDetails["Zip"];
                sub.Status  = Convert.ToBoolean(Convert.ToInt32(subDetails["Status"]));
                sub.Manual_Labour_Type_ID = (int)subDetails["Manual_Labour_Type_ID"];
                sub.Province_ID           = (int)subDetails["Province_ID"];

                string errorString = "false|";
                bool   error       = false;

                if ((from t in db.Sub_Contractor
                     where t.Name == sub.Name && t.Sub_Contractor_ID != id
                     select t).Count() != 0)
                {
                    error        = true;
                    errorString += "The Sub-Contractor name entered already exists on the system. ";
                }

                if ((from t in db.Sub_Contractor
                     where (t.Address == sub.Address && t.City == sub.City && t.Zip == sub.Zip) && t.Sub_Contractor_ID != id
                     select t).Count() != 0)
                {
                    error        = true;
                    errorString += "The Sub-Contractor address entered already exists on the system. ";
                }

                if (error)
                {
                    return(errorString);
                }

                db.Sub_Contractor_Contact_Detail.RemoveRange(db.Sub_Contractor_Contact_Detail.Where(x => x.Sub_Contractor_ID == id));

                int contact_id = db.Sub_Contractor_Contact_Detail.Count() == 0 ? 1 : (from t in db.Sub_Contractor_Contact_Detail
                                                                                      orderby t.Contact_ID descending
                                                                                      select t.Contact_ID).First() + 1;

                foreach (JObject contact in contactDetails)
                {
                    Sub_Contractor_Contact_Detail ccpd = new Sub_Contractor_Contact_Detail();
                    ccpd.Contact_ID = contact_id;
                    contact_id++;

                    ccpd.Sub_Contractor_ID = id;
                    ccpd.Number            = (string)contact["Number"];
                    ccpd.Name  = (string)contact["Name"];
                    ccpd.Email = (string)contact["Email"];

                    db.Sub_Contractor_Contact_Detail.Add(ccpd);
                }

                db.SaveChanges();
                return("true|Sub-Contractor successfully updated.");
            }
            catch (Exception e)
            {
                ExceptionLog.LogException(e, "SubContractorController PUT");
                return("false|An error has occured updating the Sub-Contractor on the system.");
            }
        }
        // POST: api/SubContractor
        public string Post(HttpRequestMessage value)
        {
            try
            {
                Model.Sub_Contractor sub = new Model.Sub_Contractor();

                string  message        = HttpContext.Current.Server.UrlDecode(value.Content.ReadAsStringAsync().Result).Substring(5);
                JObject subDetails     = JObject.Parse(message);
                JArray  contactDetails = (JArray)subDetails["contact_details"];

                int key = db.Sub_Contractor.Count() == 0 ? 1 : (from t in db.Sub_Contractor
                                                                orderby t.Sub_Contractor_ID descending
                                                                select t.Sub_Contractor_ID).First() + 1;

                sub.Sub_Contractor_ID = key;
                sub.Name    = (string)subDetails["Name"];
                sub.Address = (string)subDetails["Address"];
                sub.City    = (string)subDetails["City"];
                sub.Zip     = (string)subDetails["Zip"];
                sub.Status  = Convert.ToBoolean(Convert.ToInt32(subDetails["Status"]));
                sub.Manual_Labour_Type_ID = (int)subDetails["Manual_Labour_Type_ID"];
                sub.Province_ID           = (int)subDetails["Province_ID"];

                string errorString = "false|";
                bool   error       = false;

                if ((from t in db.Sub_Contractor
                     where t.Name == sub.Name
                     select t).Count() != 0)
                {
                    error        = true;
                    errorString += "The Sub-Contractor name entered already exists on the system. ";
                }

                if ((from t in db.Sub_Contractor
                     where t.Address == sub.Address && t.City == sub.City && t.Zip == sub.Zip
                     select t).Count() != 0)
                {
                    error        = true;
                    errorString += "The Sub-Contractor address entered already exists on the system. ";
                }

                if (error)
                {
                    return(errorString);
                }

                db.Sub_Contractor.Add(sub);

                int contact_id = db.Sub_Contractor_Contact_Detail.Count() == 0 ? 1 : (from t in db.Sub_Contractor_Contact_Detail
                                                                                      orderby t.Contact_ID descending
                                                                                      select t.Contact_ID).First() + 1;

                foreach (JObject contact in contactDetails)
                {
                    Sub_Contractor_Contact_Detail ccpd = new Sub_Contractor_Contact_Detail();
                    ccpd.Contact_ID = contact_id;
                    contact_id++;

                    ccpd.Sub_Contractor_ID = key;
                    ccpd.Number            = (string)contact["Number"];
                    ccpd.Name  = (string)contact["Name"];
                    ccpd.Email = (string)contact["Email"];

                    db.Sub_Contractor_Contact_Detail.Add(ccpd);
                }

                db.SaveChanges();
                return("true|Sub-Contractor #" + key + " successfully added.");
            }
            catch (DbEntityValidationException dbEx)
            {
                // Retrieve the error messages as a list of strings.
                var errorMessages = dbEx.EntityValidationErrors
                                    .SelectMany(x => x.ValidationErrors)
                                    .Select(x => x.ErrorMessage);

                // Join the list to a single string.
                var fullErrorMessage = string.Join("; ", errorMessages);

                // Combine the original exception message with the new one.
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);

                ExceptionLog.LogException(dbEx, exceptionMessage);

                return("false|An error has occured adding the Sub-Contractor to the system.|" + exceptionMessage);
            }
            catch (Exception e)
            {
                ExceptionLog.LogException(e, "SubContractorController POST");
                return("false|An error has occured adding the Sub-Contractor to the system.");
            }
        }