// GET api/WorkOrders
 public string Get()
 {
     //Get list of Work Orders
     var ctxt = new WorkOrdersAppEntities();
     return JsonConvert.SerializeObject((from a in ctxt.WorkOrders
                                         join b in ctxt.refUsers on a.SubmitUserID equals b.ID
                                         join c in ctxt.refUsers on a.LastUpdateBy equals c.ID into cc
                                         from c2 in cc.DefaultIfEmpty()
                                         select new
                                         {
                                             ID = a.ID,
                                             Site = a.refJob.refSite.SitesName,
                                             Job = a.refJob.JobNumber + " - " + a.refJob.JobName,
                                             SubmittedByUserID = a.SubmitUserID,
                                             SubmittedByFirstName = b.First_Name,
                                             SubmittedByLastName = b.Last_Name,
                                             SubmittedDate = SqlFunctions.DatePart("MONTH", a.SubmittedDate) + "/" + SqlFunctions.DatePart("DAY", a.SubmittedDate) + "/" + SqlFunctions.DatePart("YEAR", a.SubmittedDate) + " " + SqlFunctions.DatePart("HOUR", a.SubmittedDate) + ":" + +SqlFunctions.DatePart("MINUTE", a.SubmittedDate),
                                             Subject = a.Subject,
                                             Description = a.Description,
                                             Reviewed = a.Reviewed,
                                             LastUpdatedBy = a.LastUpdateBy == null ? " " : c2.First_Name + " " + c2.Last_Name,
                                             LastUpdatedDate = a.LastUpdateDate == null ? null : SqlFunctions.DatePart("MONTH", a.LastUpdateDate) + "/" + SqlFunctions.DatePart("DAY", a.LastUpdateDate) + "/" + SqlFunctions.DatePart("YEAR", a.LastUpdateDate) + " " + SqlFunctions.DatePart("HOUR", a.LastUpdateDate) + ":" + +SqlFunctions.DatePart("MINUTE", a.LastUpdateDate),
                                             RegHoursWorked = a.RegHoursWorked,
                                             OvertimeHoursWorked = a.OvertimeHoursWorked
                                         }).ToList());
 }
 // GET api/WorkOrders
 public string Get(string id)
 {
     //Gets 5 latest Work Orders which are unaccepted
     var ctxt = new WorkOrdersAppEntities();
     return JsonConvert.SerializeObject((from a in ctxt.WorkOrders
                                         join b in ctxt.refUsers on a.SubmitUserID equals b.ID
                                         join c in ctxt.ManageDevices on b.ID equals c.UserID
                                         join d in ctxt.refUsers on a.LastUpdateBy equals d.ID into dd
                                         from d2 in dd.DefaultIfEmpty()
                                         where c.DeviceGUID.Equals(id) && (a.Reviewed.HasValue ? a.Reviewed == false : a.Reviewed.Equals(null))
                                         orderby a.SubmittedDate descending
                                         select new
                                         {
                                             ID = a.ID,
                                             Job = a.refJob.JobNumber + " - " + a.refJob.JobName,
                                             SubmittedByFirstName = a.refUser.First_Name,
                                             SubmittedByLastName = a.refUser.Last_Name,
                                             SubmittedDate = SqlFunctions.DatePart("MONTH", a.SubmittedDate) + "/" + SqlFunctions.DatePart("DAY", a.SubmittedDate) + "/" + SqlFunctions.DatePart("YEAR", a.SubmittedDate) + " " + SqlFunctions.DatePart("HOUR", a.SubmittedDate) + ":" + +SqlFunctions.DatePart("MINUTE", a.SubmittedDate),
                                             Subject = a.Subject,
                                             Description = a.Description,
                                             Reviewed = a.Reviewed,
                                             LastUpdatedBy = a.LastUpdateBy == null ? " " : d2.First_Name + " " + d2.Last_Name,
                                             LastUpdatedDate = a.LastUpdateDate == null ? null : SqlFunctions.DatePart("MONTH", a.LastUpdateDate) + "/" + SqlFunctions.DatePart("DAY", a.LastUpdateDate) + "/" + SqlFunctions.DatePart("YEAR", a.LastUpdateDate) + " " + SqlFunctions.DatePart("HOUR", a.LastUpdateDate) + ":" + +SqlFunctions.DatePart("MINUTE", a.LastUpdateDate),
                                             RegHoursWorked = a.RegHoursWorked,
                                             OvertimeHoursWorked = a.OvertimeHoursWorked
                                         }).Take(5).ToList());
 }
        // POST api/ManageDevices
        public string Post([FromBody]ManageDevicesWeb md)
        {
            try
            {
                var dbCtxt = new WorkOrdersAppEntities();
                var mdFound = dbCtxt.ManageDevices.Find(md.ID);

                if (mdFound == null) //insert
                {
                    dbCtxt.ManageDevices.Add(new ManageDevice
                    {
                        UserID = md.UserID,
                        DeviceID = md.DeviceID,
                        DeviceGUID = md.GUID,
                        LastUpdateBy = md.LastUpdateBy,
                        LastUpdateDate = FormattingFunctions.ESTDateTime()
                    });
                }
                else //update
                {
                    mdFound.UserID = md.UserID;
                    mdFound.DeviceID = md.DeviceID;
                    mdFound.DeviceGUID = md.GUID;
                    mdFound.LastUpdateBy = md.LastUpdateBy;
                    mdFound.LastUpdateDate = FormattingFunctions.ESTDateTime();
                }

                dbCtxt.SaveChanges();
                return "Success";
            }
            catch
            {
                return "Failed";
            }
        }
 //GET api/Users/ID
 public string Get(string id)
 {
     try
     {
         var ctxt = new WorkOrdersAppEntities();
         return JsonConvert.SerializeObject((from a in ctxt.ManageDevices
                                             join b in ctxt.refUsers on a.UserID equals b.ID
                                             where a.DeviceGUID.Equals(id)
                                             select b.First_Name + " " + b.Last_Name).FirstOrDefault());
     }
     catch
     {
         return null;
     }
 }
        // DELETE api/WorkOrders/5
        public string Delete(int id)
        {
            try
            {
                var dbCtxt = new WorkOrdersAppEntities();

                dbCtxt.WorkOrders.Remove(dbCtxt.WorkOrders.Find(id));
                dbCtxt.SaveChanges();

                return "Success";
            }
            catch
            {
                return "Failed";
            }
        }
 // POST api/Devices
 public string Post([FromBody]ReferenceTableData refData)
 {
     //Add Devices to list from Admin Panel
     try
     {
         var dbCtxt = new WorkOrdersAppEntities();
         dbCtxt.refDevices.Add(new refDevice()
         {
             DeviceName = refData.Value,
             Enabled = true
         });
         dbCtxt.SaveChanges();
         return "Success";
     }
     catch
     {
         return "Failed";
     }
 }
        // DELETE api/Sites/5
        public string Delete(int id)
        {
            //Disable Sites from list on Admin Panel
            try
            {
                var dbCtxt = new WorkOrdersAppEntities();
                var record = dbCtxt.refSites.Find(id);

                if (record != null)
                {
                    record.Enabled = false;
                    dbCtxt.SaveChanges();
                    return "Success";
                }
                return "Failed";
            }
            catch
            {
                return "Failed";
            }
        }
        // GET api/ManageDevices
        public string Get()
        {
            //Gets list of records for Manage Devices page on Web UI
            var ctxt = new WorkOrdersAppEntities();

            return JsonConvert.SerializeObject((from a in ctxt.ManageDevices
                                                join b in ctxt.refUsers on a.UserID equals b.ID
                                                join c in ctxt.refUsers on a.LastUpdateBy equals c.ID into cc
                                                from c2 in cc.DefaultIfEmpty()
                                                select new
                                                {
                                                    ID = a.ID,
                                                    UserID = b.ID,
                                                    UserNameFirstName = b.First_Name,
                                                    UserNameLastName = b.Last_Name,
                                                    DeviceName = a.refDevice.DeviceName,
                                                    GUID = a.DeviceGUID,
                                                    LastUpdateBy = a.LastUpdateBy == null ? " " : c2.First_Name + " " + c2.Last_Name,
                                                    LastUpdateDate = a.LastUpdateDate == null ? null : SqlFunctions.DatePart("MONTH", a.LastUpdateDate) + "/" + SqlFunctions.DatePart("DAY", a.LastUpdateDate) + "/" + SqlFunctions.DatePart("YEAR", a.LastUpdateDate) + " " + SqlFunctions.DatePart("HOUR", a.LastUpdateDate) + ":" + +SqlFunctions.DatePart("MINUTE", a.LastUpdateDate)
                                                }).ToList());
        }
        // DELETE api/ManageDevices/5
        public string Delete(int id)
        {
            //Delete record from Manage Devices list on Web UI
            try
            {
                var dbCtxt = new WorkOrdersAppEntities();
                var record = dbCtxt.ManageDevices.Find(id);

                if (record != null)
                {
                    dbCtxt.ManageDevices.Remove(record);
                    dbCtxt.SaveChanges();
                    return "Success";
                }
                return "Failed";
            }
            catch
            {
                return "Failed";
            }
        }
 // POST api/Jobs
 public string Post([FromBody]RefJobData refJobData)
 {
     //Add Job to list from Admin Panel
     try
     {
         var dbCtxt = new WorkOrdersAppEntities();
         dbCtxt.refJobs.Add(new refJob()
         {
             SiteID = refJobData.SiteID,
             JobNumber = refJobData.JobNumber,
             JobName = refJobData.Value,
             Enabled = true
         });
         dbCtxt.SaveChanges();
         return "Success";
     }
     catch
     {
         return "Failed";
     }
 }
        // POST api/Users
        public string Post([FromBody]RefUsersData refData)
        {
            //Adds a User on the Admin Panel
            try
            {
                var dbCtxt = new WorkOrdersAppEntities();
                var userFound = dbCtxt.refUsers.Find(refData.ID);

                if (userFound == null)
                {

                    dbCtxt.refUsers.Add(new refUser()
                    {
                        First_Name = refData.FirstName,
                        Last_Name = refData.LastName,
                        EmailAddress = refData.EmailAddress,
                        WebUser = refData.WebUser,
                        Admin = refData.Admin,
                        Enabled = refData.Enabled
                    });
                }else
                {
                    userFound.First_Name = refData.FirstName;
                    userFound.Last_Name = refData.LastName;
                    userFound.EmailAddress = refData.EmailAddress;
                    userFound.WebUser = refData.WebUser;
                    userFound.Admin = refData.Admin;
                    userFound.Enabled = refData.Enabled;
                }
                dbCtxt.SaveChanges();
                return "Success";
            }
            catch
            {
                return "Failed";
            }
        }
        // POST api/WorkOrders
        public string Post([FromBody]WorkOrderWeb wo)
        {
            try
            {
                var dbCtxt = new WorkOrdersAppEntities();
                var woFound = dbCtxt.WorkOrders.Find(wo.ID);

                if (woFound == null) //insert
                {
                    dbCtxt.WorkOrders.Add(new WorkOrder
                    {
                        JobID = wo.JobID,
                        SubmitUserID = wo.SubmittedUserID,
                        SubmittedDate = FormattingFunctions.ESTDateTime(),
                        RegHoursWorked = wo.RegWorkHours,
                        OvertimeHoursWorked = wo.OvertimeWorkHours,
                        Subject = wo.Subject,
                        Description = wo.Description,
                        LastUpdateBy = wo.LastUpdatedBy,
                        LastUpdateDate = FormattingFunctions.ESTDateTime()
                    });
                }
                else //update
                {
                    if (wo.JobID != 0)//Denotes incoming update from app or web page
                    {
                        woFound.JobID = wo.JobID;
                        woFound.SubmitUserID = wo.SubmittedUserID;
                        woFound.RegHoursWorked = wo.RegWorkHours;
                        woFound.OvertimeHoursWorked = wo.OvertimeWorkHours;
                        woFound.Subject = wo.Subject;
                        woFound.Description = wo.Description;
                    }
                    woFound.Reviewed = wo.Reviewed;
                    woFound.LastUpdateBy = wo.LastUpdatedBy;
                    woFound.LastUpdateDate = FormattingFunctions.ESTDateTime();
                }

                dbCtxt.SaveChanges();
                return "Success";
            }
            catch(Exception ex)
            {
                return "Failed: " + ex.Message + ": " + ex.InnerException;
            }
        }