public static int SaveReportOptionValueWithLineNumber(Guid idReport, Upsilab.Data.Model.Option option,
            int idOptionAttribute, string value, string fieldType, string colomnName, int idReportAttributeValue)
        {
            ReportOptionAttributeValue optionAttributeValue = null;
            int idOption = option.idOption;
            bool updateDateUpdated = false;
            string completedStatus = Report.ReportBL.Status.Completed.ToString();
            string waitingForClientUpdateStatus = Report.ReportBL.Status.WaitingForClientUpdate.ToString();

            using (UpsilabEntities db = new UpsilabEntities())
            {
                ReportOptionAttributeValue reportOptionAttrValueToUpdate =
                    db.ReportOptionAttributeValue.FirstOrDefault(
                        x => x.idReportOptionAttributeValue == idReportAttributeValue);

                /* UPDATE */
                if (reportOptionAttrValueToUpdate != null)
                {
                    dynamic customData = reportOptionAttrValueToUpdate.CustomObjectValue;

                    if (customData != null)
                    {
                        bool isTheSameValue = CustomObject.IsTheSameValue(customData, colomnName, value);

                        if (!isTheSameValue)
                        {

                            CustomObject.SetValueByPropertyName(customData, colomnName, value);
                            reportOptionAttrValueToUpdate.CustomObjectValue = customData;
                            reportOptionAttrValueToUpdate.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                            if (reportOptionAttrValueToUpdate.ReportOptionValue!=null)
                            {
                                reportOptionAttrValueToUpdate.ReportOptionValue.DateUpdated = (updateDateUpdated)
                                                        ? DateTime.Now
                                                        : (DateTime?)null; 
                            }

                            
                            //
                        }
                    }
                    optionAttributeValue = reportOptionAttrValueToUpdate;
                }
                /* CREATE */
                else
                {
                    //Get current report
                    Data.Model.Report report = (from rep in db.Report
                                                where rep.idReport == idReport
                                                select rep).FirstOrDefault();

                    //Check if customer has completed report
                    var checkCompletedReport = (from rep in db.Report
                                                where rep.CustomerProspect.idCustomer == report.CustomerProspect.idCustomer
                                                      && rep.Status == completedStatus
                                                select rep).FirstOrDefault();

                    if (checkCompletedReport != null)
                    {
                        updateDateUpdated = true;
                    }

                    //#9262 : Check if customer changes the info after Adviser request
                    if (!updateDateUpdated)
                    {
                        if (report.Status == waitingForClientUpdateStatus && SessionManager.GetUserSession().IsEndUser())
                        {
                            updateDateUpdated = true;
                        }
                    }

                    {
                        //pour agreg
                        ReportOptionAttributeValue agregOptionAttributeValue = null;
                        //

                        ReportOptionValue optionValue = (from rov in db.ReportOptionValue.Include("ReportOptionAttributeValue")
                                                         where rov.idReport == idReport && rov.idOption == idOption
                                                         && rov.ReportOptionAttributeValue.FirstOrDefault(x => x.idReportOptionAttributeValue == idReportAttributeValue).idReportOptionAttributeValue == idReportAttributeValue
                                                         select rov).FirstOrDefault();

                        IList<ReportOptionAttributeValue> lstOptionAttributeValues = new List<ReportOptionAttributeValue>();

                        //Option value ?
                        if (optionValue != null)
                        {
                            lstOptionAttributeValues = new List<ReportOptionAttributeValue>(optionValue.ReportOptionAttributeValue);
                            lstOptionAttributeValues = lstOptionAttributeValues.Where(oav => oav.idOptionAttribute == idOptionAttribute).ToList();
                        }
                        else if (!string.IsNullOrEmpty(value))
                        {
                            optionValue = new ReportOptionValue()
                            {
                                idReport = idReport,
                                idOption = idOption,
                                Value = string.Empty,
                                DateCreated = DateTime.Now,
                                DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                            };

                            //Add ReportOptionValue to DB : don't save yet
                            db.ReportOptionValue.AddObject(optionValue);

                            //Insert parent
                            while (option.idParent.HasValue)
                            {
                                ReportOptionValue optionParentValue = (from rov in db.ReportOptionValue.Include("Option")
                                                                       where rov.idReport == idReport && rov.idOption == option.idParent
                                                                       select rov).FirstOrDefault();

                                if (optionParentValue == null && option.idParent != null)
                                {
                                    optionParentValue = new ReportOptionValue()
                                    {
                                        idReport = idReport,
                                        idOption = option.idParent.Value,
                                        Value = string.Empty,
                                        DateCreated = DateTime.Now,
                                        DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                    };

                                    //Add ReportOptionValue to DB : don't save yet
                                    db.ReportOptionValue.AddObject(optionParentValue);

                                    //Check if this parent option has already parent ?
                                    option = optionParentValue.Option;
                                }
                                else
                                {
                                    optionParentValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                                    break;
                                }
                            }
                        }

                        

                        //Get target option attribute
                        if (lstOptionAttributeValues.Any())
                        {
                            //Line already in database
                            ReportOptionAttributeValue reportOptionAttrValue = lstOptionAttributeValues.FirstOrDefault();
                            dynamic customData = reportOptionAttrValue.CustomObjectValue;

                            if (customData != null)
                            {
                                bool isTheSameValue = CustomObject.IsTheSameValue(customData, colomnName, value);

                                if (!isTheSameValue)
                                {

                                    CustomObject.SetValueByPropertyName(customData, colomnName, value);
                                    reportOptionAttrValue.CustomObjectValue = customData;
                                    reportOptionAttrValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                                    reportOptionAttrValue.ReportOptionValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                                    //pour agreg
                                    agregOptionAttributeValue = reportOptionAttrValue;
                                    optionAttributeValue = reportOptionAttrValue;
                                    //
                                }
                            }

                        }
                        else
                        {
                            //Get Custom datatype columns
                            List<string> customAttribute = OptionBL.GetCustomAttributeNames(fieldType);

                            if (customAttribute.Count > 0)
                            {
                                dynamic customData = new Upsilab.Data.Model.CustomObject();
                                dynamic customDataEmpty = new Upsilab.Data.Model.CustomObject();

                                foreach (string itemColumnName in customAttribute)
                                {
                                    string _strVal = string.Empty;

                                    if (itemColumnName == colomnName)
                                    {
                                        _strVal = value;
                                        CustomObject.SetValueByPropertyName(customData, itemColumnName, _strVal);
                                        CustomObject.SetValueByPropertyName(customDataEmpty, itemColumnName, string.Empty);
                                    }
                                }


                                bool createOptionAttr = true;
                                //Create empty lines
                                if (lstOptionAttributeValues.Count == 0)
                                {
                                    optionAttributeValue = new ReportOptionAttributeValue()
                                    {
                                        idReport = idReport,
                                        idOptionAttribute = idOptionAttribute,
                                        idReportOptionValue = optionValue.idReportOptionValue,
                                        DateCreated = DateTime.Now,
                                        DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                    };

                                    optionAttributeValue.CustomObjectValue = customData;

                                    lstOptionAttributeValues.Add(optionAttributeValue);
                                    //optionValue.ReportOptionAttributeValue.Add(optionAttributeValue);
                                }

                                if (optionAttributeValue == null)
                                //if (createOptionAttr)
                                {
                                    //Add new line
                                    //Insert optionattrubutevalue
                                    optionAttributeValue = new ReportOptionAttributeValue()
                                    {
                                        idReport = idReport,
                                        idOptionAttribute = idOptionAttribute,
                                        idReportOptionValue = optionValue.idReportOptionValue,
                                        DateCreated = DateTime.Now,
                                        DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                    };

                                    optionAttributeValue.CustomObjectValue = customData;

                                    //pour agreg
                                    agregOptionAttributeValue = optionAttributeValue;
                                    //
                                }
                                else
                                {
                                    customData = optionAttributeValue.CustomObjectValue;

                                    if (customData != null)
                                    {
                                        bool isTheSameValue = CustomObject.IsTheSameValue(customData, colomnName, value);

                                        if (!isTheSameValue)
                                        {
                                            CustomObject.SetValueByPropertyName(customData, colomnName, value);
                                            optionAttributeValue.CustomObjectValue = customData;
                                            optionAttributeValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                                            optionAttributeValue.ReportOptionValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                                            //pour agreg
                                            agregOptionAttributeValue = optionAttributeValue;
                                            //
                                        }
                                    }
                                }

                                //Add ReportOptionAttributeValue to DB : don't save yet
                                optionValue.ReportOptionAttributeValue.Add(optionAttributeValue);

                            }
                        }
                        

                        //#region Save patrimoine from Recueil/lab to Agregateur
                        ////update/add ag_upsideo_compte
                        //if (report.CustomerProspect.User1.idLicenseAgreg.HasValue && report.CustomerProspect.User1.idAgregCGP.HasValue
                        //    && (idOptionAttribute == 204 || idOptionAttribute == 205 || idOptionAttribute == 206)
                        //    && report.CustomerProspect.FirmInstitution.ag_upsideo_cabinet != null)
                        //{
                        //    //Les ids en cours : agregCabinet, agregCGP et agregClient
                        //    Guid idAgregCGP = report.CustomerProspect.User1.idAgregCGP.Value;
                        //    Guid idAgregCabinet = report.CustomerProspect.FirmInstitution.ag_upsideo_cabinet.idcrmcabinet;
                        //    Guid currentAgregClientId = Guid.Empty;

                        //    if (report.CustomerProspect.idAgregClient.HasValue)
                        //    {
                        //        currentAgregClientId = report.CustomerProspect.idAgregClient.Value;
                        //    }
                        //    else
                        //    {
                        //        ag_upsideo_client clientAgregToAdd = new ag_upsideo_client()
                        //        {
                        //            idclient = Guid.NewGuid(),
                        //            idcgp = idAgregCGP,
                        //            nomclient = report.CustomerProspect.User.UserName,
                        //            prenomclient = report.CustomerProspect.User.UserFirstName,
                        //            adr = report.CustomerProspect.Adress,
                        //            cp = report.CustomerProspect.ZipCode,
                        //            ville = report.CustomerProspect.City,
                        //            titre = report.CustomerProspect.Title,
                        //            ddn = DateTime.Now,
                        //            deleted = "n"
                        //        };

                        //        db.ag_upsideo_client.AddObject(clientAgregToAdd);

                        //        report.CustomerProspect.idAgregClient = clientAgregToAdd.idclient;
                        //        currentAgregClientId = clientAgregToAdd.idclient;
                        //    }

                        //    //Fournisseur de l'actif : comme il s'agit de données provenant du "Recueil/LAB", mettre "UPSIDEO" comme fournisseur fictif (pour chaque cabinet / etablissement)
                        //    //Get fournisseur
                        //    ag_upsideo_fournisseur agregFournisseur = db.ag_upsideo_fournisseur.Where(f => f.idcrmcabinet == report.CustomerProspect.FirmInstitution.ag_upsideo_cabinet.idcrmcabinet
                        //                                                                              && f.nomfournisseur == Business.Agreg.agupsideocompteBL.FournisseurUpsideo).FirstOrDefault();

                        //    if (agregFournisseur == null)
                        //    {
                        //        agregFournisseur = new ag_upsideo_fournisseur()
                        //        {
                        //            idcrmcabinet = idAgregCabinet,
                        //            nomfournisseur = Business.Agreg.agupsideocompteBL.FournisseurUpsideo,
                        //            cleAgreg = Business.Agreg.agupsideocompteBL.FournisseurUpsideo.ToLower(),
                        //            deleted = "n",
                        //        };

                        //        //TODO : to delete : normalement à faire lors de la souscription mais garder ce code pour test
                        //        //Insertion fournisseur avec un autre contexte
                        //        using (UpsilabEntities dbTemp = new UpsilabEntities())
                        //        {
                        //            dbTemp.ag_upsideo_fournisseur.AddObject(agregFournisseur);
                        //            dbTemp.SaveChanges();
                        //        }
                        //    }

                        //    //num compte fictif dans table compte Agreg
                        //    string numCompteFictif = string.Empty;
                        //    numCompteFictif = string.Format("{0}_{1}", idOptionAttribute.ToString(), lineNumber.Value.ToString());

                        //    //teste si existe déjà (maj) si no new
                        //    ag_upsideo_compte currentCompte = db.ag_upsideo_compte.Where(c => c.idclient == currentAgregClientId && c.numcompte == numCompteFictif).FirstOrDefault();

                        //    //maj
                        //    if (currentCompte != null && agregOptionAttributeValue != null)
                        //    {
                        //        switch (idOptionAttribute)
                        //        {
                        //            case 204:
                        //            case 205:
                        //                {
                        //                    currentCompte.designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"];
                        //                    currentCompte.dateacquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"]) : null;
                        //                    currentCompte.valeuracquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"]) : null;
                        //                    currentCompte.totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"]) : null;
                        //                    currentCompte.idfrontfournisseur = agregFournisseur.idfrontfournisseur;
                        //                    currentCompte.type = "n"; //pour l'instant : non géré
                        //                }
                        //                break;
                        //            case 206:
                        //                currentCompte.designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"];
                        //                currentCompte.totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"]) : null;
                        //                currentCompte.idfrontfournisseur = agregFournisseur.idfrontfournisseur;
                        //                currentCompte.type = "n"; //pour l'instant : non géré
                        //                break;
                        //            default:
                        //                break;

                        //        }
                        //    }
                        //    //new
                        //    else if (currentCompte == null && agregOptionAttributeValue != null)
                        //    {
                        //        switch (idOptionAttribute)
                        //        {
                        //            case 204:
                        //            case 205:
                        //                {
                        //                    currentCompte = new ag_upsideo_compte()
                        //                    {
                        //                        idclient = currentAgregClientId,
                        //                        idcgp = report.CustomerProspect.User1.idAgregCGP.Value,
                        //                        idfrontfournisseur = agregFournisseur.idfrontfournisseur,
                        //                        numcompte = numCompteFictif,
                        //                        typecontrat = "bien immobilier",
                        //                        deleted = "n",

                        //                        designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"],
                        //                        dateacquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"]) : null,
                        //                        valeuracquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"]) : null,
                        //                        totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"]) : null
                        //                    };
                        //                    if (!string.IsNullOrEmpty(agregOptionAttributeValue.CustomObjectValue.Values["Description"]))
                        //                    {
                        //                        db.ag_upsideo_compte.AddObject(currentCompte);
                        //                    }

                        //                }
                        //                break;

                        //            case 206:
                        //                {
                        //                    currentCompte = new ag_upsideo_compte()
                        //                    {
                        //                        idclient = currentAgregClientId,
                        //                        idcgp = report.CustomerProspect.User1.idAgregCGP.Value,
                        //                        idfrontfournisseur = agregFournisseur.idfrontfournisseur,
                        //                        numcompte = numCompteFictif,
                        //                        typecontrat = "professionels",
                        //                        deleted = "n",

                        //                        designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"],
                        //                        totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"]) : null

                        //                    };
                        //                    if (!string.IsNullOrEmpty(agregOptionAttributeValue.CustomObjectValue.Values["Description"]))
                        //                    {
                        //                        db.ag_upsideo_compte.AddObject(currentCompte);
                        //                    }
                        //                }
                        //                break;
                        //            default:
                        //                break;

                        //        }
                        //    }
                        //}
                        //#endregion


                    }

                    #region Report
                    //5- Update dateupdated report               
                    report.DateUpdated = DateTime.Now;
                    #endregion 
                }

                //6- Commit all changes here
                db.SaveChanges();

                return optionAttributeValue!=null ? optionAttributeValue.idReportOptionAttributeValue : 0;
            }
        }
        private static void SetOptionToSave(Guid idReport, Upsilab.Data.Model.Option option, OptionAttribute optionAttribute, string value, string fieldType, List<ReportOptionValue> lstOptionValues, UpsilabEntities db)
        {
            if (option == null && optionAttribute == null)
            {
                return; //ce cas ne doit pas se présenter
            }

            string action = string.Empty;

            ReportOptionValue optionValue = null;
            ReportOptionAttributeValue optionAttributeValue = null;

            //1- Champ
            #region TXT
            if (fieldType == "txt")
            {
                //Do nothing if value is null. Don't check empty because it's a value :) ?
                if (value == null)
                {
                    return;
                }

                optionValue = lstOptionValues.Where(rov => rov.idOption == optionAttribute.idOption).FirstOrDefault();

                if (optionValue == null)
                {
                    action = "I";
                }
                else
                {
                    optionAttributeValue = optionValue.ReportOptionAttributeValue.Where(roav => roav.idOptionAttribute == optionAttribute.idOptionAttribute).FirstOrDefault();
                    if (optionAttributeValue == null)
                    {
                        action = "I";
                    }
                    else
                    {
                        //No need to add if the same value
                        if (optionAttributeValue.Value != value)
                        {
                            optionAttributeValue.Value = value;
                            //optionAttributeValue.DateUpdated = DateTime.Now; TODO

                            //TODO
                            //db.ReportOptionAttributeValue.Attach(optionAttributeValue);
                            //db.ObjectStateManager.ChangeObjectState(optionAttributeValue, System.Data.EntityState.Modified);
                            //db.SaveChanges();
                        }
                    }
                }

                if (action == "I")
                {
                    //Check if reportOptionValue exists
                    if (optionValue == null) //insert option value
                    {
                        optionValue = new ReportOptionValue()
                        {
                            idReport = idReport,
                            idOption = option.idOption,
                            Value = string.Empty,
                            DateCreated = DateTime.Now,
                        };

                        //Add ReportOptionValue to DB : don't save yet
                        lstOptionValues.Add(optionValue);

                        db.ReportOptionValue.Attach(optionValue);
                        db.ObjectStateManager.ChangeObjectState(optionValue, System.Data.EntityState.Added);

                        //Insert parent ??
                        List<ReportOptionValue> lstParents = GetParentOptionToAdd(idReport, lstOptionValues, option);
                        foreach (var optionParentValue in lstParents)
                        {
                            lstOptionValues.Add(optionParentValue);

                            //db.ReportOptionValue.Attach(optionParentValue);
                            //db.ObjectStateManager.ChangeObjectState(optionValue, System.Data.EntityState.Added);

                            db.ReportOptionValue.AddObject(optionParentValue);
                        }
                    }

                    //Insert optionattrubutevalue
                    ReportOptionAttributeValue newReportOptionAttributeValue = new ReportOptionAttributeValue()
                    {
                        idReport = idReport,
                        idOptionAttribute = optionAttribute.idOptionAttribute,
                        idReportOptionValue = optionValue.idReportOptionValue,
                        Value = value,
                        DateCreated = DateTime.Now,
                    };

                    //Add ReportOptionAttributeValue to DB : don't save yet
                    optionValue.ReportOptionAttributeValue.Add(newReportOptionAttributeValue);
                }
            }
            #endregion

            //2- Radio
            #region RB
            //2- Save option attribute value (Radio button)
            else if (fieldType == "rb")
            {
                //No need to delete if it's the option
                optionValue = lstOptionValues.Where(rov => rov.idOption == option.idOption).FirstOrDefault();
                if (optionValue == null)
                {
                    //Delete old rb
                    IList<ReportOptionValue> optionValues = (from rov in lstOptionValues
                                                             where rov.Option.idParent == option.idParent
                                                             select rov).ToList();

                    //Delete option attribute values attached to option value
                    if (optionValues != null)
                    {
                        foreach (var itemOptionValue in optionValues)
                        {
                            IList<ReportOptionAttributeValue> lstOptionAttributeValues = new List<ReportOptionAttributeValue>(itemOptionValue.ReportOptionAttributeValue);
                            foreach (var item in lstOptionAttributeValues)
                            {
                                var optionAttrValueToBeDel = itemOptionValue.ReportOptionAttributeValue.Where(oa => oa.idReportOptionAttributeValue == item.idReportOptionAttributeValue).FirstOrDefault();

                                db.ReportOptionAttributeValue.DeleteObject(optionAttrValueToBeDel);
                            }

                            lstOptionValues.Remove(itemOptionValue);

                            db.ReportOptionValue.DeleteObject(itemOptionValue);

                            //Delete child option value
                            IList<ReportOptionValue> lstOptionValuesChild = (from rov in lstOptionValues
                                                                             where rov.Option.idParent == itemOptionValue.idOption
                                                                             select rov).ToList();

                            if (lstOptionValuesChild != null)
                            {
                                foreach (var optionValueChild in lstOptionValuesChild)
                                {
                                    lstOptionAttributeValues = new List<ReportOptionAttributeValue>(optionValueChild.ReportOptionAttributeValue);
                                    foreach (var item in lstOptionAttributeValues)
                                    {
                                        var optionAttrValueToBeDel = optionValueChild.ReportOptionAttributeValue.Where(oa => oa.idReportOptionAttributeValue == item.idReportOptionAttributeValue).FirstOrDefault();

                                        db.ReportOptionAttributeValue.DeleteObject(optionAttrValueToBeDel);
                                    }

                                    lstOptionValues.Remove(optionValueChild);

                                    db.ReportOptionValue.DeleteObject(optionValueChild);
                                }
                            }
                        }

                    }

                    //Insert new rb
                    ReportOptionValue newOptionValue = new ReportOptionValue()
                    {
                        idReport = idReport,
                        idOption = option.idOption,
                        Value = string.Empty,
                        DateCreated = DateTime.Now,
                    };

                    //Add ReportOptionValue to DB : don't save yet
                    lstOptionValues.Add(newOptionValue);

                    db.ReportOptionValue.AddObject(newOptionValue);

                    //Insert parent
                    List<ReportOptionValue> lstParents = GetParentOptionToAdd(idReport, lstOptionValues, option);
                    foreach (var optionParentValue in lstParents)
                    {
                        lstOptionValues.Add(optionParentValue);

                        db.ReportOptionValue.AddObject(optionParentValue);
                    }
                }
            }
            #endregion

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="reportIdDest"></param>
        /// <param name="lstReportOptionValuesSource"></param>
        public static void SaveReportOptionValues(Upsilab.Data.Model.Report reportDest, List<ReportOptionValue> lstReportOptionValuesSource)
        {
            //Insert new OptionValue
            using (UpsilabEntities db = new UpsilabEntities())
            {
                foreach (var reportOptionValueSource in lstReportOptionValuesSource)
                {
                    //1- Report option value
                    ReportOptionValue newReportOptionValue = new ReportOptionValue()
                    {
                        idReport = reportDest.idReport,
                        idOption = reportOptionValueSource.idOption,
                        Value = string.Empty,
                        DateCreated = DateTime.Now,
                    };

                    //Add ReportOptionValue to DB : don't save yet
                    db.ReportOptionValue.AddObject(newReportOptionValue);

                    if (reportOptionValueSource.ReportOptionAttributeValue.Count > 0)
                    {
                        //2- Report option attribute value
                        foreach (var reportOptAttrValueSource in reportOptionValueSource.ReportOptionAttributeValue)
                        {
                            ReportOptionAttributeValue newReportOptionAttrValue = new ReportOptionAttributeValue()
                            {
                                idReport = reportDest.idReport,
                                idOptionAttribute = reportOptAttrValueSource.idOptionAttribute,
                                idReportOptionValue = newReportOptionValue.idReportOptionValue,
                                Value = reportOptAttrValueSource.Value,
                                DateCreated = DateTime.Now,
                            };

                            //Add ReportOptionAttributeValue to DB : don't save yet
                            newReportOptionValue.ReportOptionAttributeValue.Add(newReportOptionAttrValue);
                        }
                    }
                }

                //3- Commit all changes here
                db.SaveChanges();
            }

        }
        public static bool UpdateReportOptions(Guid idReport, List<ReportOptionValue> SelectedOptions)
        {
            // Particular case for mobile 151, email 152
            Upsilab.Data.Model.Report report = ReportBL.GetReportById(idReport);
            Upsilab.Data.Model.User userClient = report.CustomerProspect.User;
            bool saveDataUser = false;
            //

            bool retVal = true;
            try
            {
                var parentOptions = SelectedOptions.Where(so => so.Option.idParent.HasValue.Equals(false));
                foreach (var parentOption in parentOptions)
                {

                    List<Data.Model.Option> optList = OptionBL.GetOptionsByIdParent(parentOption.idOption); //TODO

                    #region Delete existing OptionAttributeValue under Parent
                    List<ReportOptionAttributeValue> toBeDeletedAttr = new List<ReportOptionAttributeValue>();
                    using (UpsilabEntities retrieveContext = new UpsilabEntities())
                    {
                        foreach (var opt in optList)
                        {
                            var deleteAttr = (from toBeDel in retrieveContext.ReportOptionAttributeValue.ToList()
                                              join o in opt.OptionAttribute on toBeDel.idOptionAttribute equals o.idOptionAttribute
                                              where toBeDel.idReport.Equals(idReport)
                                              select toBeDel).ToList();
                            toBeDeletedAttr.AddRange(deleteAttr);
                        }

                        foreach (var toBeDel in toBeDeletedAttr)
                        {
                            retrieveContext.ReportOptionAttributeValue.DeleteObject(toBeDel);
                            retrieveContext.SaveChanges();
                        }

                        //Commit all changes here
                        //retrieveContext.SaveChanges();
                    }
                    #endregion

                    //Delete existing OptionValue under Parent
                    List<ReportOptionValue> toBeDeletedOpt = new List<ReportOptionValue>();
                    using (UpsilabEntities retrieveContext = new UpsilabEntities())
                    {
                        toBeDeletedOpt = (from toBeDel in retrieveContext.ReportOptionValue.ToList()
                                          join opt in optList on toBeDel.idOption equals opt.idOption
                                          where toBeDel.idReport.Equals(idReport)
                                          select toBeDel).ToList();

                        foreach (var toBeDel in toBeDeletedOpt)
                        {
                            retrieveContext.ReportOptionValue.DeleteObject(toBeDel);
                            retrieveContext.SaveChanges();
                        }

                        //Commit all changes here
                        //retrieveContext.SaveChanges();
                    }
                }

                #region Update OptionValue
                //Insert new OptionValue
                using (UpsilabEntities insertContext = new UpsilabEntities())
                {
                    foreach (var toBeAdded in SelectedOptions)
                    {
                        ReportOptionValue newVal = new ReportOptionValue();
                        newVal.idReport = idReport;
                        newVal.idOption = toBeAdded.idOption;
                        newVal.Value = string.Empty;

                        insertContext.ReportOptionValue.AddObject(newVal);
                        insertContext.SaveChanges();

                        if (toBeAdded.ReportOptionAttributeValue.Count > 0)
                        {
                            foreach (var optAttr in toBeAdded.ReportOptionAttributeValue)
                            {
                                ReportOptionAttributeValue newAttVal = new ReportOptionAttributeValue();
                                newAttVal.idReport = idReport;
                                newAttVal.idOptionAttribute = optAttr.idOptionAttribute;
                                newAttVal.idReportOptionValue = newVal.idReportOptionValue;
                                newAttVal.Value = optAttr.Value;

                                insertContext.ReportOptionAttributeValue.AddObject(newAttVal);
                                insertContext.SaveChanges();

                                //----- Particular cas for field existing in table USER : Mobile and email
                                //151 PP mobile. 391 PM Mobile
                                //152 PP email. 392 PM email
                                if (optAttr.idOptionAttribute == 151 || optAttr.idOptionAttribute == 391)
                                {
                                    userClient.UserMobilePhone = optAttr.Value;
                                    saveDataUser = true;
                                }
                                if (optAttr.idOptionAttribute == 152 || optAttr.idOptionAttribute == 392)
                                {
                                    userClient.UserEmail = optAttr.Value;
                                    saveDataUser = true;
                                }
                                //-----
                            }
                        }
                    }

                    //Commit all changes here
                    //insertContext.SaveChanges();
                }

                if (saveDataUser)
                {
                    if (!UserBL.IsEmailUsed(userClient.UserEmail, userClient))
                        Upsilab.Business.User.UserBL.UpdateUser(userClient);
                }
                #endregion
            }
            catch (Exception e)
            {
                retVal = false;
                Log.Log.AppendException(e);
            }
            return retVal;
        }
        public static List<ReportOptionValue> GetParentOptionToAdd(Guid idReport, List<ReportOptionValue> lstOptionValues, Data.Model.Option option)
        {
            List<ReportOptionValue> lstParentOptionValues = new List<ReportOptionValue>();

            using (UpsilabEntities db = new UpsilabEntities())
            {
                //Insert parent ??
                while (option.idParent.HasValue)
                {
                    ReportOptionValue optionParentValue = (from rov in lstOptionValues
                                                           where rov.idOption == option.idParent
                                                           select rov).FirstOrDefault();

                    if (optionParentValue == null)
                    {
                        optionParentValue = new ReportOptionValue()
                        {
                            idReport = idReport,
                            idOption = option.idParent.Value,
                            Value = string.Empty,
                            DateCreated = DateTime.Now,
                        };

                        lstParentOptionValues.Add(optionParentValue);

                        //Check if this parent option has already parent ?
                        option = OptionBL.GetOptionById(optionParentValue.idOption);
                    }
                    else
                    {
                        optionParentValue.DateUpdated = DateTime.Now;
                        break;
                    }
                }
            }

            return lstParentOptionValues;
        }
        //END KIRA 05082014

        private static List<ReportOptionValue> GetOptionValueList(Guid idReport, ReportOptionValue optionValueRoot)
        {

            using (UpsilabEntities context = new UpsilabEntities())
            {
                //var query = ((ObjectQuery<ReportOptionValue>)from optionValue in context.ReportOptionValue.Include("CustomerProspectOptionAttributeValue")
                //                                             join option in context.Option on optionValue.idOption equals option.idOption
                //                                             where optionValue.idReport.Equals(idReport)
                //                                             where option.idParent.Value.Equals(optionValueRoot.idOption)
                //                                             select optionValue).Include("ReportOptionAttributeValue");

                //List<ReportOptionValue> returnValue = new List<ReportOptionValue>();
                //foreach (var optionValue in query.ToList())
                //{
                //    context.LoadProperty(optionValue, "ReportOptionAttributeValue");
                //    returnValue.Add(optionValue);
                //    returnValue.AddRange(GetOptionValueList(idReport, optionValue));
                //}

                //return returnValue;

                IQueryable<ReportOptionValue> ROV = GetOptionValueListQuery.Invoke(context, new GetOptionValueListParams
                {
                    gIdReport = idReport,
                    gOptionValueRoot = optionValueRoot
                });

                List<ReportOptionValue> returnValue = ROV.ToList();
                foreach (var optionValue in returnValue.ToList())
                {
                    returnValue.Add(optionValue);
                    returnValue.AddRange(GetOptionValueList(idReport, optionValue));
                }
                return returnValue;


            }
        }
        private static List<ReportOptionValue> GetOptionValueList(ReportOptionValue optionValueRoot, List<Upsilab.Data.Model.ReportOptionValue> allReportOptionValues)
        {
            var optionValues = (from optionValue in allReportOptionValues
                                where optionValue.Option.idParent == optionValueRoot.idOption
                                select optionValue).ToList();

            List<ReportOptionValue> returnValue = new List<ReportOptionValue>();
            foreach (var optionValue in optionValues)
            {
                returnValue.Add(optionValue);
                returnValue.AddRange(GetOptionValueList(optionValue, allReportOptionValues));
            }

            return returnValue;
        }
         private int SetOptionFor(List<int> lstOptionToInsert, List<int> lstDataToFound, string[] criteria1, string[] criteria2, PageLanguageHelper pageHelper, bool checkData = false)
        {
            int clientsCount = 0;
            //System.Text.StringBuilder sb = new System.Text.StringBuilder();
            try
            {

                using (UpsilabEntities retrieveContext = new UpsilabEntities())
                {

                    var clients = retrieveContext.CustomerProspect.Include("Report").Where(cli => cli.isDeleted.HasValue && !cli.isDeleted.Value && cli.IsCorporation.HasValue &&
                        !cli.IsCorporation.Value);

                    foreach (var cli in clients)
                    {
                        if (cli.Report != null)
                        {
                            // test
                            if (cli.idCustomer.ToString().Equals("656bb16a-6782-41e6-b954-f7c11e5ca54d"))
                            {
                                string found = "";
                            }
                            var latestReport = cli.Report.Where(r => r.Status != "Canceled").OrderByDescending(r => r.DateUpdated).FirstOrDefault();
                            if (latestReport != null)
                            {

                                bool dataFound = false;
                                //if (IsOptionAttribute) //recherche dans la table ReportOptionAttributeValue
                                //{
                                var allAnswers = retrieveContext.ReportOptionAttributeValue.Where(roav => roav.idReport == latestReport.idReport);

                                if (allAnswers.Any())
                                {
                                    foreach (ReportOptionAttributeValue rov in allAnswers)
                                    {
                                        dataFound = IsAnyDataAnd(rov, criteria1);
                                        if (!dataFound && criteria2 !=null && criteria2.Length > 0)
                                        {
                                            dataFound = IsAnyDataAnd(rov, criteria2);
                                        }
                                        if (!dataFound && pageHelper!=null)
                                        {
                                            int idOptionAttribute = 0;
                                            Int32.TryParse(Convert.ToString(rov.idOptionAttribute), out idOptionAttribute);
                                            var obj = Upsilab.Business.Report.ReportOptionBL.GetOptionAttributeById(idOptionAttribute);
                                            if (obj != null)
                                            {
                                                var des = pageHelper.GetContent(obj.NameKey);
                                                dataFound = !string.IsNullOrEmpty(des);
                                            }
                                            
                                        }
                                        if (dataFound) break;
                                    }

                                    
                                }

                                if (dataFound)
                                {
                                    bool insertDone = false;
                                    foreach (int opt in lstOptionToInsert)
                                    {
                                        var isAlreadyChecked = retrieveContext.ReportOptionValue.Any(rov => rov.idReport == latestReport.idReport && rov.idOption == opt);
                                        if (!isAlreadyChecked)
                                        {
                                            ReportOptionValue rov = new ReportOptionValue()
                                            {
                                                idReport = latestReport.idReport,
                                                idOption = opt,
                                                DateCreated = DateTime.Now,
                                                DateUpdated = DateTime.Now,
                                                Value = string.Empty,
                                            };
                                            insertDone = true;
                                            retrieveContext.ReportOptionValue.AddObject(rov);

                                            Option objOption = OptionBL.GetOptionById(opt);
                                            if (objOption != null)
                                            {
                                                while (objOption.idParent.HasValue)
                                                {
                                                    ReportOptionValue optionParentValue =
                                                        (from rov1 in
                                                            retrieveContext.ReportOptionValue.Include("Option")
                                                            where
                                                                rov1.idReport == latestReport.idReport &&
                                                                rov1.idOption == objOption.idParent.Value
                                                            select rov1).FirstOrDefault();
                                                    if (optionParentValue == null)
                                                    {
                                                        optionParentValue = new ReportOptionValue()
                                                        {
                                                            idReport = latestReport.idReport,
                                                            idOption = objOption.idParent.Value,
                                                            Value = string.Empty,
                                                            DateCreated = DateTime.Now,
                                                            DateUpdated = DateTime.Now
                                                        };

                                                        //Add ReportOptionValue to DB : don't save yet
                                                        retrieveContext.ReportOptionValue.AddObject(optionParentValue);

                                                        //Check if this parent option has already parent ?
                                                        objOption = optionParentValue.Option;
                                                    }
                                                    else
                                                    {
                                                        optionParentValue.DateUpdated = DateTime.Now;
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            var RoptionChild = retrieveContext.ReportOptionValue.FirstOrDefault(rov => rov.idReport == latestReport.idReport && rov.idOption == opt);
                                            if (RoptionChild != null)
                                            {
                                                Option objOptionChild = OptionBL.GetOptionById(RoptionChild.idOption);
                                                if (objOptionChild != null)
                                                {
                                                    while (objOptionChild.idParent.HasValue)
                                                    {
                                                        ReportOptionValue optionParentValue = (from rov2 in retrieveContext.ReportOptionValue.Include("Option")
                                                                                               where rov2.idReport == latestReport.idReport && rov2.idOption == objOptionChild.idParent.Value
                                                                                               select rov2).FirstOrDefault();

                                                        if (optionParentValue == null)
                                                        {
                                                            optionParentValue = new ReportOptionValue()
                                                            {
                                                                idReport = latestReport.idReport,
                                                                idOption = objOptionChild.idParent.Value,
                                                                Value = string.Empty,
                                                                DateCreated = DateTime.Now,
                                                                DateUpdated = DateTime.Now
                                                            };

                                                            //Add ReportOptionValue to DB : don't save yet
                                                            retrieveContext.ReportOptionValue.AddObject(optionParentValue);

                                                            //Check if this parent option has already parent ?
                                                            objOptionChild = optionParentValue.Option;
                                                        }
                                                        else
                                                        {
                                                            optionParentValue.DateUpdated = DateTime.Now;
                                                            break;
                                                        }
                                                    }


                                                }
                                            }
                                        }
                                    }
                                    if (insertDone)
                                        clientsCount++;
                                }

                            }
                        }
                    }
                    retrieveContext.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            //return string.Format("{0} Clients traités : {1} ", clientsCount, sb.ToString());
            return clientsCount;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="reportIdDest"></param>
        /// <param name="lstReportOptionValuesSource"></param>
        public static int SaveReportOptionValue(Guid idReport, Upsilab.Data.Model.Option option, int idOptionAttribute, string value, string fieldType, string colomnName, int? lineNumber)
        {
            ReportOptionAttributeValue optionAttributeValue2 = null;
            int idOption = option.idOption;
            bool updateDateUpdated = false;
            string completedStatus = Report.ReportBL.Status.Completed.ToString();
            string waitingForClientUpdateStatus = Report.ReportBL.Status.WaitingForClientUpdate.ToString();

            //Insert new OptionValue
            using (UpsilabEntities db = new UpsilabEntities())
            {
                //Get current report
                Data.Model.Report report = (from rep in db.Report
                                            where rep.idReport == idReport
                                            select rep).FirstOrDefault();

                //Check if customer has completed report
                var checkCompletedReport = (from rep in db.Report
                                            where rep.CustomerProspect.idCustomer == report.CustomerProspect.idCustomer
                                                  && rep.Status == completedStatus
                                            select rep).FirstOrDefault();

                if (checkCompletedReport != null)
                {
                    updateDateUpdated = true;
                }

                //#9262 : Check if customer changes the info after Adviser request
                if (!updateDateUpdated)
                {
                    if (report.Status == waitingForClientUpdateStatus && SessionManager.GetUserSession().IsEndUser())
                    {
                        updateDateUpdated = true;
                    }
                }

                #region TEXTBOX, DROPDOWN : txt, dt, enum
                //1- Save option attribute value (simple textbox / textarea)
                if (fieldType == "txt" || fieldType == "dt" || fieldType == "enum")
                {
                    ReportOptionAttributeValue optionAttributeValue = (from roav in db.ReportOptionAttributeValue.Include("ReportOptionValue")
                                                                       where roav.idReport == idReport && roav.idOptionAttribute == idOptionAttribute
                                                                       select roav).FirstOrDefault();

                    if (optionAttributeValue != null)
                    {
                        if (optionAttributeValue.Value != value) //update if not equal
                        {
                            optionAttributeValue.Value = value;
                            optionAttributeValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                            optionAttributeValue.ReportOptionValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                        }
                        else
                        {
                            //Do nothing if equal
                        }
                        optionAttributeValue2 = optionAttributeValue;
                    }
                    else if (!string.IsNullOrEmpty(value)) //Insert if value is not empty
                    {
                        //Check if reportOptionValue exists
                        ReportOptionValue optionValue = (from rov in db.ReportOptionValue
                                                         where rov.idReport == idReport && rov.idOption == idOption
                                                         select rov).FirstOrDefault();

                        if (optionValue == null) //insert option value
                        {
                            optionValue = new ReportOptionValue()
                            {
                                idReport = idReport,
                                idOption = idOption,
                                Value = string.Empty,
                                DateCreated = DateTime.Now,
                                DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                            };

                            //Add ReportOptionValue to DB : don't save yet
                            db.ReportOptionValue.AddObject(optionValue);

                            //Insert parent
                            while (option.idParent.HasValue)
                            {
                                ReportOptionValue optionParentValue = (from rov in db.ReportOptionValue.Include("Option")
                                                                       where rov.idReport == idReport && rov.idOption == option.idParent
                                                                       select rov).FirstOrDefault();

                                if (optionParentValue == null)
                                {
                                    optionParentValue = new ReportOptionValue()
                                    {
                                        idReport = idReport,
                                        idOption = option.idParent.Value,
                                        Value = string.Empty,
                                        DateCreated = DateTime.Now,
                                        DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                    };

                                    //Add ReportOptionValue to DB : don't save yet
                                    db.ReportOptionValue.AddObject(optionParentValue);

                                    //Check if this parent option has already parent ?
                                    option = optionParentValue.Option;
                                }
                                else
                                {
                                    optionParentValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                                    break;
                                }
                            }
                        }

                        //Insert optionattrubutevalue
                        ReportOptionAttributeValue newReportOptionAttributeValue = new ReportOptionAttributeValue()
                        {
                            idReport = idReport,
                            idOptionAttribute = idOptionAttribute,
                            idReportOptionValue = optionValue.idReportOptionValue,
                            Value = value,
                            DateCreated = DateTime.Now,
                            DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                        };

                        //Add ReportOptionAttributeValue to DB : don't save yet
                        optionValue.ReportOptionAttributeValue.Add(newReportOptionAttributeValue);
                        optionAttributeValue2 = newReportOptionAttributeValue;
                    }
                }
                #endregion

                #region RADIO BUTTON : rb
                //2- Save option attribute value (Radio button)
                else if (fieldType == "rb")
                {
                    //Delete old rb
                    IList<ReportOptionValue> optionValues = (from rov in db.ReportOptionValue.Include("ReportOptionAttributeValue")
                                                             where rov.idReport == idReport && rov.Option.idParent == option.idParent
                                                             select rov).ToList();

                    //Delete option attribute values attached to option value
                    if (optionValues != null)
                    {
                        foreach (var optionValue in optionValues)
                        {
                            IList<ReportOptionAttributeValue> lstOptionAttributeValues = new List<ReportOptionAttributeValue>(optionValue.ReportOptionAttributeValue);
                            foreach (var item in lstOptionAttributeValues)
                            {
                                var optionAttrValueToBeDel = optionValue.ReportOptionAttributeValue.Where(oa => oa.idReportOptionAttributeValue == item.idReportOptionAttributeValue).FirstOrDefault();
                                db.ReportOptionAttributeValue.DeleteObject(optionAttrValueToBeDel);
                            }

                            db.ReportOptionValue.DeleteObject(optionValue);

                            //Delete child option value
                            IList<ReportOptionValue> lstOptionValuesChild = (from rov in db.ReportOptionValue.Include("ReportOptionAttributeValue")
                                                                             where rov.idReport == idReport && rov.Option.idParent == optionValue.idOption
                                                                             select rov).ToList();

                            if (lstOptionValuesChild != null)
                            {
                                foreach (var optionValueChild in lstOptionValuesChild)
                                {
                                    lstOptionAttributeValues = new List<ReportOptionAttributeValue>(optionValueChild.ReportOptionAttributeValue);
                                    foreach (var item in lstOptionAttributeValues)
                                    {
                                        var optionAttrValueToBeDel = optionValueChild.ReportOptionAttributeValue.Where(oa => oa.idReportOptionAttributeValue == item.idReportOptionAttributeValue).FirstOrDefault();
                                        db.ReportOptionAttributeValue.DeleteObject(optionAttrValueToBeDel);
                                    }

                                    db.ReportOptionValue.DeleteObject(optionValueChild);
                                }
                            }
                        }

                    }

                    if (!string.IsNullOrEmpty(value) && value.ToLower() == "true")
                    {
                        //Insert new rb
                        ReportOptionValue newOptionValue = new ReportOptionValue()
                        {
                            idReport = idReport,
                            idOption = idOption,
                            Value = string.Empty,
                            DateCreated = DateTime.Now,
                            DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                        };

                        //Add ReportOptionValue to DB : don't save yet
                        db.ReportOptionValue.AddObject(newOptionValue);

                        //Insert parent ??
                        while (option.idParent.HasValue)
                        {
                            ReportOptionValue optionParentValue = (from rov in db.ReportOptionValue.Include("Option")
                                                                   where rov.idReport == idReport && rov.idOption == option.idParent
                                                                   select rov).FirstOrDefault();

                            if (optionParentValue == null)
                            {
                                optionParentValue = new ReportOptionValue()
                                {
                                    idReport = idReport,
                                    idOption = option.idParent.Value,
                                    Value = string.Empty,
                                    DateCreated = DateTime.Now,
                                    DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                };

                                //Add ReportOptionValue to DB : don't save yet
                                db.ReportOptionValue.AddObject(optionParentValue);

                                //Check if this parent option has already parent ?
                                option = optionParentValue.Option;
                            }
                            else
                            {
                                optionParentValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                                break;
                            }
                        }


                    
                    }
                }
                #endregion

                #region CHECKBOX : chk
                //3- Save option attribute value (Checkbox)
                else if (fieldType == "chk")
                {
                    ReportOptionValue optionValue;

                    if (value == "false")
                    {
                        //Delete old chk
                        optionValue = (from rov in db.ReportOptionValue.Include("ReportOptionAttributeValue")
                                       where rov.idReport == idReport && rov.idOption == idOption
                                       select rov).FirstOrDefault();

                        //Delete option attribute values attached to option value
                        if (optionValue != null)
                        {
                            IList<ReportOptionAttributeValue> lstOptionAttributeValues = new List<ReportOptionAttributeValue>(optionValue.ReportOptionAttributeValue);
                            foreach (var item in lstOptionAttributeValues)
                            {
                                var optionAttrValueToBeDel = optionValue.ReportOptionAttributeValue.Where(oa => oa.idReportOptionAttributeValue == item.idReportOptionAttributeValue).FirstOrDefault();
                                db.ReportOptionAttributeValue.DeleteObject(optionAttrValueToBeDel);
                            }

                            db.ReportOptionValue.DeleteObject(optionValue);

                            //Delete child option value
                            IList<ReportOptionValue> lstOptionValuesChild = (from rov in db.ReportOptionValue.Include("ReportOptionAttributeValue")
                                                                             where rov.idReport == idReport && rov.Option.idParent == optionValue.idOption
                                                                             select rov).ToList();

                            if (lstOptionValuesChild != null)
                            {
                                foreach (var optionValueChild in lstOptionValuesChild)
                                {
                                    lstOptionAttributeValues = new List<ReportOptionAttributeValue>(optionValueChild.ReportOptionAttributeValue);
                                    foreach (var item in lstOptionAttributeValues)
                                    {
                                        var optionAttrValueToBeDel = optionValueChild.ReportOptionAttributeValue.Where(oa => oa.idReportOptionAttributeValue == item.idReportOptionAttributeValue).FirstOrDefault();
                                        db.ReportOptionAttributeValue.DeleteObject(optionAttrValueToBeDel);
                                    }

                                    db.ReportOptionValue.DeleteObject(optionValueChild);
                                }
                            }
                        }
                    }
                    else if (value == "true")
                    {
                        //Insert new chk
                        optionValue = new ReportOptionValue()
                        {
                            idReport = idReport,
                            idOption = idOption,
                            Value = string.Empty,
                            DateCreated = DateTime.Now,
                            DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                        };

                        //Add ReportOptionValue to DB : don't save yet
                        db.ReportOptionValue.AddObject(optionValue);

                        //Insert parent ??
                        while (option.idParent.HasValue)
                        {
                            ReportOptionValue optionParentValue = (from rov in db.ReportOptionValue.Include("Option")
                                                                   where rov.idReport == idReport && rov.idOption == option.idParent
                                                                   select rov).FirstOrDefault();

                            if (optionParentValue == null)
                            {
                                optionParentValue = new ReportOptionValue()
                                {
                                    idReport = idReport,
                                    idOption = option.idParent.Value,
                                    Value = string.Empty,
                                    DateCreated = DateTime.Now,
                                    DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                };

                                //Add ReportOptionValue to DB : don't save yet
                                db.ReportOptionValue.AddObject(optionParentValue);

                                //Check if this parent option has already parent ?
                                option = optionParentValue.Option;
                            }
                            else
                            {
                                optionParentValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                                break;
                            }
                        }
                    }
                }
                #endregion

                #region CUSTOM DATATYPE
                //4- Custom datatype
                else
                {
                    //pour agreg
                    ReportOptionAttributeValue agregOptionAttributeValue = null;
                    //

                    ReportOptionValue optionValue = (from rov in db.ReportOptionValue.Include("ReportOptionAttributeValue")
                                                     where rov.idReport == idReport && rov.idOption == idOption
                                                     select rov).FirstOrDefault();

                    IList<ReportOptionAttributeValue> lstOptionAttributeValues = new List<ReportOptionAttributeValue>();

                    //Option value ?
                    if (optionValue != null)
                    {
                        lstOptionAttributeValues = new List<ReportOptionAttributeValue>(optionValue.ReportOptionAttributeValue);
                        lstOptionAttributeValues = lstOptionAttributeValues.Where(oav => oav.idOptionAttribute == idOptionAttribute).ToList();
                    }
                    else if (!string.IsNullOrEmpty(value))
                    {
                        optionValue = new ReportOptionValue()
                        {
                            idReport = idReport,
                            idOption = idOption,
                            Value = string.Empty,
                            DateCreated = DateTime.Now,
                            DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                        };

                        //Add ReportOptionValue to DB : don't save yet
                        db.ReportOptionValue.AddObject(optionValue);

                        //Insert parent
                        while (option.idParent.HasValue)
                        {
                            ReportOptionValue optionParentValue = (from rov in db.ReportOptionValue.Include("Option")
                                                                   where rov.idReport == idReport && rov.idOption == option.idParent
                                                                   select rov).FirstOrDefault();

                            if (optionParentValue == null)
                            {
                                optionParentValue = new ReportOptionValue()
                                {
                                    idReport = idReport,
                                    idOption = option.idParent.Value,
                                    Value = string.Empty,
                                    DateCreated = DateTime.Now,
                                    DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                };

                                //Add ReportOptionValue to DB : don't save yet
                                db.ReportOptionValue.AddObject(optionParentValue);

                                //Check if this parent option has already parent ?
                                option = optionParentValue.Option;
                            }
                            else
                            {
                                optionParentValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                                break;
                            }
                        }
                    }

                    //Get target option attribute
                    if (lineNumber.HasValue && lineNumber.Value < lstOptionAttributeValues.Count)
                    {
                        //Line already in database
                        ReportOptionAttributeValue reportOptionAttrValue = lstOptionAttributeValues[lineNumber.Value];
                        dynamic customData = reportOptionAttrValue.CustomObjectValue;

                        if (customData != null)
                        {
                            bool isTheSameValue = CustomObject.IsTheSameValue(customData, colomnName, value);

                            if (!isTheSameValue)
                            {
                                CustomObject.SetValueByPropertyName(customData, colomnName, value);
                                reportOptionAttrValue.CustomObjectValue = customData;
                                reportOptionAttrValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                                reportOptionAttrValue.ReportOptionValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                                //pour agreg
                                agregOptionAttributeValue = reportOptionAttrValue;
                                //
                            }
                        }
                        optionAttributeValue2 = reportOptionAttrValue;

                    }
                    else
                    {
                        //Get Custom datatype columns
                        List<string> customAttribute = OptionBL.GetCustomAttributeNames(fieldType);

                        if (customAttribute.Count > 0)
                        {
                            dynamic customData = new Upsilab.Data.Model.CustomObject();
                            dynamic customDataEmpty = new Upsilab.Data.Model.CustomObject();

                            foreach (string itemColumnName in customAttribute)
                            {
                                string _strVal = string.Empty;

                                if (itemColumnName == colomnName)
                                {
                                    _strVal = value;
                                }
                                CustomObject.SetValueByPropertyName(customData, itemColumnName, _strVal);
                                CustomObject.SetValueByPropertyName(customDataEmpty, itemColumnName, string.Empty);
                            }

                            ReportOptionAttributeValue optionAttributeValue = null;
                            bool createOptionAttr = true;
                            if (!lineNumber.HasValue && lstOptionAttributeValues.Count > 0)
                            {
                                createOptionAttr = false;
                                optionAttributeValue = optionValue.ReportOptionAttributeValue.Where(oav => oav.idOptionAttribute == idOptionAttribute).FirstOrDefault();
                                optionAttributeValue2 = optionAttributeValue;
                            }
                            else if (lineNumber.HasValue)
                            {
                                //Create empty lines
                               // while (lstOptionAttributeValues.Count < lineNumber.Value)
                                {
                                    optionAttributeValue = new ReportOptionAttributeValue()
                                    {
                                        idReport = idReport,
                                        idOptionAttribute = idOptionAttribute,
                                        idReportOptionValue = optionValue.idReportOptionValue,
                                        DateCreated = DateTime.Now,
                                        DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                    };

                                    optionAttributeValue.CustomObjectValue = customDataEmpty;

                                    lstOptionAttributeValues.Add(optionAttributeValue);
                                    optionValue.ReportOptionAttributeValue.Add(optionAttributeValue);
                                }
                            }

                            //if (optionAttributeValue == null)
                            if (createOptionAttr)
                            {
                                //Add new line
                                //Insert optionattrubutevalue
                                optionAttributeValue = new ReportOptionAttributeValue()
                                {
                                    idReport = idReport,
                                    idOptionAttribute = idOptionAttribute,
                                    idReportOptionValue = optionValue.idReportOptionValue,
                                    DateCreated = DateTime.Now,
                                    DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null
                                };

                                optionAttributeValue.CustomObjectValue = customData;

                                //pour agreg
                                agregOptionAttributeValue = optionAttributeValue;
                                optionAttributeValue2 = agregOptionAttributeValue;
                                //
                            }
                            else
                            {
                                customData = optionAttributeValue.CustomObjectValue;

                                if (customData != null)
                                {
                                    bool isTheSameValue = CustomObject.IsTheSameValue(customData, colomnName, value);

                                    if (!isTheSameValue)
                                    {
                                        CustomObject.SetValueByPropertyName(customData, colomnName, value);
                                        optionAttributeValue.CustomObjectValue = customData;
                                        optionAttributeValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;

                                        optionAttributeValue.ReportOptionValue.DateUpdated = (updateDateUpdated) ? DateTime.Now : (DateTime?)null;
                                        //pour agreg
                                        agregOptionAttributeValue = optionAttributeValue;
                                        //
                                    }
                                }
                            }

                            //Add ReportOptionAttributeValue to DB : don't save yet
                            optionValue.ReportOptionAttributeValue.Add(optionAttributeValue);
                            optionAttributeValue2 = optionAttributeValue;
                        }
                    }

                    #region Save patrimoine from Recueil/lab to Agregateur
                    //update/add ag_upsideo_compte
                    //if (report.CustomerProspect.User1.idLicenseAgreg.HasValue && report.CustomerProspect.User1.idAgregCGP.HasValue
                    //    && (idOptionAttribute == 204 || idOptionAttribute == 205 || idOptionAttribute == 206)
                    //    && report.CustomerProspect.FirmInstitution.ag_upsideo_cabinet != null)
                    if (report.CustomerProspect.User1.HasAggregatorLicense() && report.CustomerProspect.User1.idAgregCGP.HasValue
                        && (idOptionAttribute == 204 || idOptionAttribute == 205 || idOptionAttribute == 206)
                        && report.CustomerProspect.FirmInstitution.ag_upsideo_cabinet != null)
                    {
                        //Les ids en cours : agregCabinet, agregCGP et agregClient
                        Guid idAgregCGP = report.CustomerProspect.User1.idAgregCGP.Value;
                        Guid idAgregCabinet = report.CustomerProspect.FirmInstitution.ag_upsideo_cabinet.idcrmcabinet;
                        Guid currentAgregClientId = Guid.Empty;

                        if (report.CustomerProspect.idAgregClient.HasValue)
                        {
                            currentAgregClientId = report.CustomerProspect.idAgregClient.Value;
                        }
                        else
                        {
                            ag_upsideo_client clientAgregToAdd = new ag_upsideo_client()
                            {
                                idclient = Guid.NewGuid(),
                                idcgp = idAgregCGP,
                                nomclient = report.CustomerProspect.User.UserName,
                                prenomclient = report.CustomerProspect.User.UserFirstName,
                                adr = report.CustomerProspect.Adress,
                                cp = report.CustomerProspect.ZipCode,
                                ville = report.CustomerProspect.City,
                                titre = report.CustomerProspect.Title,
                                ddn = DateTime.Now,
                                deleted = "n"
                            };

                            db.ag_upsideo_client.AddObject(clientAgregToAdd);

                            report.CustomerProspect.idAgregClient = clientAgregToAdd.idclient;
                            currentAgregClientId = clientAgregToAdd.idclient;
                        }

                        //Fournisseur de l'actif : comme il s'agit de données provenant du "Recueil/LAB", mettre "UPSIDEO" comme fournisseur fictif (pour chaque cabinet / etablissement)
                        //Get fournisseur
                        ag_upsideo_fournisseur agregFournisseur = db.ag_upsideo_fournisseur.Where(f => f.idcrmcabinet == report.CustomerProspect.FirmInstitution.ag_upsideo_cabinet.idcrmcabinet
                                                                                                  && f.nomfournisseur == Business.Agreg.agupsideocompteBL.FournisseurUpsideo).FirstOrDefault();

                        if (agregFournisseur == null)
                        {
                            agregFournisseur = new ag_upsideo_fournisseur()
                            {
                                idcrmcabinet = idAgregCabinet,
                                nomfournisseur = Business.Agreg.agupsideocompteBL.FournisseurUpsideo,
                                cleAgreg = Business.Agreg.agupsideocompteBL.FournisseurUpsideo.ToLower(),
                                deleted = "n",
                            };

                            //TODO : to delete : normalement à faire lors de la souscription mais garder ce code pour test
                            //Insertion fournisseur avec un autre contexte
                            using (UpsilabEntities dbTemp = new UpsilabEntities())
                            {
                                dbTemp.ag_upsideo_fournisseur.AddObject(agregFournisseur);
                                dbTemp.SaveChanges();
                            }
                        }

                        //num compte fictif dans table compte Agreg
                        string numCompteFictif = string.Empty;
                        numCompteFictif = string.Format("{0}_{1}", idOptionAttribute.ToString(), lineNumber.Value.ToString());

                        //teste si existe déjà (maj) si no new
                        ag_upsideo_compte currentCompte = db.ag_upsideo_compte.Where(c => c.idclient == currentAgregClientId && c.numcompte == numCompteFictif).FirstOrDefault();

                        //maj
                        if (currentCompte != null && agregOptionAttributeValue != null)
                        {
                            switch (idOptionAttribute)
                            {
                                case 204:
                                case 205:
                                    {
                                        currentCompte.designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"];
                                        currentCompte.dateacquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"]) : null;
                                        currentCompte.valeuracquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"]) : null;
                                        currentCompte.totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"]) : null;
                                        currentCompte.idfrontfournisseur = agregFournisseur.idfrontfournisseur;
                                        currentCompte.type = "n"; //pour l'instant : non géré
                                    }
                                    break;
                                case 206:
                                    currentCompte.designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"];
                                    currentCompte.totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"]) : null;
                                    currentCompte.idfrontfournisseur = agregFournisseur.idfrontfournisseur;
                                    currentCompte.type = "n"; //pour l'instant : non géré
                                    break;
                                default:
                                    break;

                            }
                        }
                        //new
                        else if (currentCompte == null && agregOptionAttributeValue != null)
                        {
                            switch (idOptionAttribute)
                            {
                                case 204:
                                case 205:
                                    {
                                        currentCompte = new ag_upsideo_compte()
                                        {
                                            idclient = currentAgregClientId,
                                            idcgp = report.CustomerProspect.User1.idAgregCGP.Value,
                                            idfrontfournisseur = agregFournisseur.idfrontfournisseur,
                                            numcompte = numCompteFictif,
                                            typecontrat = "bien immobilier",
                                            deleted = "n",

                                            designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"],
                                            dateacquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionDate"]) : null,
                                            valeuracquisition = agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["AcquisitionValue"]) : null,
                                            totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["CurrentValue"]) : null
                                        };
                                        if (!string.IsNullOrEmpty(agregOptionAttributeValue.CustomObjectValue.Values["Description"]))
                                        {
                                            db.ag_upsideo_compte.AddObject(currentCompte);
                                        }

                                    }
                                    break;

                                case 206:
                                    {
                                        currentCompte = new ag_upsideo_compte()
                                        {
                                            idclient = currentAgregClientId,
                                            idcgp = report.CustomerProspect.User1.idAgregCGP.Value,
                                            idfrontfournisseur = agregFournisseur.idfrontfournisseur,
                                            numcompte = numCompteFictif,
                                            typecontrat = "professionels",
                                            deleted = "n",

                                            designation = agregOptionAttributeValue.CustomObjectValue.Values["Description"],
                                            totalcompte = agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"] != "" ? Convert.ToDouble(agregOptionAttributeValue.CustomObjectValue.Values["OwnedCapital"]) : null

                                        };
                                        if (!string.IsNullOrEmpty(agregOptionAttributeValue.CustomObjectValue.Values["Description"]))
                                        {
                                            db.ag_upsideo_compte.AddObject(currentCompte);
                                        }
                                    }
                                    break;
                                default:
                                    break;

                            }
                        }
                    }
                    #endregion


                }
                #endregion

                #region Report
                //5- Update dateupdated report               
                report.DateUpdated = DateTime.Now;
                #endregion

                //6- Commit all changes here
                db.SaveChanges();
                return optionAttributeValue2!=null ? optionAttributeValue2.idReportOptionAttributeValue : 0;
            }
        }
        private int SetOptionForCredit(List<int> lstOptionToInsert)
        {
            int clientsCount = 0;
            try
            {
                using (UpsilabEntities retrieveContext = new UpsilabEntities())
                {

                    var clients =
                        retrieveContext.CustomerProspect.Include("Report")
                            .Where(cli => cli.isDeleted.HasValue && !cli.isDeleted.Value && cli.IsCorporation.HasValue &&
                                          !cli.IsCorporation.Value);
                    foreach (var cli in clients)
                    {
                        if (cli.Report != null)
                        {
                            var latestReport = cli.Report.Where(r => r.Status != "Canceled").OrderByDescending(r => r.DateUpdated).FirstOrDefault();
                            if (latestReport != null)
                            {
                                var lstAnyCredit = latestReport.ReportOptionAttributeValue.Where(roav => roav.idOptionAttribute == 215);
                                lstAnyCredit = lstAnyCredit.Where(dc => !string.IsNullOrEmpty(dc.CustomObjectValue.Borrower)).ToList();
                                if (lstAnyCredit.Any())
                                {
                                    bool insertDone = false;
                                    foreach (int opt in lstOptionToInsert)
                                    {
                                        var isAlreadyChecked = retrieveContext.ReportOptionValue.Any(rov => rov.idReport == latestReport.idReport && rov.idOption == opt);
                                        if (!isAlreadyChecked)
                                        {
                                            ReportOptionValue rov = new ReportOptionValue()
                                            {
                                                idReport = latestReport.idReport,
                                                idOption = opt,
                                                DateCreated = DateTime.Now,
                                                DateUpdated = DateTime.Now,
                                                Value = string.Empty,
                                            };
                                            insertDone = true;
                                            retrieveContext.ReportOptionValue.AddObject(rov);

                                            Option objOption = OptionBL.GetOptionById(opt);
                                            if (objOption != null)
                                            {
                                                while (objOption.idParent.HasValue)
                                                {
                                                    ReportOptionValue optionParentValue =
                                                        (from rov1 in
                                                             retrieveContext.ReportOptionValue.Include("Option")
                                                         where
                                                             rov1.idReport == latestReport.idReport &&
                                                             rov1.idOption == objOption.idParent.Value
                                                         select rov1).FirstOrDefault();
                                                    if (optionParentValue == null)
                                                    {
                                                        optionParentValue = new ReportOptionValue()
                                                        {
                                                            idReport = latestReport.idReport,
                                                            idOption = objOption.idParent.Value,
                                                            Value = string.Empty,
                                                            DateCreated = DateTime.Now,
                                                            DateUpdated = DateTime.Now
                                                        };

                                                        //Add ReportOptionValue to DB : don't save yet
                                                        retrieveContext.ReportOptionValue.AddObject(optionParentValue);

                                                        //Check if this parent option has already parent ?
                                                        objOption = optionParentValue.Option;
                                                    }
                                                    else
                                                    {
                                                        optionParentValue.DateUpdated = DateTime.Now;
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            var RoptionChild = retrieveContext.ReportOptionValue.FirstOrDefault(rov => rov.idReport == latestReport.idReport && rov.idOption == opt);
                                            if (RoptionChild != null)
                                            {
                                                Option objOptionChild = OptionBL.GetOptionById(RoptionChild.idOption);
                                                if (objOptionChild != null)
                                                {
                                                    while (objOptionChild.idParent.HasValue)
                                                    {
                                                        ReportOptionValue optionParentValue = (from rov2 in retrieveContext.ReportOptionValue.Include("Option")
                                                                                               where rov2.idReport == latestReport.idReport && rov2.idOption == objOptionChild.idParent.Value
                                                                                               select rov2).FirstOrDefault();

                                                        if (optionParentValue == null)
                                                        {
                                                            optionParentValue = new ReportOptionValue()
                                                            {
                                                                idReport = latestReport.idReport,
                                                                idOption = objOptionChild.idParent.Value,
                                                                Value = string.Empty,
                                                                DateCreated = DateTime.Now,
                                                                DateUpdated = DateTime.Now
                                                            };

                                                            //Add ReportOptionValue to DB : don't save yet
                                                            retrieveContext.ReportOptionValue.AddObject(optionParentValue);

                                                            //Check if this parent option has already parent ?
                                                            objOptionChild = optionParentValue.Option;
                                                        }
                                                        else
                                                        {
                                                            optionParentValue.DateUpdated = DateTime.Now;
                                                            break;
                                                        }
                                                    }


                                                }
                                            }
                                        }
                                    }
                                    if (insertDone)
                                        clientsCount++;
                                }
                            }
                        }
                    }
                    retrieveContext.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            //return string.Format("{0} Clients traités : {1} ", clientsCount, sb.ToString());
            return clientsCount;
        }
        private int SetOptionFor2(List<int> lstOptionToInsert, List<int> lstDataToFound, bool checkData = false)
        {
            int clientsCount = 0;
            //System.Text.StringBuilder sb = new System.Text.StringBuilder();
            try
            {

                using (UpsilabEntities retrieveContext = new UpsilabEntities())
                {

                    var clients = retrieveContext.CustomerProspect.Include("Report").Where(cli => cli.isDeleted.HasValue && !cli.isDeleted.Value && cli.IsCorporation.HasValue &&
                       !cli.IsCorporation.Value).ToList();

                    foreach (var cli in clients)
                    {
                        if (cli.Report != null)
                        {
                            var latestReport = cli.Report.Where(r => r.Status != "Canceled").OrderByDescending(r => r.DateUpdated).FirstOrDefault();
                            if (latestReport != null)
                            {

                                bool dataFound = false;
                                //if (IsOptionAttribute) //recherche dans la table ReportOptionAttributeValue
                                //{
                                var allAnswers = retrieveContext.ReportOptionAttributeValue.Where(roav => roav.idReport == latestReport.idReport);
                                List<int> idOptionAttributeValuesList = new HashSet<int>(allAnswers.Select(x => x.idOptionAttribute)).ToList();
                                if (!checkData)
                                    dataFound = idOptionAttributeValuesList.Any(x => lstDataToFound.Contains(x));
                                else
                                { ///check data value ---> cas spécial pour conjoint on a qu'une optionValue à tester
                                    int data = lstDataToFound[0];
                                    var optionAttrVal = allAnswers.Where(x => x.idOptionAttribute == data).FirstOrDefault();
                                    if (optionAttrVal != null && !string.IsNullOrEmpty(optionAttrVal.Value))
                                        dataFound = true;
                                }
                                // }
                                //else // recherche dans la table ReportOptionValue
                                //{()
                                //    var allAnswers = retrieveContext.ReportOptionValue.Where(rov => rov.idReport == latestReport.idReport);
                                //    List<int> idOptionValuesList = new HashSet<int>(allAnswers.Select(x => x.idOption)).ToList();
                                //    dataFound = idOptionValuesList.Any(x => lstDataToFound.Contains(x));
                                //}
                                if (dataFound)
                                {
                                    bool insertDone = false;
                                    foreach (int opt in lstOptionToInsert)
                                    {
                                        var isAlreadyChecked = retrieveContext.ReportOptionValue.Any(rov => rov.idReport == latestReport.idReport && rov.idOption == opt);
                                        if (!isAlreadyChecked)
                                        {
                                            ReportOptionValue rov = new ReportOptionValue()
                                            {
                                                idReport = latestReport.idReport,
                                                idOption = opt,
                                                DateCreated = DateTime.Now,
                                                DateUpdated = DateTime.Now,
                                                Value = string.Empty,
                                            };
                                            insertDone = true;
                                            retrieveContext.ReportOptionValue.AddObject(rov);

                                            Option objOption = OptionBL.GetOptionById(opt);
                                            if (objOption != null)
                                            {
                                                while (objOption.idParent.HasValue)
                                                {
                                                    ReportOptionValue optionParentValue =
                                                        (from rov1 in
                                                             retrieveContext.ReportOptionValue.Include("Option")
                                                         where
                                                             rov1.idReport == latestReport.idReport &&
                                                             rov1.idOption == objOption.idParent.Value
                                                         select rov1).FirstOrDefault();
                                                    if (optionParentValue == null)
                                                    {
                                                        optionParentValue = new ReportOptionValue()
                                                        {
                                                            idReport = latestReport.idReport,
                                                            idOption = objOption.idParent.Value,
                                                            Value = string.Empty,
                                                            DateCreated = DateTime.Now,
                                                            DateUpdated = DateTime.Now
                                                        };

                                                        //Add ReportOptionValue to DB : don't save yet
                                                        retrieveContext.ReportOptionValue.AddObject(optionParentValue);

                                                        //Check if this parent option has already parent ?
                                                        objOption = optionParentValue.Option;
                                                    }
                                                    else
                                                    {
                                                        optionParentValue.DateUpdated = DateTime.Now;
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            var RoptionChild = retrieveContext.ReportOptionValue.FirstOrDefault(rov => rov.idReport == latestReport.idReport && rov.idOption == opt);
                                            if (RoptionChild != null)
                                            {
                                                Option objOptionChild = OptionBL.GetOptionById(RoptionChild.idOption);
                                                if (objOptionChild != null)
                                                {
                                                    while (objOptionChild.idParent.HasValue)
                                                    {
                                                        ReportOptionValue optionParentValue = (from rov2 in retrieveContext.ReportOptionValue.Include("Option")
                                                                                               where rov2.idReport == latestReport.idReport && rov2.idOption == objOptionChild.idParent.Value
                                                                                               select rov2).FirstOrDefault();

                                                        if (optionParentValue == null)
                                                        {
                                                            optionParentValue = new ReportOptionValue()
                                                            {
                                                                idReport = latestReport.idReport,
                                                                idOption = objOptionChild.idParent.Value,
                                                                Value = string.Empty,
                                                                DateCreated = DateTime.Now,
                                                                DateUpdated = DateTime.Now
                                                            };

                                                            //Add ReportOptionValue to DB : don't save yet
                                                            retrieveContext.ReportOptionValue.AddObject(optionParentValue);

                                                            //Check if this parent option has already parent ?
                                                            objOptionChild = optionParentValue.Option;
                                                        }
                                                        else
                                                        {
                                                            optionParentValue.DateUpdated = DateTime.Now;
                                                            break;
                                                        }
                                                    }


                                                }
                                            }
                                        }
                                    }
                                    if (insertDone)
                                        clientsCount++;
                                }

                            }
                        }
                    }
                    retrieveContext.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            //return string.Format("{0} Clients traités : {1} ", clientsCount, sb.ToString());
            return clientsCount;
        }
        private void FindAndReplaceValue(ReportOptionValue optionValue, List<int> idOptionAttributes, List<String> values)
        {
            if (idOptionAttributes.Count != values.Count)
                throw new Exception(LanguageData.GetContent("invalid_override_count"));

            for (int counter = 0; counter <= idOptionAttributes.Count - 1; counter++)
            {
                var item = optionValue.ReportOptionAttributeValue.Where(optValAttr => optValAttr.idOptionAttribute == idOptionAttributes[counter]).FirstOrDefault();

                if (item != null)
                {
                    string sValue = values[counter];
                    if (string.IsNullOrEmpty(values[counter]))
                    {
                        sValue = "";
                    }
                    item.Value = sValue;
                }
                else
                {
                    string sValue = values[counter];
                    if (string.IsNullOrEmpty(values[counter]))
                    {
                        sValue = "";
                    }
                    optionValue.ReportOptionAttributeValue.Add(new ReportOptionAttributeValue() { Value = sValue, idOptionAttribute = idOptionAttributes[counter], idReportOptionValue = optionValue.idReportOptionValue });
                }
            }
        }
        private void replaceValue(RecueilModel model, int idParent, int idOptionAttribute, string value)
        {
            // récuperation des ReportOptionValue par l'idOption du parent
            var optVal = model.OptionValue.Where(opt => opt.idOption == idParent).FirstOrDefault();

            // créer si null
            if (optVal == null)
            {
                optVal = new ReportOptionValue() { idOption = idParent, idReport = model.Report.idReport };
                model.OptionValue.Add(optVal);
            }

            // replacer les OptionAttributes
            FindAndReplaceValue(optVal, new List<int>() { idOptionAttribute }, new List<String>() { value });
        }
        //override for  Recueil TitularePP
        private ActionResult OverrideTitulareValues(ActionResult actionResult)
        {
            if (actionResult is ViewResult)
            {
                var viewResult = actionResult as ViewResult;
                var objModel = viewResult.Model;
                var model = objModel as RecueilModel;

                var optVal = model.OptionValue.Where(opt => opt.idOption == 216).FirstOrDefault();
                var optVal217 = model.OptionValue.Where(opt => opt.idOption == 217).FirstOrDefault();
                var optVal363 = model.OptionValue.Where(opt => opt.idOption == 363).FirstOrDefault(); // Pays de residence

                if (optVal == null)
                {
                    optVal = new ReportOptionValue() { idOption = 216, idReport = model.Report.idReport };
                    model.OptionValue.Add(optVal);
                }
                if (optVal217 == null)
                {
                    optVal217 = new ReportOptionValue() { idOption = 217, idReport = model.Report.idReport };
                    model.OptionValue.Add(optVal217);
                }
                if (optVal363 == null)
                {
                    optVal363 = new ReportOptionValue() { idOption = 363, idReport = model.Report.idReport };
                    model.OptionValue.Add(optVal363);
                }

                FindAndReplaceValue(
                    optVal,
                    new List<int>() { 
                          Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.USERNAME)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.USERFIRSTNAME)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.MOBILE)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.EMAIL)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.MAIDENNAME)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.DATEOFBIRTH)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.PLACEOFBIRTH)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.PRIVATEPHONE)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.FAX)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.PROFESSIONALPHONE)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.FISCALADDRRESS)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.FISCALZIPCODE)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.FISCALCITY)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.ADRESS)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.ZIPCODE)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.CITY)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.NATIONALITY)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.NATIONALITYIFDOUBLE)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.COUNTRY)
                    },
                    new List<String>() { 
                          model.TargetCustomer.User.UserName
                        , model.TargetCustomer.User.UserFirstName
                        , model.TargetCustomer.User.UserMobilePhone
                        , model.TargetCustomer.User.UserEmail
                        , model.TargetCustomer.MaidenName
                        , (model.TargetCustomer.DateOfBirth.HasValue) ? model.TargetCustomer.DateOfBirth.Value.ToString("dd/MM/yyyy") : null
                        , model.TargetCustomer.PlaceOfBirth
                        , model.TargetCustomer.PrivatePhone
                        , model.TargetCustomer.Fax
                        , model.TargetCustomer.ProfessionalPhone
                        , model.TargetCustomer.FiscalAddrress
                        , model.TargetCustomer.FiscalZipCode
                        , model.TargetCustomer.FiscalCity
                        , model.TargetCustomer.Adress
                        , model.TargetCustomer.ZipCode
                        , model.TargetCustomer.City
                        , model.TargetCustomer.Nationality
                        , model.TargetCustomer.NationalityIfDouble
                        , model.TargetCustomer.Country }
                    );

                FindAndReplaceValue(
                    optVal217,
                    new List<int>() { 
                          Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.NATIONALITY)
                        , Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.NATIONALITYIFDOUBLE)
                    },
                    new List<String>() { 
                          model.TargetCustomer.Nationality
                        , model.TargetCustomer.NationalityIfDouble
                        }
                    );

                FindAndReplaceValue(
                    optVal363,
                    new List<int>() { 
                           Convert.ToInt16(NUMOPTIONATTRIBUTE_IDENTITE.COUNTRY)
                    },
                    new List<String>() { 
                          model.TargetCustomer.Country
                        }
                    );

                #region Affichage de la date dans "Origine de la relation" PP
                // récuperation des ReportOptionValue par l'idOption du parent
                var optVal233 = model.OptionValue.Where(opt => opt.idOption == 233).FirstOrDefault();

                // créer si null
                if (optVal233 == null)
                {
                    optVal233 = new ReportOptionValue() { idOption = 233, idReport = model.Report.idReport };
                    model.OptionValue.Add(optVal233);
                }

                // replacer les OptionAttributes
                FindAndReplaceValue(
                        optVal233,
                        new List<int>() { Convert.ToInt16(NUMOPTIONATTRIBUTE_ORIGINE_DE_LA_RELATION.CLIENT_DEPUIS_LE)
                    },
                        new List<String>() { 
                          (model.TargetCustomer.RelationshipBeginingDate.HasValue) ? model.TargetCustomer.RelationshipBeginingDate.Value.ToString("dd/MM/yyyy") : null
                        }
                        );
                #endregion

                #region GESTION RADIOBUTTON
                #region Identité "Etes vous majeur" GESTION DES RADIOBUTTON
                if (model.TargetCustomer.LegalCapacity != null)
                {
                    model = ClearRadioSelectionByIdParent(model, 217);

                    if (model.TargetCustomer.LegalCapacity.CompareTo("Mineur non émancipé") == 0)
                    {
                        var optVal542 = model.OptionData.Where(o => o.Option.NameKey == "ClientPP_Titulaire_022_Mineur").FirstOrDefault();
                        if (optVal542 != null) optVal542.IsSelected = true;
                    }
                    else if (model.TargetCustomer.LegalCapacity.CompareTo("Majeur capable") == 0)
                    {
                        var optVal218 = model.OptionData.Where(o => o.Option.idOption == 218).FirstOrDefault();
                        if (optVal218 != null) optVal218.IsSelected = true;
                    }
                    else if (model.TargetCustomer.LegalCapacity.CompareTo("Majeur sous tutelle") == 0)
                    {
                        var optVal219 = model.OptionData.Where(o => o.Option.idOption == 219).FirstOrDefault();
                        if (optVal219 != null) optVal219.IsSelected = true;
                    }
                    else if (model.TargetCustomer.LegalCapacity.CompareTo("Majeur sous curatelle") == 0)
                    {
                        var optVal220 = model.OptionData.Where(o => o.Option.idOption == 220).FirstOrDefault();
                        if (optVal220 != null) optVal220.IsSelected = true;
                    }
                    else if (model.TargetCustomer.LegalCapacity.CompareTo("Majeur sous sauvegarde de justice") == 0)
                    {
                        var optVal221 = model.OptionData.Where(o => o.Option.idOption == 221).FirstOrDefault();
                        if (optVal221 != null) optVal221.IsSelected = true;
                    }
                    else if (model.TargetCustomer.LegalCapacity.CompareTo("Mineur émancipé") == 0)
                    {
                        var optVal1149 = model.OptionData.Where(o => o.Option.idOption == 1149).FirstOrDefault();
                        if (optVal1149 != null) optVal1149.IsSelected = true;
                    }
                }
                #endregion

                #region MARITAL STATUS
                if (model.TargetCustomer.MaritalStatus != null)
                {
                    model = ClearRadioSelectionByIdParent(model, 277);

                    if (model.TargetCustomer.MaritalStatus.Contains(_NON))
                    {
                        var optVal278 = model.OptionData.Where(o => o.Option.idOption == 278).FirstOrDefault();
                        if (optVal278 != null) optVal278.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MaritalStatus.Contains(_CELIBATAIRE))
                    {
                        var optVal280 = model.OptionData.Where(o => o.Option.idOption == 280).FirstOrDefault();
                        if (optVal280 != null) optVal280.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MaritalStatus.Contains(_DIVORCE))
                    {
                        var optVal282 = model.OptionData.Where(o => o.Option.idOption == 282).FirstOrDefault();
                        if (optVal282 != null) optVal282.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MaritalStatus.Contains(_SEPARE))
                    {
                        var optVal283 = model.OptionData.Where(o => o.Option.idOption == 283).FirstOrDefault();
                        if (optVal283 != null) optVal283.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MaritalStatus.Contains(_PACS))
                    {
                        var optVal279 = model.OptionData.Where(o => o.Option.idOption == 279).FirstOrDefault();
                        if (optVal279 != null) optVal279.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MaritalStatus.Contains(_VEUF))
                    {
                        var optVal281 = model.OptionData.Where(o => o.Option.idOption == 281).FirstOrDefault();
                        if (optVal281 != null) optVal281.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MaritalStatus.Contains(_CONCUBIN))
                    {
                        var optVal284 = model.OptionData.Where(o => o.Option.idOption == 284).FirstOrDefault();
                        if (optVal284 != null) optVal284.IsSelected = true;
                    }
                    //else if (model.TargetCustomer.MaritalStatus.Contains(_MARIE))
                    //{
                    //    var optVal218 = model.OptionData.Where(o => o.Option.idOption == 218).FirstOrDefault();
                    //    if (optVal218 != null) optVal218.IsSelected = true;
                    //}
                    //else if (model.TargetCustomer.MaritalStatus.Contains(_UNION_LIBRE))
                    //{
                    //    var optVal218 = model.OptionData.Where(o => o.Option.idOption == 218).FirstOrDefault();
                    //    if (optVal218 != null) optVal218.IsSelected = true;
                    //}
                }

                #region date de l'évènement
                if (model.TargetCustomer.WeddingDate.HasValue && model.TargetCustomer.WeddingDate.Value != null)
                {
                    var optVal277 = model.OptionValue.Where(opt => opt.idOption == 277).FirstOrDefault(); // Liberalité
                    if (optVal277 == null)
                    {
                        optVal277 = new ReportOptionValue() { idOption = 277, idReport = model.Report.idReport };
                        model.OptionValue.Add(optVal277);
                    }

                    FindAndReplaceValue(
                        optVal277,
                        new List<int>() { 178 },
                        new List<String>() { 
                              (model.TargetCustomer.WeddingDate.HasValue) ? model.TargetCustomer.WeddingDate.Value.ToString("dd/MM/yyyy") : null
                            }
                        );
                }
                #endregion
                #endregion

                #region IsResident
                if (model.TargetCustomer.IsResident != null)
                {
                    model = ClearRadioSelectionByIdParent(model, 222);

                    if (model.TargetCustomer.IsResident.Value)
                    {
                        var optValResident = model.OptionData.Where(o => o.Option.NameKey == "ClientPP_Titulaire_026").FirstOrDefault();
                        if (optValResident != null) optValResident.IsSelected = true;
                    }
                    else
                    {
                        var optValNonResident = model.OptionData.Where(o => o.Option.NameKey == "ClientPP_Titulaire_027").FirstOrDefault();
                        if (optValNonResident != null) optValNonResident.IsSelected = true;
                    }
                }
                #endregion

                #region GAFI(OptionAttribute)
                if (model.TargetCustomer.Gafi != null)
                {
                    model = ClearRadioSelectionByIdParent(model, 225);

                    if (model.TargetCustomer.Gafi.Value)
                    {
                        var optValOui = model.OptionData.Where(o => o.Option.NameKey == "ClientPP_Titulaire_030").FirstOrDefault();
                        if (optValOui != null) optValOui.IsSelected = true;
                    }
                    else
                    {
                        var optValNon = model.OptionData.Where(o => o.Option.NameKey == "ClientPP_Titulaire_031").FirstOrDefault();
                        if (optValNon != null) optValNon.IsSelected = true;
                    }
                }
                #endregion

                #region OFFSHORE(OptionAttribute)
                if (model.TargetCustomer.OffShore != null)
                {
                    model = ClearRadioSelectionByIdParent(model, 228);

                    if (model.TargetCustomer.OffShore.Value)
                    {
                        var optValOui = model.OptionData.Where(o => o.Option.NameKey == "ClientPP_Titulaire_033").FirstOrDefault();
                        if (optValOui != null) optValOui.IsSelected = true;
                    }
                    else
                    {
                        var optValNon = model.OptionData.Where(o => o.Option.NameKey == "ClientPP_Titulaire_034").FirstOrDefault();
                        if (optValNon != null) optValNon.IsSelected = true;
                    }
                }
                #endregion

                #region REGIME MATRIMONIAL (Seulement sur PP)
                if (model.TargetCustomer.MarriageSettlement != null)
                {
                    model = ClearRadioSelectionByIdParent(model, 285);

                    if (model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Contains("communaute legale"))
                    {
                        var optValMS = model.OptionData.Where(o => o.Option.idOption == 286).FirstOrDefault();
                        if (optValMS != null) optValMS.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Contains("separation de biens"))
                    {
                        var optValMS = model.OptionData.Where(o => o.Option.idOption == 287).FirstOrDefault();
                        if (optValMS != null) optValMS.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MarriageSettlement.ToLower().Replace('ê', 'e').Contains("participation aux acquets"))
                    {
                        var optValMS = model.OptionData.Where(o => o.Option.idOption == 288).FirstOrDefault();
                        if (optValMS != null) optValMS.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Contains("communaute universelle") || model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Contains("regime de communaute universelle"))
                    {
                        var optValMS = model.OptionData.Where(o => o.Option.idOption == 289).FirstOrDefault();
                        if (optValMS != null) optValMS.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Replace('ê', 'e').Replace('è', 'e').Contains("communaute reduite aux acquets (depuis 1966)") || model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Replace('ê', 'e').Contains("communaute reduite aux acquets (regime legal apres 1966)") || model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Replace('ê', 'e').Contains("Communaute réduite aux acquets"))
                    {
                        var optValMS = model.OptionData.Where(o => o.Option.idOption == 1148).FirstOrDefault();
                        if (optValMS != null) optValMS.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Contains("regime legal avant 1er fevrier 1966") || model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Contains("communaute meubles et acquets (régime legal avant 1966)"))
                    {
                        var optVal_ = model.OptionData.Where(o => o.Option.idOption == 1158).FirstOrDefault();
                        if (optVal_ != null) optVal_.IsSelected = true;
                    }
                    else if (model.TargetCustomer.MarriageSettlement.ToLower().Replace('é', 'e').Replace('ê', 'e').Replace('è', 'e').Contains("separation de biens avec societe d’acquets"))
                    {
                        var optVal_ = model.OptionData.Where(o => o.Option.idOption == 1159).FirstOrDefault();
                        if (optVal_ != null) optVal_.IsSelected = true;
                    }
                }
                #endregion
                #endregion

                #region Champ Profession
                // on ne fait ce traitement que lorsque model.TargetCustomer.Profession est différent de NULL
                // dans le cas contraire, on affiche les valeurs dans les tables ReportOptionAttribute et ReportOptionvalue
                if (!string.IsNullOrEmpty(model.TargetCustomer.Profession))
                {
                    model = ClearRadioSelectionByIdParent(model, 257);
                    var optValSelectedVieProf = model.OptionData.Where(o => o.Option.idOption == 258).FirstOrDefault(); // check radio "En activité ou retraité"
                    if (optValSelectedVieProf != null) optValSelectedVieProf.IsSelected = true;

                    if (model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("retraite"))
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 263).FirstOrDefault(); // Retraité depuis le
                        if (_optVal != null) _optVal.IsSelected = true;
                    }
                    else if (model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("medecin (salarie)"))
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 261).FirstOrDefault(); //Activité(s) salariée(s)
                        if (_optVal != null) _optVal.IsSelected = true;

                        replaceValue(model, 261, 160, model.TargetCustomer.Profession);
                        replaceValue(model, 261, 161, "Santé et action sociale"); // valeur par defaut dropdownlist
                    }
                    else if (model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("cadre superieur")
                        || model.TargetCustomer.Profession.ToLower().Contains("cadre d'entreprise"))
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 261).FirstOrDefault(); //Activité(s) salariée(s)
                        if (_optVal != null) _optVal.IsSelected = true;

                        replaceValue(model, 261, 160, model.TargetCustomer.Profession);
                    }
                    else if (model.TargetCustomer.Profession.ToLower().Contains("notaire")
                        || model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("chef d'entreprise (de 1 à 9 salaries)")
                        || model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("gerant majoritaire")
                        || model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("médecin (prof. liberale)")
                        || model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("avocat, avoue (prof. liberale)")
                        || model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("expert comptable (prof. liberale)")
                        || model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("veterinaire")
                        || model.TargetCustomer.Profession.ToLower().Contains("agriculteur sur moyenne exploitation"))
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 262).FirstOrDefault(); // Activité(s) autre que salariée)
                        if (_optVal != null) _optVal.IsSelected = true;

                        replaceValue(model, 262, 163, model.TargetCustomer.Profession);
                    }
                    else if (model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("etudiant") || model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("lyceen")) // Etudiant / Lycéen"
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 1144).FirstOrDefault();
                        if (_optVal != null) _optVal.IsSelected = true;
                    }
                    #region "redmine 4577"
                    else if (model.TargetCustomer.Profession.ToLower().Contains("sans profession"))
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 260).FirstOrDefault();
                        if (_optVal != null) _optVal.IsSelected = true;
                    }
                    else if (model.TargetCustomer.Profession.ToLower().Replace('é', 'e').Contains("medecin generaliste"))
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 262).FirstOrDefault(); // Activité(s) autre que salariée
                        if (_optVal != null) _optVal.IsSelected = true;

                        replaceValue(model, 262, 163, model.TargetCustomer.Profession); // valeur du textbox Métier
                        replaceValue(model, 262, 164, "Santé et action sociale"); // valeur par defaut dropdownlist
                    }
                    #endregion
                    else
                    {
                        var _optVal = model.OptionData.Where(o => o.Option.idOption == 261).FirstOrDefault(); //Activité(s) salariée(s)
                        if (_optVal != null) _optVal.IsSelected = true;

                        replaceValue(model, 261, 160, model.TargetCustomer.Profession);
                    }
                }
                #endregion

                #region Libéralité
                var optVal1147 = model.OptionValue.Where(opt => opt.idOption == 1147).FirstOrDefault(); // Liberalité
                if (optVal1147 == null)
                {
                    optVal1147 = new ReportOptionValue() { idOption = 1147, idReport = model.Report.idReport };
                    model.OptionValue.Add(optVal1147);
                }

                FindAndReplaceValue(
                    optVal1147,
                    new List<int>() { 721 },
                    new List<String>() { 
                          model.TargetCustomer.Liberality
                        }
                    );
                #endregion

                #region Conjoint
                //Désactiver temporairement en attendant une solution pour enreg auto
                bool activate = false;
                if (activate)
                {
                    CustomerProspectRelation objCPEnRelation = CustomerProspectRelationBL.GetCustomerRelationByIdCustomerProspect1(model.TargetCustomer.idCustomer);
                    if (objCPEnRelation != null && objCPEnRelation.CustomerProspect1 != null)
                    {
                        var optVal290 = model.OptionValue.Where(opt => opt.idOption == 290).FirstOrDefault();

                        if (optVal290 == null)
                        {
                            optVal290 = new ReportOptionValue() { idOption = 290, idReport = model.Report.idReport };
                            model.OptionValue.Add(optVal290);
                        }

                        FindAndReplaceValue(
                        optVal290,
                        new List<int>() { 
                            180, 181, 182, 183, 642, 184, 185, 186, 187, 188, 190, 643
                    },
                        new List<String>() { 
                            objCPEnRelation.CustomerProspect1.User.UserName,
                            objCPEnRelation.CustomerProspect1.MaidenName,
                            objCPEnRelation.CustomerProspect1.User.UserFirstName,
                            (objCPEnRelation.CustomerProspect1.DateOfBirth.HasValue) ? objCPEnRelation.CustomerProspect1.DateOfBirth.Value.ToString("dd/MM/yyyy") : null,
                            objCPEnRelation.CustomerProspect1.PlaceOfBirth,
                            objCPEnRelation.CustomerProspect1.PrivatePhone,
                            objCPEnRelation.CustomerProspect1.User.UserMobilePhone,
                            objCPEnRelation.CustomerProspect1.User.UserEmail,
                            objCPEnRelation.CustomerProspect1.Adress,
                            objCPEnRelation.CustomerProspect1.Profession,
                            objCPEnRelation.CustomerProspect1.Nationality,
                            objCPEnRelation.CustomerProspect1.NationalityIfDouble
                        }
                        );

                        #region Pays de residence
                        var optValPaysDeResidence = model.OptionValue.Where(opt => opt.idOption == 1113).FirstOrDefault();

                        if (optValPaysDeResidence == null)
                        {
                            optValPaysDeResidence = new ReportOptionValue() { idOption = 1113, idReport = model.Report.idReport };
                            model.OptionValue.Add(optValPaysDeResidence);
                        }

                        FindAndReplaceValue(
                        optValPaysDeResidence,
                        new List<int>() { 641 },
                        new List<String>() { objCPEnRelation.CustomerProspect1.Country }
                        );
                        #endregion

                        #region GAFI(OptionAttribute)
                        if (objCPEnRelation.CustomerProspect1.Gafi != null)
                        {
                            model = ClearRadioSelectionByIdParent(model, 1114);

                            if (objCPEnRelation.CustomerProspect1.Gafi.Value)
                            {
                                var optValOui = model.OptionData.Where(o => o.Option.idOption == 1115).FirstOrDefault();
                                if (optValOui != null) optValOui.IsSelected = true;
                            }
                            else
                            {
                                var optValNon = model.OptionData.Where(o => o.Option.idOption == 1116).FirstOrDefault();
                                if (optValNon != null) optValNon.IsSelected = true;
                            }
                        }
                        #endregion

                        #region OFFSHORE(OptionAttribute)
                        if (objCPEnRelation.CustomerProspect1.OffShore != null)
                        {
                            model = ClearRadioSelectionByIdParent(model, 1117);

                            if (objCPEnRelation.CustomerProspect1.OffShore.Value)
                            {
                                var optValOui = model.OptionData.Where(o => o.Option.idOption == 1118).FirstOrDefault();
                                if (optValOui != null) optValOui.IsSelected = true;
                            }
                            else
                            {
                                var optValNon = model.OptionData.Where(o => o.Option.idOption == 1119).FirstOrDefault();
                                if (optValNon != null) optValNon.IsSelected = true;
                            }
                        }
                        #endregion

                        #region IsResident
                        if (objCPEnRelation.CustomerProspect1.IsResident != null)
                        {
                            model = ClearRadioSelectionByIdParent(model, 1110);

                            if (objCPEnRelation.CustomerProspect1.IsResident.Value)
                            {
                                var optValResident = model.OptionData.Where(o => o.Option.idOption == 1111).FirstOrDefault();
                                if (optValResident != null) optValResident.IsSelected = true;
                            }
                            else
                            {
                                var optValNonResident = model.OptionData.Where(o => o.Option.idOption == 1112).FirstOrDefault();
                                if (optValNonResident != null) optValNonResident.IsSelected = true;
                            }
                        }
                        #endregion

                        #region Identité "Etes vous majeur" GESTION DES RADIOBUTTON
                        if (objCPEnRelation.CustomerProspect1.LegalCapacity != null)
                        {
                            model = ClearRadioSelectionByIdParent(model, 1151);

                            if (objCPEnRelation.CustomerProspect1.LegalCapacity.CompareTo("Mineur non émancipé") == 0)
                            {
                                var optValLegalCapacity = model.OptionData.Where(o => o.Option.idOption == 1156).FirstOrDefault();
                                if (optValLegalCapacity != null) optValLegalCapacity.IsSelected = true;
                            }
                            else if (objCPEnRelation.CustomerProspect1.LegalCapacity.CompareTo("Majeur capable") == 0)
                            {
                                var optValLegalCapacity = model.OptionData.Where(o => o.Option.idOption == 1152).FirstOrDefault();
                                if (optValLegalCapacity != null) optValLegalCapacity.IsSelected = true;
                            }
                            else if (objCPEnRelation.CustomerProspect1.LegalCapacity.CompareTo("Majeur sous tutelle") == 0)
                            {
                                var optValLegalCapacity = model.OptionData.Where(o => o.Option.idOption == 1153).FirstOrDefault();
                                if (optValLegalCapacity != null) optValLegalCapacity.IsSelected = true;
                            }
                            else if (objCPEnRelation.CustomerProspect1.LegalCapacity.CompareTo("Majeur sous curatelle") == 0)
                            {
                                var optValLegalCapacity = model.OptionData.Where(o => o.Option.idOption == 1154).FirstOrDefault();
                                if (optValLegalCapacity != null) optValLegalCapacity.IsSelected = true;
                            }
                            else if (objCPEnRelation.CustomerProspect1.LegalCapacity.CompareTo("Majeur sous sauvegarde de justice") == 0)
                            {
                                var optValLegalCapacity = model.OptionData.Where(o => o.Option.idOption == 1155).FirstOrDefault();
                                if (optValLegalCapacity != null) optValLegalCapacity.IsSelected = true;
                            }
                            else if (objCPEnRelation.CustomerProspect1.LegalCapacity.CompareTo("Mineur émancipé") == 0)
                            {
                                var optValLegalCapacity = model.OptionData.Where(o => o.Option.idOption == 1157).FirstOrDefault();
                                if (optValLegalCapacity != null) optValLegalCapacity.IsSelected = true;
                            }
                        }
                        #endregion
                    }
                }
                #endregion

            }

            return actionResult;
        }
        public List<ReportOptionValue> GetSelectedOptionsFromPostData(RecueilModel _dataModel, int idParent)
        {
            List<ReportOptionValue> retVal = new List<ReportOptionValue>();

            Option ParentOption = _dataModel.Option.Where(o => o.idOption.Equals(idParent)).FirstOrDefault();

            if (ParentOption != null)
            {
                if (ParentOption.idOption == 285)
                { }
                var ChildOptions = _dataModel.Option.Where(o => o.idParent.HasValue && o.idParent.Value.Equals(ParentOption.idOption));
                foreach (var childOp in ChildOptions)
                {
                    bool isSelected = !ParentOption.SingleOption.HasValue;
                    string idPrefix = string.Empty;
                    if (ParentOption.SingleOption.HasValue)
                    {
                        if (ParentOption.SingleOption.Value) idPrefix = "hdn_rb_{0}_{1}";
                        else idPrefix = "hdn_chk_{0}_{1}";

                        string postDataName = string.Format(idPrefix, childOp.idParent.Value, childOp.idOption);
                        if (!string.IsNullOrEmpty(Request.Params[postDataName]) && Request.Params[postDataName].ToLower().Equals("c"))
                        {
                            isSelected = true;
                        }
                    }

                    if (isSelected)
                    {
                        ReportOptionValue newVal = new ReportOptionValue();
                        newVal.idReport = _dataModel.Report.idReport;
                        newVal.idOption = childOp.idOption;
                        newVal.Option = childOp;
                        retVal.Add(newVal);

                        if (_dataModel.Option.Count(o => o.idParent.HasValue && o.idParent.Value.Equals(childOp.idOption)) > 0)
                        {
                            retVal.AddRange(GetSelectedOptionsFromPostData(_dataModel, childOp.idOption));
                        }
                    }
                }
            }

            return retVal;
        }
        public List<ReportOptionValue> GetSelectedOptions(RecueilModel _dataModel)
        {
            List<ReportOptionValue> retVal = new List<ReportOptionValue>();

            var ParentOptions = _dataModel.Option.Where(o => !o.idParent.HasValue);
            if (ParentOptions != null)
            {
                foreach (var parent in ParentOptions)
                {
                    ReportOptionValue _parent = new ReportOptionValue();
                    _parent.idReport = _dataModel.Report.idReport;
                    _parent.idOption = parent.idOption;
                    _parent.Option = parent;
                    retVal.Add(_parent);

                    var selectedChild = GetSelectedOptionsFromPostData(_dataModel, parent.idOption);
                    if (selectedChild.Count > 0)
                    {
                        ReportOptionValue newVal = new ReportOptionValue();
                        newVal.idReport = _dataModel.Report.idReport;
                        newVal.idOption = parent.idOption;
                        newVal.Option = parent;
                        retVal.Add(newVal);
                        retVal.AddRange(selectedChild);
                    }
                }
            }

            return retVal;
        }