//
        // GET: /AgregInitialiseRevenus/

        public string Index()
        {
            try
            {

                using (UpsilabEntities context = new UpsilabEntities())
                {

                    // liste CustomerProspect
                    List<CustomerProspect> customers = CustomerProspectBL.GetCustomerProspectList(context);

                    Report report = null;
                    Report reportValues = null;
                    Guid idClient = Guid.Empty;
                    List<ReportOptionAttributeValue> listeReportImmoJouissance = null;
                    List<ReportOptionAttributeValue> listeReportImmoRapport = null;
                    List<ReportOptionAttributeValue> listeReportProfessionnel = null;

                    //boucle sur les clients
                    Guid currentAgregClientId = Guid.Empty;
                    foreach (CustomerProspect cp in customers)
                    {
                        //teste si client existe dans agreg si non on ajoute et maj customer -- ou ne rien faire
                        currentAgregClientId = cp.idAgregClient.HasValue ? cp.idAgregClient.Value : Guid.Empty;

                        if (!cp.idAgregClient.HasValue)
                        {
                            ag_upsideo_client agregClientToAdd = new ag_upsideo_client()
                            {
                                idclient = Guid.NewGuid(),
                                idcgp = cp.User1.idAgregCGP.Value,
                                nomclient = cp.User.UserName,
                                prenomclient = cp.User.UserFirstName,
                                adr = cp.Adress,
                                cp = cp.ZipCode,
                                ville = cp.City,
                                titre = cp.Title,
                                ddn = DateTime.Now,
                                deleted = "n"
                            };
                            context.ag_upsideo_client.AddObject(agregClientToAdd);

                            cp.idAgregClient = agregClientToAdd.idclient;
                            currentAgregClientId = agregClientToAdd.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
                        Guid idAgregCabinet = cp.FirmInstitution.ag_upsideo_cabinet.idcrmcabinet;
                        ag_upsideo_fournisseur agregFournisseur = context.ag_upsideo_fournisseur.Where(f => f.idcrmcabinet == cp.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();
                            }
                        }

                        //------------------

                        // obtenir le dernier repport pour chaque client (customerprospect)
                        report = new Report();
                        report = ReportBL.GetLatestReportByIdCustomerProspect(cp.idCustomer);

                        if (report != null)
                        {

                            //obtenir les donnés de report
                            reportValues = new Report();
                            reportValues = ReportBL.GetReportWithValues(report.idReport);

                            //obtenir ReportOptionAttributeValue
                            // idOptionAttribute = 204 (1. Immobilier de jouissance (résidence principale, résidence secondaire, terrain à bâtir ou non, etc.)
                            // idOptionAttribute = 205 (2. Immobilier de rapport (location, SICAFI, SIR, certificats immobiliers, sociétés immobilières, etc.)
                            // idOptionAttribute = 206 (c) Patrimoine professionnel (parts sociales, clientèle, fonds de commerce), compte courant, compte d’associé)
                            listeReportImmoJouissance = new List<ReportOptionAttributeValue>();
                            listeReportImmoRapport = new List<ReportOptionAttributeValue>();
                            listeReportProfessionnel = new List<ReportOptionAttributeValue>();

                            if (reportValues.ReportOptionAttributeValue != null && reportValues.ReportOptionAttributeValue.Count > 0)
                            {
                                listeReportImmoJouissance = reportValues.ReportOptionAttributeValue.Where(r => r.idOptionAttribute == 204).ToList();
                                listeReportImmoRapport = reportValues.ReportOptionAttributeValue.Where(r => r.idOptionAttribute == 205).ToList();
                                listeReportProfessionnel = reportValues.ReportOptionAttributeValue.Where(r => r.idOptionAttribute == 206).ToList();

                                dynamic customData = null;
                                string numcompteFictif = string.Empty;
                                int ligneImmoJ = 0;
                                int ligneImmoR = 0;
                                int lignePro = 0;

                                foreach (ReportOptionAttributeValue roav in listeReportImmoJouissance)
                                {
                                    //les valeur dans receuil lab
                                    customData = roav.CustomObjectValue;
                                    //clé de maj pour les revenus dans la table ag_upsideo_compte
                                    numcompteFictif = string.Format("{0}_{1}", roav.idOptionAttribute.ToString(), ligneImmoJ.ToString());
                                    //pour tester les revenus
                                    if (customData.Values["Description"] != null && customData.Values["Description"] != "")
                                    {
                                        //teste si existe déjà (maj) si no new
                                        ag_upsideo_compte currentCompte = context.ag_upsideo_compte.Where(c => c.idclient == currentAgregClientId && c.numcompte == numcompteFictif).FirstOrDefault();
                                        //update
                                        if (currentCompte != null)
                                        {
                                            currentCompte.designation = customData.Values["Description"];
                                            currentCompte.dateacquisition = customData.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(customData.Values["AcquisitionDate"]) : null;
                                            currentCompte.valeuracquisition = customData.Values["AcquisitionValue"] != "" ? Convert.ToDouble(customData.Values["AcquisitionValue"]) : null;
                                            currentCompte.totalcompte = customData.Values["CurrentValue"] != "" ? Convert.ToDouble(customData.Values["CurrentValue"]) : null;
                                            currentCompte.idfrontfournisseur = agregFournisseur.idfrontfournisseur;
                                            currentCompte.type = "n"; //non gere


                                        }
                                        //new
                                        else
                                        {
                                            currentCompte = new ag_upsideo_compte()
                                            {
                                                idclient = currentAgregClientId,
                                                idcgp = cp.User1.idAgregCGP.Value,
                                                idfrontfournisseur = agregFournisseur.idfrontfournisseur,
                                                numcompte = numcompteFictif,
                                                typecontrat = "bien immobilier",
                                                deleted = "n",

                                                designation = customData.Values["Description"],
                                                dateacquisition = customData.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(customData.Values["AcquisitionDate"]) : null,
                                                valeuracquisition = customData.Values["AcquisitionValue"] != "" ? Convert.ToDouble(customData.Values["AcquisitionValue"]) : null,
                                                totalcompte = customData.Values["CurrentValue"] != "" ? Convert.ToDouble(customData.Values["CurrentValue"]) : null,

                                                type = "n", //non gere

                                            };
                                            context.ag_upsideo_compte.AddObject(currentCompte);
                                        }
                                    }
                                    ligneImmoJ = ligneImmoJ + 1;
                                }

                                foreach (ReportOptionAttributeValue roav in listeReportImmoRapport)
                                {
                                    customData = roav.CustomObjectValue;
                                    numcompteFictif = string.Format("{0}_{1}", roav.idOptionAttribute.ToString(), ligneImmoR.ToString());
                                    //pour tester les revenus
                                    if (customData.Values["Description"] != null && customData.Values["Description"] != "")
                                    {
                                        //teste si existe déjà (maj) si no new
                                        ag_upsideo_compte currentCompte = context.ag_upsideo_compte.Where(c => c.idclient == currentAgregClientId && c.numcompte == numcompteFictif).FirstOrDefault();
                                        if (currentCompte != null)
                                        {
                                            currentCompte.designation = customData.Values["Description"];
                                            currentCompte.dateacquisition = customData.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(customData.Values["AcquisitionDate"]) : null;
                                            currentCompte.valeuracquisition = customData.Values["AcquisitionValue"] != "" ? Convert.ToDouble(customData.Values["AcquisitionValue"]) : null;
                                            currentCompte.totalcompte = customData.Values["CurrentValue"] != "" ? Convert.ToDouble(customData.Values["CurrentValue"]) : null;
                                            currentCompte.idfrontfournisseur = agregFournisseur.idfrontfournisseur;
                                            currentCompte.type = "n"; //non gere
                                        }
                                        else
                                        {
                                            currentCompte = new ag_upsideo_compte()
                                            {
                                                idclient = currentAgregClientId,
                                                idcgp = cp.User1.idAgregCGP.Value,
                                                idfrontfournisseur = agregFournisseur.idfrontfournisseur,
                                                numcompte = numcompteFictif,
                                                typecontrat = "bien immobilier",
                                                deleted = "n",

                                                designation = customData.Values["Description"],
                                                dateacquisition = customData.Values["AcquisitionDate"] != "" ? Convert.ToDateTime(customData.Values["AcquisitionDate"]) : null,
                                                valeuracquisition = customData.Values["AcquisitionValue"] != "" ? Convert.ToDouble(customData.Values["AcquisitionValue"]) : null,
                                                totalcompte = customData.Values["CurrentValue"] != "" ? Convert.ToDouble(customData.Values["CurrentValue"]) : null,

                                                type = "n", //non gere
                                            };
                                            context.ag_upsideo_compte.AddObject(currentCompte);
                                        }
                                    }
                                    ligneImmoR = ligneImmoR + 1;
                                }

                                foreach (ReportOptionAttributeValue roav in listeReportProfessionnel)
                                {
                                    customData = roav.CustomObjectValue;
                                    numcompteFictif = string.Format("{0}_{1}", roav.idOptionAttribute.ToString(), lignePro.ToString());
                                    //pour tester les revenus
                                    if (customData.Values["Description"] != null && customData.Values["Description"] != "")
                                    {
                                        double capital = 0;
                                        double.TryParse(customData.Values["OwnedCapital"], out capital);

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

                                        if (currentCompte != null)
                                        {
                                            currentCompte.designation = customData.Values["Description"];
                                            currentCompte.totalcompte = customData.Values["OwnedCapital"] != "" ? capital : (double?)null;
                                            currentCompte.idfrontfournisseur = agregFournisseur.idfrontfournisseur;
                                            currentCompte.type = "n"; //non gere
                                        }
                                        else
                                        {
                                            currentCompte = new ag_upsideo_compte()
                                            {
                                                idclient = currentAgregClientId,
                                                idcgp = cp.User1.idAgregCGP.Value,
                                                idfrontfournisseur = agregFournisseur.idfrontfournisseur,
                                                numcompte = numcompteFictif,
                                                typecontrat = "professionels",
                                                deleted = "n",

                                                designation = customData.Values["Description"],
                                                totalcompte = customData.Values["OwnedCapital"] != "" ? capital : (double?)null,

                                                type = "n", //non gere
                                            };
                                            context.ag_upsideo_compte.AddObject(currentCompte);
                                        }
                                    }
                                    lignePro = lignePro + 1;
                                }

                            }

                        }


                    }

                    context.SaveChanges();
                }

            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                return "Erreur : " + ex.Message;
            }
            
            return "OK";
        }
        private string BuildSignatureLog(Report report)
        {
            string signatureLog = string.Empty;

            //Conseiller name
            string userAdviserName = string.Empty;
            if (report.User != null)
            {
                userAdviserName = report.User.EntireName + "<br />";
            }

            if (report.Status == ReportBL.Status.InProgress.ToString())
            {
                signatureLog = string.Empty;
            }
            else if (report.Status == ReportBL.Status.WaitingForAdviserSignature.ToString())
            {
                //If not signed by adviser
                if (!report.SignedByCustomer)
                {
                    signatureLog = string.Format("<li>{1}<br />{0}</li>", userAdviserName, languageDataSignature.GetContent("attente_sign_conseiller"));
                }
                else
                {
                    //Already signed by the client
                    signatureLog = string.Format(@"<li>{3}<br />{4} {0}</li>
                                                   <li>{2}<br />{1}</li>", report.DateCustomerSignature.Value.ToShortDateString(), userAdviserName, languageDataSignature.GetContent("attente_sign_conseiller"), languageDataSignature.GetContent("signe_par_client"), languageDataSignature.GetContent("le"));
                }
            }
            else if (report.Status == ReportBL.Status.WaitingForClientSignature.ToString())
            {
                //If not signed by adviser
                if (!report.SignedByAdviser)
                {
                    signatureLog = string.Format(@"<li>{0}</li>", languageDataSignature.GetContent("attente_sign_client"));
                }
                else
                {
                    signatureLog = string.Format(@"<li>{3}<br />{0}{4} {1}</li>
                                               <li>{2}</li>", userAdviserName, report.DateAdviserSignature.Value.ToShortDateString(), languageDataSignature.GetContent("attente_sign_client"), languageDataSignature.GetContent("signe_par_conseiller"), languageDataSignature.GetContent("le"));
                }

                //Relance email
                if (!string.IsNullOrEmpty(report.DatesSendReminderEmail))
                {
                    signatureLog += string.Format("{0}<br />{1}", _languageDataSideBar.GetContent("reminder_email_sent_on"), report.DatesSendReminderEmail.Replace(";", "<br />"));
                }

            }
            else if (report.Status == ReportBL.Status.WaitingForClientUpdate.ToString())
            {
                signatureLog = string.Format(@"<li>{0}</li>", languageDataSignature.GetContent("attente_info_sign_client"));
            }
            else if (report.Status == ReportBL.Status.Completed.ToString())
            {
                //Case signed manually
                if (!report.DateAdviserSignature.HasValue)
                {
                    signatureLog = string.Format(@"<li>{0}</li>", languageDataSignature.GetContent("signe_manu_conseiller_client"));
                }
                else
                {
                    string adviserText = string.Format(@"<li>{2}<br />{0}{3} {1}</li>", userAdviserName, report.DateAdviserSignature.Value.ToShortDateString(), languageDataSignature.GetContent("signe_par_conseiller"), languageDataSignature.GetContent("le"));
                    string clientText = string.Format(@"<li>{1}<br />{2} {0}</li>", report.DateCustomerSignature.Value.ToShortDateString(), languageDataSignature.GetContent("signe_par_client"), languageDataSignature.GetContent("le"));

                    if (DateTime.Compare(report.DateAdviserSignature.Value, report.DateCustomerSignature.Value) < 0) //Conseille signe en premier
                    {
                        signatureLog = string.Concat(adviserText, clientText);
                    }
                    else
                    {
                        signatureLog = string.Concat(clientText, adviserText);
                    }
                }
            }

            return signatureLog;

        }
        private Report CopyLatestReport(Report latestReport)
        {
            Report report = new Report()
            {
                idReport = Business.Utility.GuidHelper.GenerateGuid(),
                idCustomerProspect = latestReport.idCustomerProspect,
                DateCreated = DateTime.Now,
                DateUpdated = DateTime.Now, //needed in orderbydescending dateupdated (case get latest report) ?
                IsOriginal = true,
                Status = ReportBL.Status.InProgress.ToString(),
            };

            try
            {
                //Create report
                report = ReportBL.CreateReport(report);

                //Copy values : get latest and copy them to new report
                List<ReportOptionValue> reportOptionValues = ReportOptionBL.GetOptionValuesByIdReport(latestReport.idReport);
                ReportOptionBL.SaveReportOptionValues(report, reportOptionValues);
            }
            catch (Exception ex)
            {
                Business.Log.Log.AppendException(ex);
            }

            return report;
        }
        /// <summary>
        /// Enregistre l'indicateur d'enregistrement en base
        /// </summary>
        /// <param name="pReport"></param>
        /// <param name="pPageName"></param>
        public void SaveIndicator(Report pReport, string pPageName)
        {
            ///TODO : Create fields for this.
            ///AND Show image check in left menu according to these fields in sidebar PM/PP
            switch (pPageName)
            {
                case _Page_TitulairePP:
                case _Page_TitulairePM:
                    pReport.IsTitulaireSaved = true;
                    break;

                case _Page_PersonnePP:
                case _Page_PersonnePM:
                    return;

                case _Page_EntretienPP:
                case _Page_EntretienPM:
                    pReport.IsEntretienSaved = true;
                    break;

                case _Page_RevenusPP:
                case _Page_RevenusPM:
                    pReport.IsRevenuSaved = true;
                    break;

                case _Page_CreditsPP:
                    pReport.IsCreditSaved = true;
                    break;

                case _Page_ChargesPP:
                    pReport.IsChargesSaved = true;
                    break;

                case _Page_OrientationsPP:
                case _Page_OrientationsPM:
                    pReport.IsOrientationSaved = true;
                    break;

                case _Page_ProfilPP:
                case _Page_ProfilPM:
                    pReport.IsProfilSaved = true;
                    break;

                case _Page_CategorisationPP:
                case _Page_CategorisationPM:
                    pReport.IsCategorisationSaved = true;
                    break;

            }
            ReportBL.UpdateReport(pReport);
        }
        private Report CreateEmptyReport(Guid _idCustomer)
        {
            Report report = new Report();
            report.idCustomerProspect = _idCustomer;
            report.DateCreated = DateTime.Now;
            report.DateUpdated = DateTime.Now; //needed in orderbydescending dateupdated (case get latest report) ?
            report.IsOriginal = true;
            report.Status = ReportBL.Status.InProgress.ToString();

            //New : create empty report
            report.idReport = Business.Utility.GuidHelper.GenerateGuid();
            report = ReportBL.CreateReport(report);

            return report;
        }