public JsonResult CreateInstaller([FromBody] Models.Installer installer)
        {
            using (var context = new Data.ApplicationDbContext()) {
                String      authUserId = User.GetClaim(OpenIdConnectConstants.Claims.Subject);
                Models.User authUser   = context.Users.AsNoTracking().FirstOrDefault(u => u.Id.ToString().Equals(authUserId));
                if (authUser == null)
                {
                    return(Json(new { status_code = 2, status = "User '" + authUserId + "' does not exist" }));
                }

                if (!Helpers.PermissionChecker.CanAddSite(authUser))
                {
                    return(Json(new { status_code = 1, status = "User '" + authUser.UserName + "' does not have permission to create installers" }));
                }

                if (installer.FName.Length == 0 && installer.LName.Length == 0)
                {
                    return(Json(new { status_code = 4, status = "Installer must have at least a first or last name" }));
                }
                else if (installer.Phone.Length == 0)
                {
                    return(Json(new { status_code = 4, status = "Installer must have a phone number" }));
                }

                context.Installers.Add(installer);
                context.SaveChanges();

                Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateInstaller, authUser.Id, installer.Id,
                                            String.Format("{0} (id: {1}) created installer '{2}' (id: {3})", authUser.UserName, authUser.Id, installer.FName + " " + installer.LName, installer.Id));

                return(Json(new { status_code = 0, installer }));
            }
        }
        public JsonResult GetInstaller(int installerId)
        {
            using (var context = new Data.ApplicationDbContext()) {
                String      authUserId = User.GetClaim(OpenIdConnectConstants.Claims.Subject);
                Models.User authUser   = context.Users.AsNoTracking().FirstOrDefault(u => u.Id.ToString().Equals(authUserId));
                if (authUser == null)
                {
                    return(Json(new { status_code = 2, status = "User '" + authUserId + "' does not exist" }));
                }

                if (!Helpers.PermissionChecker.CanAddSite(authUser))
                {
                    return(Json(new { status_code = 1, status = "User '" + authUser.UserName + "' does not have permission to view installers" }));
                }

                Models.Installer installer = context.Installers.AsNoTracking().FirstOrDefault(i => i.Id == installerId);
                if (installer == null)
                {
                    return(Json(new { status_code = 3, status = "Installer '" + installerId + "' does not exist" }));
                }

                return(Json(new { status_code = 0, installer }));
            }
        }
 public JsonResult UpdateInstaller([FromBody] Models.Installer installer)
 {
     return(Json(new { status_code = -1, status = "Not yet implemented" }));
 }
        public JsonResult Create([FromBody] Models.ActivationForm form, [RequiredFromQuery] int type)
        {
            if (type == 0)
            {
                // Create new site & activation
                using (var context = new Data.ApplicationDbContext()) {
                    // Verify user exists & has permission
                    String      authUserId = User.GetClaim(OpenIdConnectConstants.Claims.Subject);
                    Models.User authUser   = context.Users.AsNoTracking().FirstOrDefault(u => u.Id.ToString().Equals(authUserId));
                    if (authUser == null)
                    {
                        return(Json(new { status_code = 2, status = "User '" + authUserId + "' does not exist" }));
                    }

                    if (!Helpers.PermissionChecker.CanAddSite(authUser))
                    {
                        return(Json(new { status_code = 3, status = "User '" + authUser.UserName + "' does not have permission to activate sites" }));
                    }

                    // Used to check if installer object and/or manager object need to be added to database
                    bool InstallerCreated = false, ManagerCreated = false, OwnerCreated = false;

                    // #1 - Check installer //
                    // if Id is 0, create new installer. Otherwise, verify installer exists
                    if (form.SiteInstaller.Id != 0)
                    {
                        Models.Installer installer = context.Installers.AsNoTracking().FirstOrDefault(i => i.Id == form.SiteInstaller.Id);
                        if (installer == null)
                        {
                            return(Json(new { status_code = 5, status = "Installer '" + form.SiteInstaller.Id + "' does not exist" }));
                        }
                    }
                    else
                    {
                        if (form.SiteInstaller.FName.Length == 0 && form.SiteInstaller.LName.Length == 0)
                        {
                            return(Json(new { status_code = 5, status = "Installer must have at least a first or last name" }));
                        }
                        else if (form.SiteInstaller.Phone.Length == 0)
                        {
                            return(Json(new { status_code = 5, status = "Installer must have a phone number" }));
                        }
                        context.Installers.Add(form.SiteInstaller);
                        InstallerCreated = true;
                    }

                    // #2 - Check manager //
                    // Same logic as installer (0 = new, otherwise use existing)
                    if (form.SiteManager.Id != 0)
                    {
                        Models.Manager manager = context.Managers.AsNoTracking().FirstOrDefault(m => m.Id == form.SiteManager.Id);
                        if (manager == null)
                        {
                            return(Json(new { status_code = 5, status = "Manager '" + form.SiteManager.Id + "' does not exist" }));
                        }
                    }
                    else
                    {
                        if (form.SiteManager.FName.Length == 0 && form.SiteManager.LName.Length == 0)
                        {
                            return(Json(new { status_code = 5, status = "Manager must have at least a first or last name" }));
                        }
                        else if (form.SiteManager.Phone.Length == 0)
                        {
                            return(Json(new { status_code = 5, status = "Manager must have a phone number" }));
                        }
                        context.Managers.Add(form.SiteManager);
                        ManagerCreated = true;
                    }

                    // #3 - Verify new owner info //
                    if (form.NewOwner.Id == 0)
                    {
                        if (context.Users.AsNoTracking().FirstOrDefault(u => form.NewOwner.UserName != null && u.UserName != null && form.NewOwner.UserName.ToLower().Equals(u.UserName.ToLower())) != null)
                        {
                            return(Json(new { status_code = 3, status = "User '" + form.NewOwner.UserName + "' already exists" }));
                        }

                        if (String.IsNullOrWhiteSpace(form.NewOwner.UserName) || String.IsNullOrWhiteSpace(form.NewOwner.Password))
                        {
                            return(Json(new { status_code = 4, status = "Invalid user creation body" }));
                        }

                        form.NewOwner.Active        = true;
                        form.NewOwner.Level         = 2;                 // force user to be owner
                        form.NewOwner.UserLastLogin = new DateTime(2000, 1, 1);
                        OwnerCreated = true;
                    }
                    else
                    {
                        form.NewOwner = context.Users.AsNoTracking().FirstOrDefault(u => u.Id == form.NewOwner.Id);
                        if (form.NewOwner == null)
                        {
                            return(Json(new { status_code = 2, status = "Owner '" + form.NewOwner.Id + "' does not exist" }));
                        }
                    }

                    if (!form.PreApproved && (String.IsNullOrWhiteSpace(form.NewOwner.UserName) || String.IsNullOrWhiteSpace(form.NewOwner.Password)))
                    {
                        return(Json(new { status_code = 5, status = "Invalid user creation body" }));
                    }

                    // #4 - Create new site //
                    // note: if site is pre-approved, new site will not be created

                    // Verify site info
                    Models.System system = context.Systems.AsNoTracking().FirstOrDefault(s => s.Id == form.NewSite.SystemId);
                    if (system == null)
                    {
                        return(Json(new { status_code = 5, status = "Invalid system given", id = form.NewSite.SystemId }));
                    }

                    Models.User distrib = context.Users.AsNoTracking().FirstOrDefault(u => u.Id == form.NewSite.SiteDistributor);
                    if (distrib == null)
                    {
                        return(Json(new { status_code = 5, status = "Invalid distributor given" }));
                    }

                    if (form.NewSite.SiteName.Length == 0)
                    {
                        return(Json(new { status_code = 5, status = "No site name given" }));
                    }
                    if (!form.NewSite.SiteInstallDate.HasValue)
                    {
                        return(Json(new { status_code = 5, status = "Invalid install date" }));
                    }
                    if (form.NewSite.SiteAddress.Length == 0 || form.NewSite.SiteCity.Length == 0 || form.NewSite.SiteState.Length == 0 ||
                        form.NewSite.SiteCountry.Length == 0 || form.NewSite.SiteZip.Length < 5 || form.NewSite.SiteZip.Length > 10)
                    {
                        return(Json(new { status_code = 5, status = "Invalid site address given" }));
                    }
                    if (form.NewSite.SiteOwnerName.Length == 0)
                    {
                        return(Json(new { status_code = 5, status = "No owner name given" }));
                    }
                    if (form.NewSite.SiteOwnerEmail.Length == 0 && form.NewSite.SiteOwnerPhone.Length == 0)
                    {
                        return(Json(new { status_code = 5, status = "Need at least one way to contact owner (none given)" }));
                    }

                    // Generate site info if not pre-approved
                    if (!form.PreApproved)
                    {
                        List <Models.Site> sites = context.Sites.AsNoTracking().OrderByDescending(s => s.SiteNumber).ToList();
                        int maxSiteNum           = -1;
                        foreach (Models.Site s in sites)
                        {
                            if (s.SiteNumber.HasValue)
                            {
                                maxSiteNum = (int)s.SiteNumber;
                                break;
                            }
                        }

                        form.NewSite.SiteNumber   = ++maxSiteNum;
                        form.NewSite.SiteActive   = true;
                        form.NewSite.SiteEnabled  = true;
                        form.NewSite.SiteLastPing = new DateTime(2000, 1, 1);
                        form.NewSite.SiteLastIp   = "127.0.0.1";
                    }

                    // #5 - New activation row //
                    // Need to save these to database to generate any IDs (in case new installer/manager is used, and for new site/owner) if site isn't pre-approved
                    if (!form.PreApproved)
                    {
                        if (form.NewOwner.Id == 0)
                        {
                            context.Users.Add(form.NewOwner);
                        }
                        context.Sites.Add(form.NewSite);
                        context.SaveChanges();
                    }

                    // Verify that distributor has access to site
                    // (because users can create distributors when activating site)
                    Models.Permission permission = context.Permissions.FirstOrDefault(p => form.NewSite.SiteDistributor.HasValue &&
                                                                                      p.UserId == form.NewSite.SiteDistributor && p.SiteId == form.NewSite.SiteId);
                    if (permission == null)
                    {
                        permission = new Models.Permission {
                            UserId = (int)form.NewSite.SiteDistributor,
                            SiteId = form.NewSite.SiteId,
                            Access = 1,
                        };

                        context.Permissions.Add(permission);
                    }
                    else if (permission.Access.HasValue && (int)permission.Access != 1)
                    {
                        permission.Access = 1;
                    }

                    // Set some default values for newly created sites
                    form.NewSite.LastCommunityDrop = new DateTime(1970, 1, 1, 0, 0, 0);
                    form.NewSite.LastGrandDrop     = new DateTime(1970, 1, 1, 0, 0, 0);

                    // Activation form needs to save what was submitted, not reflect current information
                    // therefore, activation table essentially acts as a merged version of multiple tables
                    form.ActivationInfo.SiteId           = form.NewSite.SiteId;
                    form.ActivationInfo.RoomName         = form.NewSite.SiteName;
                    form.ActivationInfo.SystemId         = system.Id;
                    form.ActivationInfo.StorePhone       = form.NewSite.StorePhone;
                    form.ActivationInfo.InstallerId      = form.SiteInstaller.Id;
                    form.ActivationInfo.InstallerFName   = form.SiteInstaller.FName;
                    form.ActivationInfo.InstallerLName   = form.SiteInstaller.LName;
                    form.ActivationInfo.InstallerEmail   = form.SiteInstaller.Email;
                    form.ActivationInfo.InstallerPhone   = form.SiteInstaller.Phone;
                    form.ActivationInfo.ManagerId        = form.SiteManager.Id;
                    form.ActivationInfo.ManagerFName     = form.SiteManager.FName;
                    form.ActivationInfo.ManagerLName     = form.SiteManager.LName;
                    form.ActivationInfo.ManagerEmail     = form.SiteManager.Email;
                    form.ActivationInfo.ManagerPhone     = form.SiteManager.Phone;
                    form.ActivationInfo.OwnerId          = form.NewOwner.Id;
                    form.ActivationInfo.OwnerFName       = form.NewOwner.FName;
                    form.ActivationInfo.OwnerLName       = form.NewOwner.LName;
                    form.ActivationInfo.OwnerEmail       = form.NewOwner.Email;
                    form.ActivationInfo.OwnerPhone       = form.NewOwner.Phone;
                    form.ActivationInfo.OwnerUserName    = form.NewOwner.UserName;
                    form.ActivationInfo.DistributorId    = distrib.Id;
                    form.ActivationInfo.DistributorFName = distrib.FName;
                    form.ActivationInfo.DistributorLName = distrib.LName;
                    form.ActivationInfo.SiteAddress      = form.NewSite.SiteAddress;
                    form.ActivationInfo.SiteCity         = form.NewSite.SiteCity;
                    form.ActivationInfo.SiteState        = form.NewSite.SiteState;
                    form.ActivationInfo.SiteCountry      = form.NewSite.SiteCountry;
                    form.ActivationInfo.SiteZip          = form.NewSite.SiteZip;
                    form.ActivationInfo.SubmissionDate   = DateTime.UtcNow;

                    // #6 - Create permission for new site
                    if (!form.PreApproved)
                    {
                        Models.Permission newSitePermission = new Models.Permission {
                            Access = 1,
                            SiteId = form.NewSite.SiteId,
                            UserId = form.NewOwner.Id
                        };

                        context.Permissions.Add(newSitePermission);
                    }

                    // Since these objects aren't being created through their respective controllers, need to manually log them
                    if (InstallerCreated)
                    {
                        Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateInstaller, authUser.Id, form.SiteInstaller.Id,
                                                    String.Format("{0} (id: {1}) created installer '{2}' (id: {3})", authUser.UserName, authUser.Id,
                                                                  form.SiteInstaller.FName + " " + form.SiteInstaller.LName, form.SiteInstaller.Id));
                    }
                    if (ManagerCreated)
                    {
                        Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateManager, authUser.Id, form.SiteManager.Id,
                                                    String.Format("{0} (id: {1}) created manager '{2}' (id: {3})", authUser.UserName, authUser.Id,
                                                                  form.SiteManager.FName + " " + form.SiteManager.LName, form.SiteManager.Id));
                    }
                    if (!form.PreApproved)
                    {
                        Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateUser, authUser.Id, form.NewOwner.Id,
                                                    String.Format("{0} (id: {1}) created user {2} (id: {3})", authUser.UserName, authUser.Id,
                                                                  form.NewOwner.UserName, form.NewOwner.Id));
                        Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateSite, authUser.Id, form.NewSite.SiteId,
                                                    String.Format("{0} (id: {1}) created site '{2}' (site number: {3})", authUser.UserName, authUser.Id,
                                                                  form.NewSite.SiteName, form.NewSite.SiteNumber));
                    }

                    // #7 - Save all final info to database (all information has been verified by this point) //
                    context.Activations.Add(form.ActivationInfo);
                    context.SaveChanges();

                    // #8 - Logging and alerting

                    // log
                    Helpers.LogHelper.LogAction(Models.Log.ActionType.ActivateSite, authUser.Id, form.NewSite.SiteId,
                                                String.Format("{0} (id: {1}) activated site '{2}' (site number: {3})", authUser.UserName, authUser.Id, form.NewSite.SiteName, form.NewSite.SiteNumber));

                    // send to Zapier to handle proper notification
                    var json = new {
                        SiteId = form.NewSite.SiteNumber,
                        form.NewSite.SiteName,
                        SystemName = system.Name,
                        form.ActivationInfo.SystemId,
                        form.NewSite.StorePhone,
                        form.SiteInstaller,
                        form.SiteManager,
                        NewOwner        = new { form.NewOwner.Active, form.NewOwner.Email, form.NewOwner.FName, form.NewOwner.LName, form.NewOwner.Phone, form.NewOwner.UserName },
                        SiteDistributor = new { distrib.Active, distrib.Email, distrib.FName, distrib.LName, distrib.Phone, distrib.UserName },
                        form.NewSite.SiteAddress,
                        form.NewSite.SiteCity,
                        form.NewSite.SiteState,
                        form.NewSite.SiteCountry,
                        form.NewSite.SiteZip,
                        SubmissionDate = form.ActivationInfo.SubmissionDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
                        form.ActivationInfo.ActivationNotes
                    };
                    Helpers.LogHelper.NotifyAction(Models.Log.ActionType.ActivateSite, json);
                }
                return(Json(new { status_code = 0, form.NewSite.SiteId }));
            }
            else if (type == 1)
            {
                // Just create new activation. Site was already approved through old report portal.
                using (var context = new Data.ApplicationDbContext()) {
                    // Verify user exists & has permission
                    String      authUserId = User.GetClaim(OpenIdConnectConstants.Claims.Subject);
                    Models.User authUser   = context.Users.AsNoTracking().FirstOrDefault(u => u.Id.ToString().Equals(authUserId));
                    if (authUser == null)
                    {
                        return(Json(new { status_code = 2, status = "User '" + authUserId + "' does not exist" }));
                    }

                    if (!Helpers.PermissionChecker.CanAddSite(authUser))
                    {
                        return(Json(new { status_code = 1, status = "User '" + authUser.UserName + "' does not have permission to activate sites" }));
                    }

                    bool InstallerCreated = false, ManagerCreated = false, OwnerCreated = false;

                    // #1 - Check installer //
                    // if Id is 0, create new installer. Otherwise, verify installer exists
                    if (form.SiteInstaller.Id != 0)
                    {
                        Models.Installer installer = context.Installers.AsNoTracking().FirstOrDefault(i => i.Id == form.SiteInstaller.Id);
                        if (installer == null)
                        {
                            return(Json(new { status_code = 2, status = "Installer '" + form.SiteInstaller.Id + "' does not exist" }));
                        }
                    }
                    else
                    {
                        if (form.SiteInstaller.FName.Length == 0 && form.SiteInstaller.LName.Length == 0)
                        {
                            return(Json(new { status_code = 4, status = "Installer must have at least a first or last name" }));
                        }
                        else if (form.SiteInstaller.Phone.Length == 0)
                        {
                            return(Json(new { status_code = 4, status = "Installer must have a phone number" }));
                        }
                        context.Installers.Add(form.SiteInstaller);
                        InstallerCreated = true;
                    }

                    // #2 - Check manager //
                    // Same logic as installer (0 = new, otherwise use existing)
                    if (form.SiteManager.Id != 0)
                    {
                        Models.Manager manager = context.Managers.AsNoTracking().FirstOrDefault(m => m.Id == form.SiteManager.Id);
                        if (manager == null)
                        {
                            return(Json(new { status_code = 2, status = "Manager '" + form.SiteManager.Id + "' does not exist" }));
                        }
                    }
                    else
                    {
                        if (form.SiteManager.FName.Length == 0 && form.SiteManager.LName.Length == 0)
                        {
                            return(Json(new { status_code = 4, status = "Manager must have at least a first or last name" }));
                        }
                        else if (form.SiteManager.Phone.Length == 0)
                        {
                            return(Json(new { status_code = 4, status = "Manager must have a phone number" }));
                        }
                        context.Managers.Add(form.SiteManager);
                        ManagerCreated = true;
                    }

                    // #3 - Verify new owner info //
                    if (form.NewOwner.Id == 0)
                    {
                        if (context.Users.AsNoTracking().FirstOrDefault(u => form.NewOwner.UserName != null && u.UserName != null && form.NewOwner.UserName.ToLower().Equals(u.UserName.ToLower())) != null)
                        {
                            return(Json(new { status_code = 3, status = "User '" + form.NewOwner.UserName + "' already exists" }));
                        }

                        if (String.IsNullOrWhiteSpace(form.NewOwner.UserName) || String.IsNullOrWhiteSpace(form.NewOwner.Password))
                        {
                            return(Json(new { status_code = 4, status = "Invalid user creation body" }));
                        }

                        form.NewOwner.Active        = true;
                        form.NewOwner.Level         = 2;                 // force user to be owner
                        form.NewOwner.UserLastLogin = new DateTime(2000, 1, 1);
                        OwnerCreated = true;
                    }
                    else
                    {
                        form.NewOwner = context.Users.AsNoTracking().FirstOrDefault(u => u.Id == form.NewOwner.Id);
                        if (form.NewOwner == null)
                        {
                            return(Json(new { status_code = 2, status = "Owner '" + form.NewOwner.Id + "' does not exist" }));
                        }
                    }

                    // #4 - Create new site //

                    // Verify site info
                    Models.System system = context.Systems.AsNoTracking().FirstOrDefault(s => s.Id == form.NewSite.SystemId);
                    if (system == null)
                    {
                        return(Json(new { status_code = 4, status = "Invalid system given", id = form.NewSite.SystemId }));
                    }

                    Models.User distrib = context.Users.AsNoTracking().FirstOrDefault(u => u.Id == form.NewSite.SiteDistributor);
                    if (distrib == null)
                    {
                        return(Json(new { status_code = 4, status = "Invalid distributor given" }));
                    }

                    if (form.NewSite.SiteName.Length == 0)
                    {
                        return(Json(new { status_code = 4, status = "No site name given" }));
                    }
                    if (!form.NewSite.SiteInstallDate.HasValue || form.NewSite.SiteInstallDate > DateTime.UtcNow)
                    {
                        return(Json(new { status_code = 4, status = "Invalid install date" }));
                    }
                    if (form.NewSite.SiteAddress.Length == 0 || form.NewSite.SiteCity.Length == 0 || form.NewSite.SiteState.Length == 0 ||
                        form.NewSite.SiteCountry.Length == 0 || form.NewSite.SiteZip.Length < 5 || form.NewSite.SiteZip.Length > 10)
                    {
                        return(Json(new { status_code = 4, status = "Invalid site address given" }));
                    }
                    if (form.NewSite.SiteOwnerName.Length == 0)
                    {
                        return(Json(new { status_code = 4, status = "No owner name given" }));
                    }
                    if (form.NewSite.SiteOwnerEmail.Length == 0 && form.NewSite.SiteOwnerPhone.Length == 0)
                    {
                        return(Json(new { status_code = 4, status = "Need at least one way to contact owner (none given)" }));
                    }

                    // Copy over any modified info if site is pre-approved
                    if (form.PreApproved)
                    {
                        Models.Site currentSite = context.Sites.FirstOrDefault(s => s.SiteId == form.NewSite.SiteId);
                        currentSite.Copy(form.NewSite, false);
                        context.SaveChanges();
                    }

                    // #5 - New activation row //
                    // Need to save these to database to generate any IDs (in case new installer/manager is used, and for new site/owner)
                    if (form.NewOwner.Id == 0)
                    {
                        context.Users.Add(form.NewOwner);
                        context.SaveChanges();
                    }

                    // Activation form needs to save what was submitted, not reflect current information
                    // therefore, activation table essentially acts as a merged version of multiple tables
                    form.ActivationInfo.SiteId           = form.NewSite.SiteId;
                    form.ActivationInfo.RoomName         = form.NewSite.SiteName;
                    form.ActivationInfo.SystemId         = system.Id;
                    form.ActivationInfo.StorePhone       = form.NewSite.StorePhone;
                    form.ActivationInfo.InstallerId      = form.SiteInstaller.Id;
                    form.ActivationInfo.InstallerFName   = form.SiteInstaller.FName;
                    form.ActivationInfo.InstallerLName   = form.SiteInstaller.LName;
                    form.ActivationInfo.InstallerEmail   = form.SiteInstaller.Email;
                    form.ActivationInfo.InstallerPhone   = form.SiteInstaller.Phone;
                    form.ActivationInfo.ManagerId        = form.SiteManager.Id;
                    form.ActivationInfo.ManagerFName     = form.SiteManager.FName;
                    form.ActivationInfo.ManagerLName     = form.SiteManager.LName;
                    form.ActivationInfo.ManagerEmail     = form.SiteManager.Email;
                    form.ActivationInfo.ManagerPhone     = form.SiteManager.Phone;
                    form.ActivationInfo.OwnerId          = form.NewOwner.Id;
                    form.ActivationInfo.OwnerFName       = form.NewOwner.FName;
                    form.ActivationInfo.OwnerLName       = form.NewOwner.LName;
                    form.ActivationInfo.OwnerEmail       = form.NewOwner.Email;
                    form.ActivationInfo.OwnerPhone       = form.NewOwner.Phone;
                    form.ActivationInfo.OwnerUserName    = form.NewOwner.UserName;
                    form.ActivationInfo.DistributorId    = distrib.Id;
                    form.ActivationInfo.DistributorFName = distrib.FName;
                    form.ActivationInfo.DistributorLName = distrib.LName;
                    form.ActivationInfo.SiteAddress      = form.NewSite.SiteAddress;
                    form.ActivationInfo.SiteCity         = form.NewSite.SiteCity;
                    form.ActivationInfo.SiteState        = form.NewSite.SiteState;
                    form.ActivationInfo.SiteCountry      = form.NewSite.SiteCountry;
                    form.ActivationInfo.SiteZip          = form.NewSite.SiteZip;
                    form.ActivationInfo.SubmissionDate   = DateTime.UtcNow;

                    // #6 - Create permission for new site
                    Models.Permission sitePermission = context.Permissions.AsNoTracking().FirstOrDefault(p => p.UserId == form.NewOwner.Id && p.SiteId == form.NewSite.SiteId);
                    if (sitePermission == null)
                    {
                        sitePermission = new Models.Permission {
                            Access = 1,
                            SiteId = form.NewSite.SiteId,
                            UserId = form.NewOwner.Id
                        };

                        context.Permissions.Add(sitePermission);
                    }

                    // Since these objects aren't being created through their respective controllers, need to manually log them
                    if (InstallerCreated)
                    {
                        Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateInstaller, authUser.Id, form.SiteInstaller.Id,
                                                    String.Format("{0} (id: {1}) created installer '{2}' (id: {3})", authUser.UserName, authUser.Id,
                                                                  form.SiteInstaller.FName + " " + form.SiteInstaller.LName, form.SiteInstaller.Id));
                    }
                    if (ManagerCreated)
                    {
                        Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateManager, authUser.Id, form.SiteManager.Id,
                                                    String.Format("{0} (id: {1}) created manager '{2}' (id: {3})", authUser.UserName, authUser.Id,
                                                                  form.SiteManager.FName + " " + form.SiteManager.LName, form.SiteManager.Id));
                    }
                    if (OwnerCreated)
                    {
                        Helpers.LogHelper.LogAction(Models.Log.ActionType.CreateUser, authUser.Id, form.NewOwner.Id,
                                                    String.Format("{0} (id: {1}) created user {2} (id: {3})", authUser.UserName, authUser.Id,
                                                                  form.NewOwner.UserName, form.NewOwner.Id));
                    }

                    // #7 - Save all final info to database (all information has been verified by this point) //

                    // check if form is pre-approved thru old RP
                    if (form.PreApproved)
                    {
                        form.ActivationInfo.ApprovedBy    = -1;
                        form.ActivationInfo.ApprovalNotes = "This site was pre-approved through old report portal.";
                    }

                    context.Activations.Add(form.ActivationInfo);
                    context.SaveChanges();

                    // #8 - Logging and alerting

                    // log
                    Helpers.LogHelper.LogAction(Models.Log.ActionType.ActivateSite, authUser.Id, form.NewSite.SiteId,
                                                String.Format("{0} (id: {1}) reactivated site '{2}' (site number: {3})", authUser.UserName, authUser.Id, form.NewSite.SiteName, form.NewSite.SiteNumber));

                    // send to Zapier to handle proper notification
                    var json = new {
                        SiteId = form.NewSite.SiteNumber,
                        form.NewSite.SiteName,
                        SystemName = system.Name,
                        form.ActivationInfo.SystemId,
                        form.NewSite.StorePhone,
                        form.SiteInstaller,
                        form.SiteManager,
                        NewOwner        = new { form.NewOwner.Active, form.NewOwner.Email, form.NewOwner.FName, form.NewOwner.LName, form.NewOwner.Phone, form.NewOwner.UserName },
                        SiteDistributor = new { distrib.Active, distrib.Email, distrib.FName, distrib.LName, distrib.Phone, distrib.UserName },
                        form.NewSite.SiteAddress,
                        form.NewSite.SiteCity,
                        form.NewSite.SiteState,
                        form.NewSite.SiteCountry,
                        form.NewSite.SiteZip,
                        SubmissionDate = form.ActivationInfo.SubmissionDate.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
                        form.ActivationInfo.ActivationNotes
                    };
                    Helpers.LogHelper.NotifyAction(Models.Log.ActionType.ActivateSite, json);
                }
                return(Json(new { status_code = 0 }));
            }
            else
            {
                return(Json(new { status_code = 5, status = "Unknown status code '" + type + "'" }));
            }
        }