public ActionResult Index()
        {
            var firm = FirmInstitutionBL.GetFirmInstitutionByIdFirmInstitution(SessionManager.GetFirmInstitutionSession().idFirmInstitution);
            if (firm != null)
            {
                var FirmModel = new FIDetailModel(firm);
                var _association = FirmInstitutionBL.GetFirmInstitutionProfessionalAssociation(firm.idFirmInstitution);
                if (_association != null) FirmModel.ProfessionalAssociation = _association;

                return View("Index", FirmModel);
            }
            else
            {
                return RedirectToAction("Index", "SignTableaudebord");
            }
        }
        public ActionResult DocFooter(FIDetailModel _model)
        {
            if (_model.FirmInstitution != null)
            {
                var model = new FIDetailModel(_model.FirmInstitution);

                //Get firminstitution
                var currentFirm = SessionManager.GetFirmInstitutionSession();
                FirmInstitution firmInstitution = FirmInstitutionBL.GetFirmInstitutionByIdFirmInstitution(currentFirm.idFirmInstitution);

                firmInstitution.DocumentFooterContent = _model.FirmInstitution.DocumentFooterContent;//.Replace("\n", Environment.NewLine);;

                //Update firminstitution data            
                var firm = FirmInstitutionBL.UpdateFirmInstitutionDocFooter(firmInstitution);

                //Remettre le firm selectionné en session pour refléter les maj.
                SessionManager.SetFirmInstutionSession(firm);

                return View("DocFooter", model);
            }
            else
            {
                return RedirectToAction("Login", "User");
            }
        }
        public ActionResult DocFooter()
        {
            try
            {
                // Get select firm institution
                var currentFirm = FirmInstitutionBL.GetFirmInstitutionByIdFirmInstitution(SessionManager.GetFirmInstitutionSession().idFirmInstitution);
                if (currentFirm != null)
                {
                    var model = new FIDetailModel(currentFirm);
                    var _association = FirmInstitutionBL.GetFirmInstitutionProfessionalAssociation(currentFirm.idFirmInstitution);
                    string associationName = string.Empty;

                    if (_association != null)
                    {
                        ProfessionalAssociation professionalAssociation = FirmInstitutionBL.GetProfessionalAssociationById(_association.idProfessionalAssociation);
                        if (professionalAssociation != null)
                        {
                            associationName = professionalAssociation.Name;
                        }
                    }

                    //if (string.IsNullOrEmpty(currentFirm.DocumentFooterContent))
                    //if (currentFirm.DocumentFooterContent == null) //only test null, empty may be a value entered by user (if he doesn't want any doc footer)
                    if (!currentFirm.DocumentFooterUpdatedByUser.HasValue
                        || (currentFirm.DocumentFooterUpdatedByUser.HasValue && !currentFirm.DocumentFooterUpdatedByUser.Value))
                    {
                        var optionValueOrias = Business.Configuration.FirmInstitutionOptionBL.GetFirmInstitutionOptionAttributeValueByFirmAndIdOptionAttribute(currentFirm.idFirmInstitution, 1);
                        var orias = optionValueOrias == null ? "" : optionValueOrias.Value;

                        var optionValueCif = Business.Configuration.FirmInstitutionOptionBL.GetFirmInstitutionOptionAttributeValueByFirmAndIdOptionAttribute(currentFirm.idFirmInstitution, 2);
                        var cif = optionValueCif == null ? "" : optionValueCif.Value;

                        var optionValueCnil = Business.Configuration.FirmInstitutionOptionBL.GetFirmInstitutionOptionAttributeValueByFirmAndIdOptionAttribute(currentFirm.idFirmInstitution, 64);
                        var cnil = optionValueCnil == null ? "" : optionValueCnil.Value;

                        string fullAddress = string.Format("{0} {1} {2}", currentFirm.FirmStreet, currentFirm.FirmPostCode, currentFirm.FirmCity);
                        string legalForm = string.Empty;
                        legalForm = !string.IsNullOrEmpty(currentFirm.LegalForm) && currentFirm.LegalForm.CompareTo("AUTRE") == 0 ? currentFirm.LegalForm_Other : currentFirm.LegalForm;

                        var optionAssureurFin = Business.Configuration.FirmInstitutionOptionBL.GetFirmInstitutionOptionAttributeValueByFirmAndIdOptionAttribute(currentFirm.idFirmInstitution, 65);
                        var assureurFin = optionAssureurFin == null ? string.Empty : optionAssureurFin.Value;

                        var optionAssureurImmo = Business.Configuration.FirmInstitutionOptionBL.GetFirmInstitutionOptionAttributeValueByFirmAndIdOptionAttribute(currentFirm.idFirmInstitution, 71);
                        var assureurImmo = optionAssureurImmo == null ? string.Empty : optionAssureurImmo.Value;

                        string assureur = string.Empty;

                        if (!string.IsNullOrEmpty(assureurFin) && !string.IsNullOrEmpty(assureurImmo))
                            assureur = assureurFin;
                        else if (!string.IsNullOrEmpty(assureurFin))
                            assureur = assureurFin;
                        else if (!string.IsNullOrEmpty(assureurImmo))
                            assureur = assureurImmo;

                        var content = string.Empty;
                        if (SessionManager.GetHostCodeSession() == PageLanguageHelper.HostCode.FR.ToString())
                        {
                            content = string.Format(LanguageData.GetContent("FIDocFooter_pied_page_text"), currentFirm.FirmInstitutionName, legalForm, currentFirm.ShareCapital, fullAddress, currentFirm.NAF, currentFirm.NAF_APE, currentFirm.SIRET, currentFirm.RCS, orias, cif, /*currentFirm.AssociationProfessional*/ associationName, currentFirm.NumeroAssuranceQBE, currentFirm.NumeroTVAIntracommunautaire, cnil, currentFirm.FirmPhone, currentFirm.Fax, assureur);
                        }
                        else
                        {
                            content = string.Format(LanguageData.GetContent("FIDocFooter_pied_page_text"), currentFirm.FirmInstitutionName, legalForm, currentFirm.ShareCapital, fullAddress, currentFirm.NAF, currentFirm.NAF_APE, orias, associationName, assureur, currentFirm.NumeroAssuranceQBE, currentFirm.NumeroTVAIntracommunautaire, cnil, currentFirm.FirmPhone, currentFirm.Fax);

                        }
                        //content = content.Replace("\n", "\r\n");
                        model.FirmInstitution.DocumentFooterContent = content;

                        //Save
                        currentFirm = FirmInstitutionBL.UpdateFirmInstitution(currentFirm.idFirmInstitution, "FirmInstitution.DocumentFooterContent", content);
                        currentFirm = FirmInstitutionBL.UpdateFirmInstitution(currentFirm.idFirmInstitution, "FirmInstitution.DocumentFooterUpdatedByUser", "0");

                        Business.Utility.SessionManager.SetSelectedFirmInstitutionSession(currentFirm);
                    }
                    return View("DocFooter", model);
                }
            }
            catch (Exception ex)
            {
                Business.Log.Log.AppendException(ex);
            }

            return RedirectToAction("Login", "User");
        }
        public ActionResult FIPricing(FIDetailModel _model)
        {
            var currentFirm = SessionManager.GetSelectedFirmInstitutionSession();
            if (currentFirm != null)
            {
                var model = new FIDetailModel(currentFirm);

                List<int> parentID = new List<int>() { 105, 113 };

                //Get Options and OptionAttributes
                foreach (int id in parentID)
                {
                    model.Option.AddRange(Business.Option.OptionBL.GetOptionsByIdParent(id));
                }

                //Update Option here
                UpdateInstitutionOptions(model);

                //Get OptionValues and OptionAttributeValues
                foreach (int id in parentID)
                {
                    var optionValue = Business.Configuration.FirmInstitutionOptionBL.GetOptionValueListWithIdFirmInstitutionAndIdParentOption(model.FirmInstitution.idFirmInstitution, id);
                    if (optionValue != null) model.OptionValue.AddRange(optionValue);
                }

                model.FIOption = CreateOptValModel(model.Option, model.OptionValue);
                return View("FIPricing", model);
            }
            else
            {
                return RedirectToAction("Etablissement");
            }
        }
        public ActionResult FIBusiness(FIDetailModel _model)
        {
            var currentFirm = SessionManager.GetSelectedFirmInstitutionSession();
            if (currentFirm != null)
            {
                var model = new FIDetailModel(currentFirm);

                List<int> parentID = new List<int>() { 1, 2, 40, 71, 1192, 1233 };

                //Get Options and OptionAttributes
                foreach (int id in parentID)
                {
                    model.Option.AddRange(Business.Option.OptionBL.GetOptionsByIdParent(id));
                }

                //Update Option here
                UpdateInstitutionOptions(model);

                //Get OptionValues and OptionAttributeValues
                foreach (int id in parentID)
                {
                    var optionValue = Business.Configuration.FirmInstitutionOptionBL.GetOptionValueListWithIdFirmInstitutionAndIdParentOption(model.FirmInstitution.idFirmInstitution, id);
                    if (optionValue != null) model.OptionValue.AddRange(optionValue);
                }

                model.InstitutionEnumSteDeGestion = Upsilab.Business.Custom.CustomEnumBL.GetCustomEnumByIdEnumType(18, 1);
                model.InstitutionEnumPrestServInv = Upsilab.Business.Custom.CustomEnumBL.GetCustomEnumByIdEnumType(19, 1);
                model.InstitutionEnumEtabDePaiement = Upsilab.Business.Custom.CustomEnumBL.GetCustomEnumByIdEnumType(20, 1);
                model.InstitutionEnumEtabDeCredit = Upsilab.Business.Custom.CustomEnumBL.GetCustomEnumByIdEnumType(21, 1);
                // model.InstitutionEnumCompFinancieres --> Données pas encore communiquées
                model.FIOption = CreateOptValModel(model.Option, model.OptionValue);
                return View("FIBusiness", model);
            }
            else
            {
                return RedirectToAction("Etablissement");
            }
        }
        public ActionResult FIInvestment(FIDetailModel _model)
        {
            var currentFirm = SessionManager.GetSelectedFirmInstitutionSession();
            if (currentFirm != null)
            {
                var model = new FIDetailModel(currentFirm);

                model.Option.AddRange(Business.Option.OptionBL.GetOptionsByIdParent(77));

                //Update Option here
                UpdateInstitutionOptions(model);

                var optionValue77 = Business.Configuration.FirmInstitutionOptionBL.GetOptionValueListWithIdFirmInstitutionAndIdParentOption(model.FirmInstitution.idFirmInstitution, 77);
                if (optionValue77 != null) model.OptionValue.AddRange(optionValue77);

                model.FIOption = CreateOptValModel(model.Option, model.OptionValue);
                return View("FIInvestment", model);
            }
            else
            {
                return RedirectToAction("Etablissement");
            }


        }
        public ActionResult Index()
        {
            var selectedfirmInstitution = SessionManager.GetSelectedFirmInstitutionSession();
            if (selectedfirmInstitution != null)
            {
                var FirmModel = new FIDetailModel(selectedfirmInstitution);
                var _association = FirmInstitutionBL.GetFirmInstitutionProfessionalAssociation(selectedfirmInstitution.idFirmInstitution);
                if (_association != null) FirmModel.ProfessionalAssociation = _association;

                return View("Index", FirmModel);
            }
            else
            {
                return RedirectToAction("Etablissement");
            }
        }
        public bool UpdateInstitutionOptions(FIDetailModel model)
        {
            List<FirmInstitutionOptionValue> SelectedOptions = GetSelectedOptionValues(model);
            string cifPartenaires = string.Empty;

            //if (Request.Params["txt_41_3"] != null)
            //{
            //    cifPartenaires = Request.Params["txt_41_3"].ToString();
            //    var firmOptValue = SelectedOptions.Where(f => f.idOption == 41).FirstOrDefault();
            //    //FirmInstitutionOptionValue firmOptValue = new FirmInstitutionOptionValue();
            //    //firmOptValue.idOption = 41;
            //    //firmOptValue.FirmInstitution = model.FirmInstitution;


            //    var _selectedOpt = model.Option.Where(o => o.idOption.Equals(41)).FirstOrDefault();
            //    if (_selectedOpt != null)
            //    {
            //        foreach (var selectedOptAttr in _selectedOpt.OptionAttribute)
            //        {
            //            var optAttrValues = GetSetAttributeValuesByOptionAttr(model, selectedOptAttr);
            //            foreach (var optAttrVal in optAttrValues)
            //            {
            //                firmOptValue.FirmInstitutionOptionAttributeValue.Add(optAttrVal);
            //            }
            //        }
            //    }
            //}

            // par Bloc
            foreach (var selectedOpt in SelectedOptions)
            {
                //selectedOpt.FirmInstitutionOptionAttributeValue = new System.Data.Objects.DataClasses.EntityCollection<FirmInstitutionOptionAttributeValue>();
                var _selectedOpt = model.Option.Where(o => o.idOption.Equals(selectedOpt.idOption)).FirstOrDefault();
                if (_selectedOpt != null)
                {
                    foreach (var selectedOptAttr in _selectedOpt.OptionAttribute)
                    {
                        var optAttrValues = GetSetAttributeValuesByOptionAttr(model, selectedOptAttr);
                        foreach (var optAttrVal in optAttrValues)
                        {
                            selectedOpt.FirmInstitutionOptionAttributeValue.Add(optAttrVal);
                        }
                    }
                }
            }
            bool retVal = true;
            try
            {
                retVal = FirmInstitutionOptionBL.UpdateInstitutionOptions(model.FirmInstitution.idFirmInstitution, SelectedOptions);
            }
            catch (Exception e)
            {
                retVal = false;
                Upsilab.Business.Log.Log.AppendException(e);
            }
            return retVal;

        }
        public List<FirmInstitutionOptionAttributeValue> GetSetAttributeValuesByOptionAttr(FIDetailModel model, OptionAttribute optAttribute)
        {
            List<FirmInstitutionOptionAttributeValue> retVal = new List<FirmInstitutionOptionAttributeValue>();

            string idPrefix = string.Empty;
            if (optAttribute.Datatype.ToLower().Equals("string") || optAttribute.Datatype.ToLower().Equals("int")) idPrefix = "txtAttr_{0}_{1}";
            else if (optAttribute.Datatype.ToLower().Equals("datetime")) idPrefix = "dtAttr_{0}_{1}";
            else if (optAttribute.Datatype.ToLower().Equals("multiline")) idPrefix = "txtAttr_{0}_{1}";
            else if
                (optAttribute.Datatype.ToLower().Equals("institution")) idPrefix = "txtAttr_{0}_{1}";

            string postDataName = string.Format(idPrefix, optAttribute.idOption, optAttribute.idOptionAttribute);
            if (!string.IsNullOrEmpty(Request.Params[postDataName]))
            {
                //string dataValue = Request.Params[postDataName];

                if (optAttribute.Datatype.ToLower().Equals("institution"))
                {
                    if (!string.IsNullOrEmpty(Request.Params[postDataName]))
                    {
                        string dataValue = string.Empty;
                        string[] vals = Request.Params[postDataName].Split(',');
                        string finals = string.Empty;

                        foreach (var v in vals)
                        {
                            if (!finals.Contains(v))
                                finals = finals + "," + v;
                        }

                        FirmInstitutionOptionAttributeValue optAttrVal = new FirmInstitutionOptionAttributeValue();
                        optAttrVal.idFirmInstitution = model.FirmInstitution.idFirmInstitution;
                        optAttrVal.idOptionAttrbiute = optAttribute.idOptionAttribute;
                        optAttrVal.Value = finals.Trim().Trim(',');
                        retVal.Add(optAttrVal);
                    }
                }
                else
                {
                    FirmInstitutionOptionAttributeValue optAttrVal = new FirmInstitutionOptionAttributeValue();
                    optAttrVal.idFirmInstitution = model.FirmInstitution.idFirmInstitution;
                    optAttrVal.idOptionAttrbiute = optAttribute.idOptionAttribute;
                    optAttrVal.Value = Request.Params[postDataName];
                    retVal.Add(optAttrVal);
                }
            }

            return retVal;
        }
        public List<FirmInstitutionOptionValue> GetSelectedOptionValues(FIDetailModel model)
        {
            List<FirmInstitutionOptionValue> retVal = new List<FirmInstitutionOptionValue>();

            var optionParents = model.Option.Where(o => o.idParent.HasValue.Equals(false));
            foreach (var optParent in optionParents)
            {
                var dataExtract = GetSelectedOptionValuesByParent(model, optParent.idOption);
                bool hasNoChildOption = model.Option.Count(o => o.idParent.HasValue && o.idParent.Value.Equals(optParent.idOption)) == 0;
                if (dataExtract.Count > 0 || hasNoChildOption)
                {
                    FirmInstitutionOptionValue newVal = new FirmInstitutionOptionValue();
                    newVal.idFirmInstitution = model.FirmInstitution.idFirmInstitution;
                    newVal.Option = optParent;
                    newVal.idOption = optParent.idOption;
                    retVal.Add(newVal);
                    if (!hasNoChildOption)
                    {
                        retVal.AddRange(dataExtract);
                    }
                }
            }

            return retVal;
        }
        public List<FirmInstitutionOptionValue> GetSelectedOptionValuesByParent(FIDetailModel model, int idParent)
        {
            List<FirmInstitutionOptionValue> retVal = new List<FirmInstitutionOptionValue>();
            var optParent = model.Option.Where(o => o.idOption.Equals(idParent)).FirstOrDefault();
            if (optParent != null)
            {
                var optChildren = model.Option.Where(o => o.idParent.HasValue && o.idParent.Value.Equals(idParent));
                foreach (var optChild in optChildren)
                {
                    bool isSelected = !optParent.SingleOption.HasValue;
                    string idPrefix = string.Empty;
                    if (optParent.SingleOption.HasValue)
                    {
                        if (optParent.SingleOption.Value) idPrefix = "rb_{0}_{1}";
                        else idPrefix = "chk_{0}_{1}";
                        string postDataName = string.Format(idPrefix, optChild.idParent.Value, optChild.idOption);
                        if (!string.IsNullOrEmpty(Request.Params[postDataName]) && Request.Params[postDataName].ToLower().Equals("c"))
                        {
                            isSelected = true;
                        }
                    }

                    if (isSelected)
                    {
                        FirmInstitutionOptionValue newVal = new FirmInstitutionOptionValue();
                        newVal.idFirmInstitution = model.FirmInstitution.idFirmInstitution;
                        newVal.Option = optChild;
                        newVal.idOption = optChild.idOption;
                        retVal.Add(newVal);
                        if (optChild.SingleOption.HasValue)
                        {
                            retVal.AddRange(GetSelectedOptionValuesByParent(model, optChild.idOption));
                        }
                    }

                    if (model.Option.Where(o => o.idParent.HasValue && o.idParent.Value.Equals(optChild.idOption)).Count() > 0)
                    {
                        retVal.AddRange(GetSelectedOptionValuesByParent(model, optChild.idOption));
                    }
                }
            }

            return retVal;
        }