Exemplo n.º 1
0
        public JsonResult ApproveNomination(ConfirmApproveViewModel model, HttpPostedFileBase inputFile)
        {
            var errors = ModelState.Values.SelectMany(v => v.Errors);

            if (ModelState.IsValid)
            {
                using (DBModel db = new DBModel())
                {
                    var currentUserId = User.Identity.GetUserId();
                    var _userDetails  = db.AspNetUsers.SingleOrDefault(e => e.Id == currentUserId);
                    var _action       = "ApproveNomination";

                    //Upload Signature
                    if (inputFile != null)
                    {
                        string pic  = DateTime.Now.ToString("yyyyMMdd") + currentUserId + System.IO.Path.GetFileName(inputFile.FileName);
                        string path = System.IO.Path.Combine(Server.MapPath("~/Content/images/signatures/"), pic);
                        // Upload file
                        inputFile.SaveAs(path);

                        //Save File name to Database
                        var SignatoryToUpdate = db.ClientSignatories.First(c => c.EmailAddress == _userDetails.Email && c.CompanyID == model.CompanyID);
                        SignatoryToUpdate.Signature     = pic;
                        SignatoryToUpdate.UserAccountID = _userDetails.Id;
                        SignatoryToUpdate.PhoneNumber   = model.VerifyPhone; //Update phone number
                        db.SaveChanges();
                    }

                    //Check if signatory is also an authorized representative
                    var getUserInfo = db.AspNetUsers.SingleOrDefault(c => c.Id == currentUserId);
                    var signatoryIsARepresentative = db.DesignatedUsers.Any(c => c.Email == getUserInfo.Email && c.CompanyID == model.CompanyID);
                    if (signatoryIsARepresentative)
                    {
                        var signatoryClientId = db.ClientSignatories.First(c => c.UserAccountID == currentUserId);

                        //Update representative's signature
                        var RepresentativeToUpdate = db.DesignatedUsers.First(c => c.Email == signatoryClientId.EmailAddress && c.CompanyID == model.CompanyID);
                        RepresentativeToUpdate.Signature = signatoryClientId.Signature;
                        RepresentativeToUpdate.Mobile    = model.VerifyPhone; //Update phone number
                        db.SaveChanges();

                        //Log Signatory Approval
                        try
                        {
                            var LogApproval = db.SignatoryApprovals.Create();
                            LogApproval.ApplicationID = model.ApplicationID;
                            LogApproval.SignatoryID   = signatoryClientId.Id;
                            LogApproval.AcceptedTerms = model.terms;
                            LogApproval.DateApproved  = DateTime.Now;
                            db.SignatoryApprovals.Add(LogApproval);
                            var savedItem = db.SaveChanges();
                            if (savedItem > 0)
                            {
                                //Log signatory approval
                                var nominationToUpdate = db.ApplicationNominations.SingleOrDefault(c => c.NomineeEmail == signatoryClientId.EmailAddress && c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NominationType == 1);
                                nominationToUpdate.NominationStatus = 1;
                                db.SaveChanges();
                            }
                        }
                        catch (Exception)
                        {
                            return(Json("Error! Unable to log signatory approval", JsonRequestBehavior.AllowGet));
                        }

                        //Log Representative Approval
                        try
                        {
                            var userClientId = db.DesignatedUsers.First(c => c.Email == getUserInfo.Email && c.CompanyID == model.CompanyID);
                            var LogDesignatedUserApproval = db.DesignatedUserApprovals.Create();
                            LogDesignatedUserApproval.ApplicationID = model.ApplicationID;
                            LogDesignatedUserApproval.UserID        = userClientId.Id;
                            LogDesignatedUserApproval.AcceptedTerms = model.terms;
                            LogDesignatedUserApproval.DateApproved  = DateTime.Now;
                            db.DesignatedUserApprovals.Add(LogDesignatedUserApproval);
                            var savedItem = db.SaveChanges();
                            if (savedItem > 0)
                            {
                                //Log signatory approval
                                var repNominationToUpdate = db.ApplicationNominations.SingleOrDefault(c => c.NomineeEmail == userClientId.Email && c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NominationType == 2);
                                repNominationToUpdate.NominationStatus = 1;
                                db.SaveChanges();
                            }
                        }
                        catch (Exception)
                        {
                            return(Json("Error! Unable to log representative approval", JsonRequestBehavior.AllowGet));
                        }

                        //Update application Id
                        var ApplicationUpdate = db.EMarketApplications.SingleOrDefault(c => c.Id == model.ApplicationID && c.CompanyID == model.CompanyID);
                        if (ApplicationUpdate != null)
                        {
                            try
                            {
                                var SignatoryApprovals = ApplicationUpdate.SignatoriesApproved;
                                var UsersApprovals     = ApplicationUpdate.UsersApproved;
                                ApplicationUpdate.SignatoriesApproved     = SignatoryApprovals + 1;
                                ApplicationUpdate.UsersApproved           = UsersApprovals + 1;
                                ApplicationUpdate.SignatoriesDateApproved = DateTime.Now;
                                ApplicationUpdate.UsersDateApproved       = DateTime.Now;
                                db.SaveChanges();
                            }
                            catch (Exception)
                            {
                                return(Json("Error! Unable to update application details", JsonRequestBehavior.AllowGet));
                            }

                            //Check if all signatories have approved
                            if (ApplicationUpdate.SignatoriesApproved >= ApplicationUpdate.Signatories)
                            {
                                //Send Emails to representatives for approval excluding the existing users
                                foreach (var email in db.DesignatedUsers.Where(c => c.ClientID == signatoryClientId.ClientID && c.CompanyID == model.CompanyID).ToList())
                                {
                                    var emailExists = db.AspNetUsers.Any(x => x.Email.ToLower() == email.Email.ToLower());
                                    if (!emailExists)
                                    {
                                        //1. Update Designated User with OTP to Login
                                        var    _OTPCode     = OTPGenerator.GetUniqueKey(6);
                                        string OTPCode      = Shuffle.StringMixer(_OTPCode);
                                        var    UserToUpdate = db.DesignatedUsers.SingleOrDefault(c => c.Email == email.Email && c.CompanyID == model.CompanyID);
                                        UserToUpdate.OTP         = Functions.GenerateMD5Hash(OTPCode);
                                        UserToUpdate.DateCreated = DateTime.Now;
                                        db.SaveChanges();

                                        //2. Send Email To Representatives with OTP
                                        var    callbackUrl  = Url.Action("DesignatedUserConfirmation", "Account", null, Request.Url.Scheme);
                                        string EmailBodyRep = string.Empty;

                                        using (StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/RepresentativeNomination.html")))
                                        {
                                            EmailBodyRep = reader.ReadToEnd();
                                        }
                                        EmailBodyRep = EmailBodyRep.Replace("{RepresentativeName}", email.Surname);
                                        EmailBodyRep = EmailBodyRep.Replace("{ActivationCode}", OTPCode);
                                        EmailBodyRep = EmailBodyRep.Replace("{URL}", callbackUrl);

                                        var EmailToRepresentative = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.Email.ToLower(), "Authorized Representative Confirmation", EmailBodyRep);
                                        if (EmailToRepresentative == true)
                                        {
                                            //Log email sent notification
                                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                        else
                                        {
                                            //Log Email failed notification
                                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                    }
                                    else
                                    {
                                        //Send Email To Representatives without OTP
                                        var    callbackUrl  = Url.Action("Index", "Home", null, Request.Url.Scheme);
                                        string EmailBodyRep = string.Empty;

                                        using (StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/ExistingRepresentativeNomination.html")))
                                        {
                                            EmailBodyRep = reader.ReadToEnd();
                                        }
                                        EmailBodyRep = EmailBodyRep.Replace("{RepresentativeName}", email.Surname);
                                        EmailBodyRep = EmailBodyRep.Replace("{URL}", callbackUrl);

                                        var EmailToRepresentative = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.Email.ToLower(), "Authorized Representative Confirmation", EmailBodyRep);
                                        if (EmailToRepresentative == true)
                                        {
                                            //Log email sent notification
                                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                        else
                                        {
                                            //Log Email failed notification
                                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            return(Json("Error! Unable to update representative details!", JsonRequestBehavior.AllowGet));
                        }

                        //Send email to signatory after approval
                        string EmailBody = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/SignatoryRepresentativeApproval.html")))
                        {
                            EmailBody = reader.ReadToEnd();
                        }
                        EmailBody = EmailBody.Replace("{Othernames}", signatoryClientId.OtherNames);
                        EmailBody = EmailBody.Replace("{CompanyName}", model.CompanyName);

                        var SendRegistrationCompleteEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, signatoryClientId.EmailAddress, "Signatory/Authorized Representative Approval", EmailBody);

                        if (SendRegistrationCompleteEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody, signatoryClientId.EmailAddress, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody, signatoryClientId.EmailAddress, _action);
                        }

                        //Send email to company
                        string EmailBody2 = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/ClientConfirmationApproval.html")))
                        {
                            EmailBody2 = reader.ReadToEnd();
                        }
                        EmailBody2 = EmailBody2.Replace("{Othernames}", model.CompanySurname);
                        EmailBody2 = EmailBody2.Replace("{ApproversName}", signatoryClientId.Surname + " " + signatoryClientId.OtherNames);

                        var SendClientConfirmationEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, model.CompanyEmail, "Signatory/Authorized Representative Approval", EmailBody2);

                        if (SendClientConfirmationEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }
                    }

                    //When signatory is not in representative list
                    else
                    {
                        var signatoryClientId = db.ClientSignatories.First(c => c.EmailAddress == _userDetails.Email && c.CompanyID == model.CompanyID);
                        //Log Signatory Approval
                        try
                        {
                            var LogApproval = db.SignatoryApprovals.Create();
                            LogApproval.ApplicationID = model.ApplicationID;
                            LogApproval.SignatoryID   = signatoryClientId.Id;
                            LogApproval.AcceptedTerms = model.terms;
                            LogApproval.DateApproved  = DateTime.Now;
                            db.SignatoryApprovals.Add(LogApproval);
                            var savedItem = db.SaveChanges();
                            if (savedItem > 0)
                            {
                                var nominationToUpdate = db.ApplicationNominations.SingleOrDefault(c => c.NomineeEmail == signatoryClientId.EmailAddress && c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NominationType == 1);
                                nominationToUpdate.NominationStatus = 1;
                                db.SaveChanges();
                            }
                        }
                        catch (Exception)
                        {
                            return(Json("Error! Unable to log signatory approval", JsonRequestBehavior.AllowGet));
                        }

                        //Update application Id
                        var ApplicationUpdate = db.EMarketApplications.SingleOrDefault(c => c.Id == model.ApplicationID);
                        if (ApplicationUpdate != null)
                        {
                            try
                            {
                                var SignatoryApprovals = ApplicationUpdate.SignatoriesApproved;
                                ApplicationUpdate.SignatoriesApproved     = SignatoryApprovals + 1;
                                ApplicationUpdate.SignatoriesDateApproved = DateTime.Now;
                                db.SaveChanges();
                            }
                            catch (Exception)
                            {
                                return(Json("Error! Unable to update application details", JsonRequestBehavior.AllowGet));
                            }

                            //Check if all signatories have approved
                            if (ApplicationUpdate.SignatoriesApproved >= ApplicationUpdate.Signatories)
                            {
                                //Send Emails to representatives for approval excluding the existing users and registered Clients
                                var _dontSendEmail = db.RegisteredClients.Select(x => x.EmailAddress).ToList();
                                foreach (var email in db.DesignatedUsers.Where(c => c.ClientID == signatoryClientId.ClientID && c.CompanyID == model.CompanyID && !_dontSendEmail.Contains(c.Email)).ToList())
                                {
                                    var emailExists = db.AspNetUsers.Any(x => x.Email.ToLower() == email.Email.ToLower());
                                    if (!emailExists)
                                    {
                                        //1. Update Designated User with OTP to Login
                                        var    _OTPCode     = OTPGenerator.GetUniqueKey(6);
                                        string OTPCode      = Shuffle.StringMixer(_OTPCode);
                                        var    UserToUpdate = db.DesignatedUsers.SingleOrDefault(c => c.Email == email.Email && c.CompanyID == model.CompanyID);
                                        UserToUpdate.OTP         = Functions.GenerateMD5Hash(OTPCode);
                                        UserToUpdate.DateCreated = DateTime.Now;
                                        db.SaveChanges();

                                        //2. Send Email To Representatives with OTP
                                        var    callbackUrl  = Url.Action("DesignatedUserConfirmation", "Account", null, Request.Url.Scheme);
                                        string EmailBodyRep = string.Empty;

                                        using (StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/RepresentativeNomination.html")))
                                        {
                                            EmailBodyRep = reader.ReadToEnd();
                                        }
                                        EmailBodyRep = EmailBodyRep.Replace("{RepresentativeName}", email.Surname);
                                        EmailBodyRep = EmailBodyRep.Replace("{ActivationCode}", OTPCode);
                                        EmailBodyRep = EmailBodyRep.Replace("{URL}", callbackUrl);

                                        var EmailToRepresentative = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.Email.ToLower(), "Authorized Representative Confirmation", EmailBodyRep);
                                        if (EmailToRepresentative == true)
                                        {
                                            //Log email sent notification
                                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                        else
                                        {
                                            //Log Email failed notification
                                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                    }
                                    else
                                    {
                                        //Check if he has already approved
                                        var userHasApproved = db.ApplicationNominations.Any(c => c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NomineeEmail.ToLower() == email.Email.ToLower() && c.NominationType == 2 && c.NominationStatus == 1);
                                        if (!userHasApproved)
                                        {
                                            //Send Email To Representatives without OTP
                                            var    callbackUrl  = Url.Action("Index", "Home", null, Request.Url.Scheme);
                                            string EmailBodyRep = string.Empty;

                                            using (StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/ExistingRepresentativeNomination.html")))
                                            {
                                                EmailBodyRep = reader.ReadToEnd();
                                            }
                                            EmailBodyRep = EmailBodyRep.Replace("{RepresentativeName}", email.Surname);
                                            EmailBodyRep = EmailBodyRep.Replace("{URL}", callbackUrl);

                                            var EmailToRepresentative = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.Email.ToLower(), "Authorized Representative Confirmation", EmailBodyRep);
                                            if (EmailToRepresentative == true)
                                            {
                                                //Log email sent notification
                                                LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                            }
                                            else
                                            {
                                                //Log Email failed notification
                                                LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            return(Json("Unable to Update Details!", JsonRequestBehavior.AllowGet));
                        }

                        //Send email to signatory
                        string EmailBody = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/SignatoryApproval.html")))
                        {
                            EmailBody = reader.ReadToEnd();
                        }
                        EmailBody = EmailBody.Replace("{Othernames}", signatoryClientId.OtherNames);
                        EmailBody = EmailBody.Replace("{CompanyName}", model.CompanyName);

                        var SendRegistrationCompleteEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, signatoryClientId.EmailAddress, "Signatory Approval", EmailBody);

                        if (SendRegistrationCompleteEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody, signatoryClientId.EmailAddress, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody, signatoryClientId.EmailAddress, _action);
                        }

                        //Send email to company
                        string EmailBody2 = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/ClientConfirmationApproval.html")))
                        {
                            EmailBody2 = reader.ReadToEnd();
                        }
                        EmailBody2 = EmailBody2.Replace("{Othernames}", model.CompanySurname);
                        EmailBody2 = EmailBody2.Replace("{ApproversName}", signatoryClientId.Surname + " " + signatoryClientId.OtherNames);

                        var SendClientConfirmationEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, model.CompanyEmail, "Signatory Approval", EmailBody2);

                        if (SendClientConfirmationEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }
                    }
                }
                return(Json("success", JsonRequestBehavior.AllowGet));
            }
            else
            {
                return(Json("Model Invalid! " + errors + " ", JsonRequestBehavior.AllowGet));
            }
        }
        public JsonResult ApproveNomination(ConfirmApproveViewModel model, HttpPostedFileBase inputFile)
        {
            var errors = ModelState.Values.SelectMany(v => v.Errors);

            if (ModelState.IsValid)
            {
                using (DBModel db = new DBModel())
                {
                    var currentUserId = User.Identity.GetUserId();
                    var _userDetails  = db.AspNetUsers.SingleOrDefault(e => e.Id == currentUserId);
                    var _action       = "ApproveNomination";
                    var userClientId  = db.DesignatedUsers.First(c => c.Email == _userDetails.Email && c.CompanyID == model.CompanyID);

                    //1. Upload Signature
                    if (inputFile != null)
                    {
                        string pic  = DateTime.Now.ToString("yyyyMMdd") + currentUserId + System.IO.Path.GetFileName(inputFile.FileName);
                        string path = System.IO.Path.Combine(Server.MapPath("~/Content/images/signatures/"), pic);
                        // Upload file
                        inputFile.SaveAs(path);
                        try
                        {
                            //Save File name to Database  //Update Representative Details
                            var DesignatedUserToUpdate = db.DesignatedUsers.FirstOrDefault(c => c.Email == userClientId.Email && c.CompanyID == model.CompanyID);
                            DesignatedUserToUpdate.Signature = pic;
                            DesignatedUserToUpdate.Mobile    = model.VerifyPhone;
                            db.SaveChanges();
                        }
                        catch (Exception)
                        {
                            return(Json("Error! Unable to update representative details", JsonRequestBehavior.AllowGet));
                        }
                    }
                    else
                    {
                        return(Json("Error! Unable to upload representative signature", JsonRequestBehavior.AllowGet));
                    }

                    //2. Check if authorized representative is also a signatory
                    var getUserInfo = db.AspNetUsers.SingleOrDefault(c => c.Id == currentUserId);
                    var representativeIsASignatory = db.ClientSignatories.Any(c => c.EmailAddress == getUserInfo.Email && c.CompanyID == model.CompanyID);
                    if (representativeIsASignatory)
                    {
                        var representativeClientId = db.DesignatedUsers.First(c => c.Email == getUserInfo.Email && c.CompanyID == model.CompanyID);

                        //1. Update signatory's signature
                        var SignatoryToUpdate = db.ClientSignatories.First(c => c.EmailAddress == representativeClientId.Email && c.CompanyID == model.CompanyID);
                        SignatoryToUpdate.Signature   = representativeClientId.Signature;
                        SignatoryToUpdate.PhoneNumber = model.VerifyPhone; //Update phone number
                        db.SaveChanges();

                        //2. Log Representative's Approval
                        try
                        {
                            var LogApproval = db.DesignatedUserApprovals.Create();
                            LogApproval.ApplicationID = model.ApplicationID;
                            LogApproval.UserID        = representativeClientId.Id;
                            LogApproval.AcceptedTerms = model.terms;
                            LogApproval.DateApproved  = DateTime.Now;
                            db.DesignatedUserApprovals.Add(LogApproval);
                            var savedItem = db.SaveChanges();
                            if (savedItem > 0)
                            {
                                //Log Representative approval
                                var nominationToUpdate = db.ApplicationNominations.SingleOrDefault(c => c.NomineeEmail == userClientId.Email && c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NominationType == 2);
                                nominationToUpdate.NominationStatus = 1;
                                db.SaveChanges();
                            }
                        }
                        catch (Exception)
                        {
                            return(Json("Error! Unable to log representative's details", JsonRequestBehavior.AllowGet));
                        }

                        //3. Log Signatory Approval
                        try
                        {
                            var signatoryClientId = db.ClientSignatories.First(c => c.EmailAddress == _userDetails.Email && c.CompanyID == model.CompanyID);
                            var LogSigApproval    = db.SignatoryApprovals.Create();
                            LogSigApproval.ApplicationID = model.ApplicationID;
                            LogSigApproval.SignatoryID   = signatoryClientId.Id;
                            LogSigApproval.AcceptedTerms = model.terms;
                            LogSigApproval.DateApproved  = DateTime.Now;
                            db.SignatoryApprovals.Add(LogSigApproval);
                            var savedItem = db.SaveChanges();
                            if (savedItem > 0)
                            {
                                //Log nomination
                                var nominationToUpdate = db.ApplicationNominations.SingleOrDefault(c => c.NomineeEmail == userClientId.Email && c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NominationType == 1);
                                nominationToUpdate.NominationStatus = 1;
                                db.SaveChanges();
                            }
                        }
                        catch (Exception ex)
                        {
                            return(Json("Error! Unable to log signatory approval" + ex.Message, JsonRequestBehavior.AllowGet));
                        }

                        //4. Update Application ID
                        var ApplicationUpdate = db.EMarketApplications.SingleOrDefault(c => c.Id == model.ApplicationID && c.CompanyID == model.CompanyID);
                        if (ApplicationUpdate != null)
                        {
                            try
                            {
                                var SignatoryApprovals = ApplicationUpdate.SignatoriesApproved;
                                var UsersApprovals     = ApplicationUpdate.UsersApproved;
                                ApplicationUpdate.SignatoriesApproved     = SignatoryApprovals + 1;
                                ApplicationUpdate.UsersApproved           = UsersApprovals + 1;
                                ApplicationUpdate.SignatoriesDateApproved = DateTime.Now;
                                ApplicationUpdate.UsersDateApproved       = DateTime.Now;
                                db.SaveChanges();
                            }
                            catch (Exception)
                            {
                                return(Json("Error! Unable to update application details", JsonRequestBehavior.AllowGet));
                            }
                        }
                        else
                        {
                            return(Json("Unable to update application details!", JsonRequestBehavior.AllowGet));
                        }

                        //5. Send email to authorized representative
                        string EmailBody = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/RepresentativeApproval.html")))
                        {
                            EmailBody = reader.ReadToEnd();
                        }
                        EmailBody = EmailBody.Replace("{Othernames}", userClientId.Othernames);
                        EmailBody = EmailBody.Replace("{CompanyName}", model.CompanyName);

                        var SendRegistrationCompleteEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, userClientId.Email, "Authorised Representative/Signatory Approval", EmailBody);

                        if (SendRegistrationCompleteEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody, userClientId.Email, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody, userClientId.Email, _action);
                        }

                        //6. Send email to company
                        string EmailBody2 = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/ClientConfirmationApproval.html")))
                        {
                            EmailBody2 = reader.ReadToEnd();
                        }
                        EmailBody2 = EmailBody2.Replace("{Othernames}", model.CompanySurname);
                        EmailBody2 = EmailBody2.Replace("{ApproversName}", userClientId.Surname + " " + userClientId.Othernames);

                        var SendClientConfirmationEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, model.CompanyEmail, "Authorised Representative/Signatory Approval", EmailBody2);

                        if (SendClientConfirmationEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }

                        //7. Check if all signatories have approved and send email to representatives
                        if (ApplicationUpdate.SignatoriesApproved >= ApplicationUpdate.Signatories)
                        {
                            //Send Emails to representatives for approval excluding the signatory and sole signatory if in list
                            var _dontSendEmail = db.RegisteredClients.Select(x => x.EmailAddress).ToList();
                            foreach (var email in db.DesignatedUsers.Where(c => c.ClientID == userClientId.ClientID && c.CompanyID == model.CompanyID && !_dontSendEmail.Contains(c.Email)).ToList())
                            {
                                var emailExists = db.AspNetUsers.Any(x => x.Email.ToLower() == email.Email.ToLower());
                                if (!emailExists)
                                {
                                    //1. Update Designated User with OTP to Login
                                    var    _OTPCode     = OTPGenerator.GetUniqueKey(6);
                                    string OTPCode      = Shuffle.StringMixer(_OTPCode);
                                    var    UserToUpdate = db.DesignatedUsers.SingleOrDefault(c => c.Email == email.Email && c.CompanyID == model.CompanyID);
                                    UserToUpdate.OTP         = Functions.GenerateMD5Hash(OTPCode);
                                    UserToUpdate.DateCreated = DateTime.Now;
                                    db.SaveChanges();

                                    //2. Send Email To Representatives
                                    var    callbackUrl  = Url.Action("DesignatedUserConfirmation", "Account", null, Request.Url.Scheme);
                                    string EmailBodyRep = string.Empty;
                                    using (StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/RepresentativeNomination.html")))
                                    {
                                        EmailBodyRep = reader.ReadToEnd();
                                    }
                                    EmailBodyRep = EmailBodyRep.Replace("{RepresentativeName}", email.Surname);
                                    EmailBodyRep = EmailBodyRep.Replace("{ActivationCode}", OTPCode);
                                    EmailBodyRep = EmailBodyRep.Replace("{URL}", callbackUrl);

                                    var EmailToRepresentative = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.Email.ToLower(), "Authorized Representative Confirmation", EmailBodyRep);
                                    if (EmailToRepresentative == true)
                                    {
                                        //Log email sent notification
                                        LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                    }
                                    else
                                    {
                                        //Log Email failed notification
                                        LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                    }
                                }
                                else
                                {
                                    //Check if he has already approved
                                    var userHasApproved = db.ApplicationNominations.Any(c => c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NomineeEmail.ToLower() == email.Email.ToLower() && c.NominationType == 2 && c.NominationStatus == 1);
                                    if (!userHasApproved)
                                    {
                                        //1. Send Email To Representatives
                                        var    callbackUrl  = Url.Action("Index", "Home", null, Request.Url.Scheme);
                                        string EmailBodyRep = string.Empty;
                                        using (StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/ExistingRepresentativeNomination.html")))
                                        {
                                            EmailBodyRep = reader.ReadToEnd();
                                        }
                                        EmailBodyRep = EmailBodyRep.Replace("{RepresentativeName}", email.Surname);
                                        EmailBodyRep = EmailBodyRep.Replace("{URL}", callbackUrl);

                                        var EmailToRepresentative = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.Email.ToLower(), "Authorized Representative Confirmation", EmailBodyRep);
                                        if (EmailToRepresentative == true)
                                        {
                                            //Log email sent notification
                                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                        else
                                        {
                                            //Log Email failed notification
                                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBodyRep, email.Email.ToLower(), _action);
                                        }
                                    }
                                }
                            }
                        }

                        //8. Check if all Representatives have approved and send complete email to digital desk
                        var ApplicationToCheck = db.EMarketApplications.SingleOrDefault(c => c.Id == model.ApplicationID && c.CompanyID == model.CompanyID);
                        if (ApplicationToCheck.UsersApproved == ApplicationToCheck.DesignatedUsers)
                        {
                            //Send Email to Digital Desk and Ops for Approval process
                            var DDUserRole = (from p in db.AspNetUserRoles
                                              join e in db.AspNetUsers on p.UserId equals e.Id
                                              where (p.RoleId == "03d5e1e3-a8a9-441e-9122-30c3aafccccc" || p.RoleId == "05bdc847-b94d-4d2f-957e-8de1d563106a") && e.Status == 1
                                              select new
                            {
                                EmailID = e.Email
                            }).ToList();
                            var companyInfo = db.ClientCompanies.SingleOrDefault(c => c.Id == model.CompanyID);
                            foreach (var email in DDUserRole)
                            {
                                var DDMessageBody = "Dear Team <br/><br/> Kindly note that all the signatories and representatives of " + companyInfo.CompanyName + " have approved their nomination. <br/>" +
                                                    "<br/><br/> Kind Regards, <br /><img src=\"https://e-documents.stanbicbank.co.ke/Content/images/EmailSignature.png\"/>";
                                var SendDDNotificationEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.EmailID, "Application Completed", DDMessageBody);
                                if (SendDDNotificationEmail == true)
                                {
                                    //Log email sent notification
                                    LogNotification.AddSucsessNotification(MailHelper.EmailFrom, DDMessageBody, email.EmailID, _action);
                                }
                                else
                                {
                                    //Log Email failed notification
                                    LogNotification.AddFailureNotification(MailHelper.EmailFrom, DDMessageBody, email.EmailID, _action);
                                }
                            }
                        }
                    }
                    else
                    {
                        //If representative is not a signtory
                        //1. Log Representative's Approval
                        try
                        {
                            var LogApproval = db.DesignatedUserApprovals.Create();
                            LogApproval.ApplicationID = model.ApplicationID;
                            LogApproval.UserID        = userClientId.Id;
                            LogApproval.AcceptedTerms = model.terms;
                            LogApproval.DateApproved  = DateTime.Now;
                            db.DesignatedUserApprovals.Add(LogApproval);
                            var savedItem = db.SaveChanges();
                            if (savedItem > 0)
                            {
                                //Log Representative approval
                                var nominationToUpdate = db.ApplicationNominations.SingleOrDefault(c => c.NomineeEmail == userClientId.Email && c.ApplicationID == model.ApplicationID && c.CompanyID == model.CompanyID && c.NominationType == 2);
                                nominationToUpdate.NominationStatus = 1;
                                db.SaveChanges();
                            }
                        }
                        catch (Exception)
                        {
                            return(Json("Error! Unable to log representatives details", JsonRequestBehavior.AllowGet));
                        }

                        //2. Update application ID
                        var ApplicationUpdate = db.EMarketApplications.SingleOrDefault(c => c.Id == model.ApplicationID && c.CompanyID == model.CompanyID);
                        if (ApplicationUpdate != null)
                        {
                            try
                            {
                                var SignatoryApprovals = ApplicationUpdate.SignatoriesApproved;
                                var UsersApprovals     = ApplicationUpdate.UsersApproved;
                                //ApplicationUpdate.SignatoriesApproved = SignatoryApprovals + 1;
                                ApplicationUpdate.UsersApproved           = UsersApprovals + 1;
                                ApplicationUpdate.SignatoriesDateApproved = DateTime.Now;
                                ApplicationUpdate.UsersDateApproved       = DateTime.Now;
                                db.SaveChanges();
                            }
                            catch (Exception)
                            {
                                return(Json("Error! Unable to update application details", JsonRequestBehavior.AllowGet));
                            }
                        }
                        else
                        {
                            return(Json("Unable to update application details!", JsonRequestBehavior.AllowGet));
                        }

                        //5. Send email to authorized representative
                        string EmailBody = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/RepresentativeApproval.html")))
                        {
                            EmailBody = reader.ReadToEnd();
                        }
                        EmailBody = EmailBody.Replace("{Othernames}", userClientId.Othernames);
                        EmailBody = EmailBody.Replace("{CompanyName}", model.CompanyName);

                        var SendRegistrationCompleteEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, userClientId.Email, "Authorised Representative Approval", EmailBody);

                        if (SendRegistrationCompleteEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody, userClientId.Email, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody, userClientId.Email, _action);
                        }

                        //6. Send email to company
                        string EmailBody2 = string.Empty;
                        using (System.IO.StreamReader reader = new StreamReader(Server.MapPath("~/Content/emails/ClientConfirmationApproval.html")))
                        {
                            EmailBody2 = reader.ReadToEnd();
                        }
                        EmailBody2 = EmailBody2.Replace("{Othernames}", model.CompanySurname);
                        EmailBody2 = EmailBody2.Replace("{ApproversName}", userClientId.Surname + " " + userClientId.Othernames);

                        var SendClientConfirmationEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, model.CompanyEmail, "Authorised Representative Approval", EmailBody2);

                        if (SendClientConfirmationEmail == true)
                        {
                            //Log email sent notification
                            LogNotification.AddSucsessNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }
                        else
                        {
                            //Log Email failed notification
                            LogNotification.AddFailureNotification(MailHelper.EmailFrom, EmailBody2, model.CompanyEmail, _action);
                        }

                        //7. Check if all Representatives have approved and send complete email to digital desk and ops
                        var ApplicationToCheck = db.EMarketApplications.SingleOrDefault(c => c.Id == model.ApplicationID && c.CompanyID == model.CompanyID);
                        if (ApplicationToCheck.UsersApproved == ApplicationToCheck.DesignatedUsers)
                        {
                            //Send Email to Digital Desk and Ops for Approval process
                            var DDUserRole = (from p in db.AspNetUserRoles
                                              join e in db.AspNetUsers on p.UserId equals e.Id
                                              where (p.RoleId == "03d5e1e3-a8a9-441e-9122-30c3aafccccc" || p.RoleId == "05bdc847-b94d-4d2f-957e-8de1d563106a") && e.Status == 1
                                              select new
                            {
                                EmailID = e.Email
                            }).ToList();
                            var companyInfo = db.ClientCompanies.SingleOrDefault(c => c.Id == model.CompanyID);
                            foreach (var email in DDUserRole)
                            {
                                var DDMessageBody = "Dear Team <br/><br/> Kindly note that all the signatories and representatives of " + companyInfo.CompanyName + " have approved their nomination. <br/>" +
                                                    "<br/><br/> Kind Regards, <br /><img src=\"https://e-documents.stanbicbank.co.ke/Content/images/EmailSignature.png\"/>";
                                var SendDDNotificationEmail = MailHelper.SendMailMessage(MailHelper.EmailFrom, email.EmailID, "Application Completed", DDMessageBody);
                                if (SendDDNotificationEmail == true)
                                {
                                    //Log email sent notification
                                    LogNotification.AddSucsessNotification(MailHelper.EmailFrom, DDMessageBody, email.EmailID, _action);
                                }
                                else
                                {
                                    //Log Email failed notification
                                    LogNotification.AddFailureNotification(MailHelper.EmailFrom, DDMessageBody, email.EmailID, _action);
                                }
                            }
                        }
                    }
                }
                return(Json("success", JsonRequestBehavior.AllowGet));
            }
            else
            {
                return(Json("Model Invalid! " + errors + " ", JsonRequestBehavior.AllowGet));
            }
        }