public ActionResult CreatePROC(int id, Models.ProjectCreatePROCViewModel newPROC)
        {
            ProjectAuth cred = check_clientRelation(id);

            Models.ProjectCreatePROCViewModel createPROC = new Models.ProjectCreatePROCViewModel();
            // TODO: We need to validate this data, some one may POST data that is not good or designed to cause server exceptions.
            createPROC.Investor_ID = cred.Investor_ID;
            createPROC.Project_ID  = id;
            createPROC.Performance_Begin_DateTime = newPROC.Performance_Begin_DateTime;
            createPROC.Performance_End_DateTime   = newPROC.Performance_End_DateTime;
            createPROC.Revenue_Percentage         = newPROC.Revenue_Percentage;
            if (newPROC.Investment_Amount > createPROC.Financial_Account_Balance)
            {
                ModelState.AddModelError("Not_Enough_Funds", string.Format("You lack sufficient funds: ${0} ", (newPROC.Investment_Amount - createPROC.Financial_Account_Balance)));
                return(View(createPROC));
            }
            else
            {
                createPROC.Investment_Amount = newPROC.Investment_Amount;
            }
            int newPROC_id = 0;

            if (!cred.Valid) // this will fire if you are not the project owner.
            {
                newPROC_id = createPROC.create_PROC();
            }
            else
            {
                return(Redirect("/User/Index")); // TODO: do something else but this is good enough for now, if they are not authenticated this will kick the client all the way back to the home screen.
            }
            return(Redirect(string.Format("/PROC/Details/{0}", newPROC_id)));
        }
 public ActionResult Details(int id)
 {
     Models.ProjectIndexViewModel projectAccount = new Models.ProjectIndexViewModel(id);
     projectAccount.display_Project_ID = id;
     if (User.Identity.IsAuthenticated)
     {
         projectAccount.IsRegisteredViewer = true;
     }
     else
     {
         projectAccount.IsRegisteredViewer = false;
     }
     projectAccount.get_ProjectData(id);
     if (projectAccount.Profile_Public)
     {
         return(View(projectAccount));
     }
     else
     {
         /// in this way we will display a project profile to the owner of the project in case they want to see what the profile will look like before making it public.
         ProjectAuth cred = check_clientRelation(id);
         projectAccount.IsRegisteredViewer = false; /// do not display a post message field to the project owner.
         if (cred.Valid)
         {
             Models.ProjectIndexViewModel ownerAccount = new Models.ProjectIndexViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, cred.Project_ID);
             manageClient_Sessions(cred);
             ownerAccount.display_Project_ID = cred.Project_ID;
             return(View(ownerAccount));
         }
         else /// The client user is not the owner and this project is set to not be viewable.
         {
             return(Redirect("/User/Index")); /// TODO: Replace this redirect to something more helpful, perhpas one of the serach pages once it is built.
         }
     }
 }
        public ActionResult CreatePROC(int id)
        {
            /// Change: Made a change here to instantiate a projectCreatePROCViewModel that accepts the investor account of the person logged in.
            ProjectAuth cred = check_clientRelation(id);

            /// Change:  Used an overloaded version of this object that accepts the investor's account ID to load.
            Models.ProjectCreatePROCViewModel createPROC = new Models.ProjectCreatePROCViewModel(cred.Investor_ID);
            return(View(createPROC));
        }
        public ActionResult UploadImage(int id)
        {
            ProjectAuth cred = check_clientRelation(id);

            if (!cred.Valid)
            {
                Redirect("/User/Index/");
            }
            Models.ProjectUploadImageViewModel updateModel = new Models.ProjectUploadImageViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, cred.Project_ID);
            return(View(updateModel));
        }
        public ActionResult Edit(int id)
        {
            ProjectAuth cred = check_clientRelation(id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            Models.ProjectEditViewModel projectModel = new Models.ProjectEditViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, id);
            return(View(projectModel));
        }
        public ActionResult UploadDocument(int id)
        {
            int         project_id = id;
            ProjectAuth cred       = check_clientRelation(project_id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            Models.ProjectUploadDocumentViewModel uploadModel = new Models.ProjectUploadDocumentViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, cred.Project_ID);
            return(View(uploadModel));
        }
        public ActionResult Index(int id)
        {
            ProjectAuth cred = check_clientRelation(id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index")); // relation not valid return to user index screen.
            }
            manageClient_Sessions(cred);
            Models.ProjectIndexViewModel projectModel = new Models.ProjectIndexViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, id);
            return(View(projectModel));
        }
        public ActionResult UploadImage(int id, HttpPostedFileBase upload_Image)
        {
            ProjectAuth cred = check_clientRelation(id);

            if (!cred.Valid)
            {
                Redirect("/User/Index/");
            }
            Models.ProjectUploadImageViewModel updateModel = new Models.ProjectUploadImageViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, cred.Project_ID);
            try
            {
                // code to process a posted image file.
                byte[] picture_bytes = null;
                if (ModelState.IsValid)
                {
                    if (upload_Image != null)
                    {
                        if (upload_Image.ContentLength > 0)
                        {
                            int      MaxContentLength      = 1024 * 1024 * 3;
                            string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".pdf" };

                            if (!AllowedFileExtensions.Contains(upload_Image.FileName.Substring(upload_Image.FileName.LastIndexOf('.'))))
                            {
                                ModelState.AddModelError("upload_Image", "Please only use file types: " + string.Join(", ", AllowedFileExtensions));
                            }
                            else if (upload_Image.ContentLength > MaxContentLength)
                            {
                                ModelState.AddModelError("upload_Image", string.Format("Your file is too large, maximum file size is: {0} Bytes.", MaxContentLength));
                            }
                            else
                            {
                                picture_bytes = new byte[upload_Image.ContentLength];
                                upload_Image.InputStream.Read(picture_bytes, 0, upload_Image.ContentLength);
                            }
                        }
                    }
                }

                updateModel.Profile_Image = picture_bytes;
                updateModel.upload_Image();
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message);
                return(View());
            }
            return(Redirect(string.Format("/Project/Index/{0}", cred.Project_ID)));
        }
        public ActionResult UploadDocument(int id, HttpPostedFileBase upload_Document)
        {
            ProjectAuth cred = check_clientRelation(id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            Models.ProjectUploadDocumentViewModel uploadModel = new Models.ProjectUploadDocumentViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, cred.Project_ID);
            uploadModel.File_Name = upload_Document.FileName;
            uploadModel.Mime_Type = upload_Document.ContentType;
            byte[] hold = new byte[upload_Document.ContentLength];
            upload_Document.InputStream.Read(hold, 0, upload_Document.ContentLength);
            uploadModel.Binary_File = hold;
            uploadModel.upload_file();
            return(Redirect(string.Format("/Project/Details/{0}", id)));
        }
        public ActionResult RemoveImage(int id)
        {
            // In order for this method to be called the client must be logged in as the project owner.
            if (Session["Project_ID"] == null)
            {
                return(Redirect("/User/Index"));
            }
            int         project_id = (int)Session["Project_ID"];
            ProjectAuth cred       = check_clientRelation(project_id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            Models.ProjectDeleteImageViewModel modifyModel = new Models.ProjectDeleteImageViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, project_id);
            modifyModel.Image_ID = id;
            modifyModel.get_Image();
            return(View(modifyModel));
        }
        public ActionResult RemoveDocument(int id)
        {
            // This method will need that the user be logged in as a project owner so we can get the project id from session.
            if (Session["Project_ID"] == null)
            {
                return(Redirect("/User/Index"));
            }
            int         project_id = (int)Session["Project_ID"];
            ProjectAuth cred       = check_clientRelation(project_id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            Models.ProjectDeleteDocumentViewModel modifyModel = new Models.ProjectDeleteDocumentViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, cred.Project_ID);
            modifyModel.Document_ID = id;
            modifyModel.get_DocumentName();
            return(View(modifyModel));
        }
        /// <summary>
        /// Private method used to add/update the client's session variable for the project account they are logged in as.
        /// </summary>
        /// <param name="cred"></param>
        private void manageClient_Sessions(ProjectAuth cred)
        {
            int project_id = 0;

            if (Session["Project_ID"] != null)
            {
                project_id = (int)Session["Project_ID"];
            }

            if (project_id != 0)
            {
                if (project_id != cred.Project_ID)
                {
                    Session["Project_ID"] = cred.Project_ID;
                }
            }
            else if (project_id == 0)
            {
                Session.Add("Project_ID", cred.Project_ID);
            }
        }
        public ActionResult RemoveImage(int id, string confirm_CheckBox)
        {
            if (Session["Project_ID"] == null)
            {
                throw new Exception("What the hell, the client just posted to remove an image without a project id in session.");
            }
            int         project_id = (int)Session["Project_ID"];
            ProjectAuth cred       = check_clientRelation(project_id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            Models.ProjectDeleteImageViewModel modifyModel = new Models.ProjectDeleteImageViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, project_id);
            modifyModel.Image_ID = id;
            if (confirm_CheckBox == "on") // on is the equivalent of true from a checkbox element.
            {
                modifyModel.delete_Image();
            }
            return(Redirect(string.Format("/Project/Details/{0}", project_id)));
        }
        public ActionResult RemoveDocument(int id, string confirm_CheckBox)
        {
            // This method will need that the user be logged in as a project owner so we can get the project id from session.
            if (Session["Project_ID"] == null)
            {
                return(Redirect("/User/Index"));
            }
            int         project_id = (int)Session["Project_ID"];
            ProjectAuth cred       = check_clientRelation(project_id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            Models.ProjectDeleteDocumentViewModel modifyModel = new Models.ProjectDeleteDocumentViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, cred.Project_ID);
            modifyModel.Document_ID = id;
            if (confirm_CheckBox == "on")
            {
                modifyModel.delete_document();
            }
            return(Redirect(string.Format("/Project/Details/{0}", cred.Project_ID)));
        }
        public ActionResult Details(int id, string Project_Message)
        {
            ProjectAuth cred = check_clientRelation(id);

            Models.ProjectIndexViewModel detailsModel = new Models.ProjectIndexViewModel(id);
            detailsModel.get_ProjectData(cred.Project_ID);
            if (cred.Investor_ID != 0 || cred.Entrepreneur_ID != 0 || cred.User_ID != 0)
            {
                if (cred.Investor_ID != 0)
                {
                    detailsModel.message_ProjectOwner(cred.Project_ID, cred.Investor_ID, 3, Project_Message);
                }
                else if (cred.Entrepreneur_ID != 0)
                {
                    detailsModel.message_ProjectOwner(cred.Project_ID, cred.Entrepreneur_ID, 4, Project_Message);
                }
                else if (cred.User_ID != 0)
                {
                    detailsModel.message_ProjectOwner(cred.Project_ID, cred.User_ID, 1, Project_Message);
                }
            }
            return(View(detailsModel));
        }
        /// <summary>
        /// Private method that will fill our auth struct with values we need to guide controller actions.
        /// </summary>
        /// <param name="project_id">The id captured from the client's http request which is the project Id requested.</param>
        /// <returns>An authorization object containing Ids.</returns>
        private ProjectAuth check_clientRelation(int project_id)
        {
            ProjectAuth cred = new ProjectAuth();

            cred.Project_ID = project_id;
            // get our Investor_ID from Session if it exists.
            if (Session["Investor_ID"] != null)
            {
                cred.Investor_ID = (int)Session["Investor_ID"];
            }
            // get our Entrepreneur_ID from Session if it exists.
            if (Session["Entrepreneur_ID"] != null)
            {
                cred.Entrepreneur_ID = (int)Session["Entrepreneur_ID"];
            }
            else
            {
                cred.Valid = false;
            }
            Models.ProjectInitializeViewModel authModel = new Models.ProjectInitializeViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, project_id);
            cred.User_ID = authModel.User_Id;
            cred.Valid   = authModel.Valid;
            return(cred);
        }
        public ActionResult Edit(int id, Models.ProjectEditViewModel updateModel)
        {
            ProjectAuth cred = check_clientRelation(id);

            if (!cred.Valid)
            {
                return(Redirect("/User/Index"));
            }
            try
            {
                Models.ProjectEditViewModel projectModel = new Models.ProjectEditViewModel(User.Identity.GetUserId(), cred.Entrepreneur_ID, id);
                projectModel.Name            = updateModel.Name;
                projectModel.Description     = updateModel.Description;
                projectModel.Investment_Goal = updateModel.Investment_Goal;
                projectModel.Profile_Public  = updateModel.Profile_Public;
                projectModel.update_Project();
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.Message);
                return(View());
            }
            return(Redirect(string.Format("/Project/Index/{0}", id)));
        }