public static bool UpdateAgregHistory(AgregHistoryModel model,int idSupportLiquidite)
        {
            using (Data.Model.UpsilabEntities context = new UpsilabEntities())
            {
                context.Connection.Open();
                using (var dbContextTransaction = context.Connection.BeginTransaction())
                {
                    var isCompteHistoryDetailsEmpty = false;
                    try
                    {
                        if (model.IdCompteHisto > 0)
                        {
                            var cptehisto = context.ag_upsideo_compte_histo.FirstOrDefault(x => x.Id == model.IdCompteHisto);
                            cptehisto.totalcompte = model.TotalCompte;
                        }
                        else
                        {
                            var cptehisto = new ag_upsideo_compte_histo
                            {
                                datehisto = model.DateHistory,
                                idfrontcompte = model.IdFrontCompte,
                                totalcompte = model.TotalCompte,
                                devise = string.Empty
                            };
                            context.ag_upsideo_compte_histo.AddObject(cptehisto);
                        }
                        context.SaveChanges();
                        //
                        //
                        //
                        if (model.CompteHistoryDetails != null && model.CompteHistoryDetails.Count > 0)
                        {
                            if (model.CompteHistoryDetails.Count == 1)
                            {
                                //Liquidité
                                if (model.CompteHistoryDetails[0].Quantite == 0 && model.CompteHistoryDetails[0].Vl == 1)
                                    isCompteHistoryDetailsEmpty = true;
                            }

                            foreach (var cptesupporthisto in model.CompteHistoryDetails)
                            {
                                if (cptesupporthisto.IdCpteSupportHistory == 0)
                                {
                                    var ag_cptesupporthi = new ag_upsideo_cptrelsupports_histo
                                    {
                                        datehisto = model.DateHistory,
                                        datemaj = model.DateHistory,
                                        idfrontcompte = model.IdFrontCompte,
                                        idfrontsupport = cptesupporthisto.IdFrontSupport,
                                        qte = cptesupporthisto.Quantite,
                                        vl = cptesupporthisto.Vl
                                    };
                                    context.ag_upsideo_cptrelsupports_histo.AddObject(ag_cptesupporthi);
                                }
                                else
                                {
                                    var ag_cptesupporthi = context.ag_upsideo_cptrelsupports_histo.FirstOrDefault(x => x.Id == cptesupporthisto.IdCpteSupportHistory);
                                    ag_cptesupporthi.datehisto = model.DateHistory;
                                    ag_cptesupporthi.datemaj = model.DateHistory;
                                    ag_cptesupporthi.idfrontcompte = model.IdFrontCompte;
                                    ag_cptesupporthi.idfrontsupport = cptesupporthisto.IdFrontSupport;
                                    ag_cptesupporthi.qte = cptesupporthisto.Quantite;
                                    ag_cptesupporthi.vl = cptesupporthisto.Vl;
                                }
                                context.SaveChanges();
                            }
                        }                        
                        //
                        //Liquidites
                        //
                        var ag_liquiditehistos = context.ag_upsideo_cptrelsupports_histo.Where(x => x.idfrontcompte == model.IdFrontCompte && x.idfrontsupport == idSupportLiquidite).ToList();
                        var ag_liquiditehisto = GetLiquiditeSupport(ag_liquiditehistos, model.DateHistory);
                        if (ag_liquiditehisto != null)
                        {
                            if (!isCompteHistoryDetailsEmpty)
                                ag_liquiditehisto.pru = model.TotalEspece;
                        }
                        else
                        {
                            ag_liquiditehisto = new ag_upsideo_cptrelsupports_histo
                            {
                                datehisto = model.DateHistory,
                                datemaj = model.DateHistory,
                                idfrontcompte = model.IdFrontCompte,
                                idfrontsupport = idSupportLiquidite,
                                qte = 0,
                                vl = 1,
                                pru = model.TotalEspece
                            };
                            context.ag_upsideo_cptrelsupports_histo.AddObject(ag_liquiditehisto);
                        }
                        context.SaveChanges();
                        //
                        //
                        //
                        dbContextTransaction.Commit();
                        return true;
                    }
                    catch (Exception e)
                    {
                        dbContextTransaction.Rollback();
                        Log.Log.AppendException(e);
                        return false;
                    }
                }
            }
        }
 public static ag_upsideo_compte_histo UpdateCpteHistory(ag_upsideo_compte_histo histo)
 {
     using (Data.Model.UpsilabEntities context = new UpsilabEntities())
     {
         if (histo.Id > 0)
         {
             var updatehisto = context.ag_upsideo_compte_histo.FirstOrDefault(x => x.Id == histo.Id);
             updatehisto.totalcompte = histo.totalcompte;
             context.SaveChanges();
             return updatehisto;
         }
         else
         {
             context.ag_upsideo_compte_histo.AddObject(histo);
             context.SaveChanges();
             return histo;
         }
     }
 }
        public ActionResult InsertOperation(ag_upsideo_operation _operation)
        {
            int idCompte = 0;
            SessionManager.Get<int>(agupsideocompteBL.AgregCompteIdSessionKey, out idCompte);
            Guid idAgregCGP = SessionManager.GetUserSession().idAgregCGP.Value;
            ag_upsideo_cgp cgpagreg = AgregCgpBL.GetCgpById(idAgregCGP);
            try
            {
                int idoperation = 0;
                idoperation = _operation.idop;
                ag_upsideo_operation newoperation;
                ag_upsideo_cptrelsupports cptsupport;
                ag_upsideo_cptrelsupports_histo cptsupporthisto;

                ag_upsideo_compte compte;
                ag_upsideo_support support;
                bool isValorisation = false;
                string action = "historique";
                if (Request.Form["Isvalorisation"] != null && Convert.ToInt32(Request.Form["Isvalorisation"]) == 1)
                {
                    isValorisation = true;
                    action = "valoriser";
                }
                //il faut en 1er créer le support selectionné depuis le réferentiel dans la table support
                //ensuite prendre le support depuis la table support
                
                if (_operation.idfrontsupport == 0 && Request.Form["idrefsupport"] != null && Convert.ToInt32(Request.Form["idrefsupport"]) != 0)
                {
                    using (UpsilabEntities db = new UpsilabEntities())
                    {
                        int idrefsupport = Convert.ToInt32(Request.Form["idrefsupport"]);
                        ag_upsideo_referentiel refer = db.ag_upsideo_referentiel.Where(r=>r.idrefsupport == idrefsupport).FirstOrDefault();
                        if (refer != null)
                        {                            
                            ag_upsideo_support newsup = new ag_upsideo_support()
                            {
                                idrefsupport = refer.idrefsupport,
                                idcrmcabinet = cgpagreg.idcrmcabinet,
                                idsg = 0,
                                idtypesupport = refer.idtypesupport,
                                nomsupport = refer.nomsupport,
                                datevl = refer.datevl,
                                vl = refer.vl,
                                codeisin = refer.codeisin,
                                devise = refer.devise,
                                niveaurisque = refer.niveaurisque,
                                categorisation = refer.categorisation,
                                Vleuro = refer.Vleuro,
                                actions = refer.actions,
                                obligations = refer.obligations,
                                monetaire = refer.monetaire,
                                immobilier = refer.immobilier,
                                autres = refer.autres,
                                Performance12mois = refer.Performance12mois,
                                Performance3112 = refer.Performance3112,
                                Performance60mois = refer.Performance60mois,
                                Volatilite12mois = refer.Volatilite12mois,
                                Volatilite60mois = refer.Volatilite60mois,
                                deleted = "n",
                                fiche_prospectus = refer.fiche_prospectus,
                                fiche_dici = refer.fiche_dici
                            };
                            db.ag_upsideo_support.AddObject(newsup);
                            db.SaveChanges();
                            //set new support
                            _operation.idfrontsupport = newsup.idfrontsupport;
                        }
                    }
                }
                using (UpsilabEntities db = new UpsilabEntities())
                {
                    newoperation = db.ag_upsideo_operation.Where(m => m.idop == idoperation).FirstOrDefault();
                    if (idoperation == 0)
                    {
                        newoperation = new ag_upsideo_operation()
                        {
                            Idfrontcompte = idCompte,                            
                            libelleoperation = _operation.libelleoperation,
                            qte = _operation.qte,
                            vl = _operation.vl,
                            frais = _operation.frais, 
                            idfrontsupport = _operation.idfrontsupport,
                            action = action,
                            dateope = _operation.dateope,
                            deleted = "n"
                        };
                        //insert
                        db.ag_upsideo_operation.AddObject(newoperation);
                    }
                    else
                    {
                        newoperation.dateope = _operation.dateope;
                        newoperation.libelleoperation = _operation.libelleoperation;
                        newoperation.qte = _operation.qte;
                        newoperation.vl = _operation.vl;
                        newoperation.frais = _operation.frais;
                        newoperation.idfrontsupport = _operation.idfrontsupport;
                        newoperation.action = action;                        
                    }
                    //obtenir le compte
                    compte = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();
                    //gerer la table relation 
                    if(_operation.idfrontsupport != 0 && isValorisation)
                    {
                        double qteavantoperation = 0;
                        double qteoperation = 0;
                        double vlderniereoperation = 0;
                        double vloperation = 0;
                        bool isNewRelation = false;
                        
                        support = db.ag_upsideo_support.Where(s => s.idfrontsupport == _operation.idfrontsupport).FirstOrDefault();
                        cptsupport = db.ag_upsideo_cptrelsupports.Include("ag_upsideo_support").Where(c => c.Idfrontcompte == _operation.Idfrontcompte && c.idfrontsupport == _operation.idfrontsupport).FirstOrDefault();
                        cptsupporthisto = db.ag_upsideo_cptrelsupports_histo.Where(c => c.idfrontcompte == _operation.Idfrontcompte && c.idfrontsupport == _operation.idfrontsupport).OrderByDescending(o=>o.datehisto).FirstOrDefault();
                        if (cptsupport != null)
                        {
                            //update
                            //maj pru
                            if (cptsupporthisto != null)
                            {
                                qteavantoperation = cptsupport.qte.HasValue ? cptsupport.qte.Value : 0;
                                qteoperation = _operation.qte.HasValue ? _operation.qte.Value : 0;
                                vlderniereoperation = cptsupporthisto.vl.HasValue ? cptsupporthisto.vl.Value : 0;
                                //vloperation = (cptsupport.ag_upsideo_support != null && cptsupport.ag_upsideo_support.vl.HasValue) ? cptsupport.ag_upsideo_support.vl.Value : 0;
                                vloperation = _operation.vl.HasValue ? _operation.vl.Value : 0;
                                
                                if (_operation.libelleoperation.ToLower().Contains("vente"))
                                {                                    
                                    cptsupport.pru = (qteavantoperation == qteoperation) ? 0 :((qteavantoperation * vlderniereoperation) - (qteoperation * vloperation)) / (qteavantoperation - qteoperation);

                                }
                                else
                                {
                                    cptsupport.pru = ((qteavantoperation * vlderniereoperation) + (qteoperation * vloperation)) / (qteavantoperation + qteoperation);
                                }
                            }
                            //maj qté
                            if (_operation.libelleoperation.ToLower().Contains("vente") && _operation.qte.HasValue && cptsupport.qte.HasValue)
                            {
                                cptsupport.qte = (cptsupport.qte.HasValue ? cptsupport.qte.Value : 0) - (_operation.qte.HasValue ? _operation.qte.Value : 0);
                            }
                            else if (_operation.qte.HasValue && cptsupport.qte.HasValue)
                            {
                                cptsupport.qte = cptsupport.qte.Value + _operation.qte.Value;
                            }
                            cptsupport.datemaj = DateTime.Now;
                            
                        }
                        else
                        {
                            //ajout
                            isNewRelation = true;
                            //ajout pru
                            double pru = 0;                            
                            //vloperation = support.vl.HasValue ? support.vl.Value : 0;
                            vloperation = _operation.vl.HasValue ? _operation.vl.Value : 0;
                            if (!_operation.libelleoperation.ToLower().Contains("vente"))
                            {
                                pru = vloperation;
                            }
                            
                            //ajout qté
                            double qte = 0;
                            if (!_operation.libelleoperation.ToLower().Contains("vente") && _operation.qte.HasValue)
                            {
                                qte = _operation.qte.Value;
                            }                            

                            cptsupport = new ag_upsideo_cptrelsupports()
                            {
                                Idfrontcompte = _operation.Idfrontcompte,
                                idfrontsupport = _operation.idfrontsupport,
                                qte = qte,
                                pru = pru,
                                datemaj = DateTime.Now
                            };
                            db.ag_upsideo_cptrelsupports.AddObject(cptsupport);
                        }
                        //update pru liquidité
                        double montanthorsfrais = (_operation.qte.HasValue ? _operation.qte.Value : 0) * (_operation.vl.HasValue ? _operation.vl.Value : 0);
                        double liquidite= 0;
                        if (_operation.libelleoperation.ToLower().Contains("vente"))
                        {
                            liquidite = montanthorsfrais * (1 - (_operation.frais.HasValue ? _operation.frais.Value : 0) / 100);//txtmontanthorsfrais * (1 - txtfrais / 100);                                                       
                        }
                        else
                        {
                            liquidite = - montanthorsfrais * (1 + (_operation.frais.HasValue ? _operation.frais.Value : 0) / 100);//txtmontanthorsfrais * (1 + txtfrais / 100);                                                        
                        }

                        //voir si le cabinet a un fond fictif (nomsupport = Liquidités)                        
                        ag_upsideo_support supportfictif = db.ag_upsideo_support.Where(s => s.idcrmcabinet == cgpagreg.idcrmcabinet && s.nomsupport == "Liquidités" && (s.deleted == null || (s.deleted != null && s.deleted == "n"))).FirstOrDefault();
                        //si support fictif existe 
                        if (supportfictif != null)
                        {
                            ag_upsideo_cptrelsupports relationfictif = db.ag_upsideo_cptrelsupports.Where(s => s.Idfrontcompte == compte.Idfrontcompte && s.idfrontsupport == supportfictif.idfrontsupport).FirstOrDefault();
                            if(relationfictif != null)
                            {
                                relationfictif.pru = relationfictif.pru + liquidite;
                                relationfictif.qte = 1;
                            }
                        }
                        
                        //fin maj pru fictif
                        
                        
                        
                        //add histo ag_upsideo_cptrelsupports_histo
                        double mtfondeuro = 0;
                        List<ag_upsideo_cptrelsupports> cptsupportListe = new List<ag_upsideo_cptrelsupports>();
                        cptsupportListe = db.ag_upsideo_cptrelsupports.Include("ag_upsideo_support").Where(c => c.Idfrontcompte == _operation.Idfrontcompte).ToList();
                        foreach (ag_upsideo_cptrelsupports cptsupportnow in cptsupportListe)
                        {
                            if (cptsupportnow.ag_upsideo_support.vl.HasValue
                            && cptsupportnow.ag_upsideo_support.vl.Value > 0
                            && cptsupportnow.qte.HasValue
                            && cptsupportnow.qte.Value > 1)
                            {
                                mtfondeuro = cptsupportnow.qte.Value * cptsupportnow.ag_upsideo_support.vl.Value;
                            }
                            else
                            {
                                mtfondeuro = cptsupportnow.pru.HasValue ? cptsupportnow.pru.Value : 0;
                            }
                            //regarde si déjà dans l'histo pour la date du jour
                            ag_upsideo_cptrelsupports_histo cptsupporthistonow = db.ag_upsideo_cptrelsupports_histo.Where(h => h.idfrontcompte == idCompte
                                                                                            && h.idfrontsupport == cptsupportnow.idfrontsupport
                                                                                            && h.datehisto.Value.Year == DateTime.Now.Year
                                                                                            && h.datehisto.Value.Month == DateTime.Now.Month
                                                                                            && h.datehisto.Value.Day == DateTime.Now.Day).FirstOrDefault();
                            if (cptsupporthistonow != null)
                            {
                                cptsupporthistonow.datemaj = DateTime.Now;
                                cptsupporthistonow.qte = cptsupportnow.qte;
                                cptsupporthistonow.pru = cptsupportnow.pru;
                                cptsupporthistonow.vl = cptsupportnow.ag_upsideo_support.vl;
                                cptsupporthistonow.mtfondeuro = mtfondeuro;
                            }
                            else
                            {
                                cptsupporthistonow = new ag_upsideo_cptrelsupports_histo()
                                {
                                    datehisto = DateTime.Now,
                                    datemaj = DateTime.Now,
                                    idfrontcompte = cptsupportnow.Idfrontcompte,
                                    idfrontsupport = cptsupportnow.idfrontsupport,
                                    qte = cptsupportnow.qte,
                                    pru = cptsupportnow.pru,
                                    vl = cptsupportnow.ag_upsideo_support.vl,
                                    mtfondeuro = mtfondeuro
                                };
                                db.ag_upsideo_cptrelsupports_histo.AddObject(cptsupporthistonow);
                            }

                        }
                        //si un nouveau relation (pas encore dans la table relation)
                        if (isNewRelation)
                        {
                            if (support.vl.HasValue
                            && support.vl.Value > 0
                            && cptsupport.qte.HasValue
                            && cptsupport.qte.Value > 1)
                            {
                                mtfondeuro = cptsupport.qte.Value * cptsupport.ag_upsideo_support.vl.Value;
                            }
                            else
                            {
                                mtfondeuro = cptsupport.pru.HasValue ? cptsupport.pru.Value : 0;
                            }

                            ag_upsideo_cptrelsupports_histo cptsupporthistofornewrelation = new ag_upsideo_cptrelsupports_histo()
                            {
                                datehisto = DateTime.Now,
                                datemaj = DateTime.Now,
                                idfrontcompte = cptsupport.Idfrontcompte,
                                idfrontsupport = cptsupport.idfrontsupport,
                                qte = cptsupport.qte,
                                pru = cptsupport.pru,
                                vl = support.vl,
                                mtfondeuro = mtfondeuro
                            };
                            db.ag_upsideo_cptrelsupports_histo.AddObject(cptsupporthistofornewrelation);
                        }
                        //fin histo ag_upsideo_cptrelsupports_histo

                    }
                    //save
                    db.SaveChanges();
                    //après chaque opération , lancer la proc frontalweb_majtotalcompte (pour valorisé compte)                    
                    if (_operation.idfrontsupport != 0 && isValorisation)
                    {                        
                        Guid idClient = Guid.Empty;
                        SessionManager.Get<Guid>(agupsideocompteBL.AgregClientIdSessionKey, out idClient);
                        db.CommandTimeout = 180;
                        db.ExecuteStoreCommand("exec agreg.frontalweb_majtotalcompte @idcrmcabinet,@idfrontcompte", new SqlParameter("@idcrmcabinet", cgpagreg.idcrmcabinet), new SqlParameter("@idfrontcompte", idCompte));
                        //save
                        db.SaveChanges();    
                    }                                   
                    
                }

                if (_operation.idfrontsupport != 0 && isValorisation)
                {
                    using (UpsilabEntities db = new UpsilabEntities())
                    {
                        //compte aprés maj
                        ag_upsideo_compte compteahistoriser = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();

                        //historisé dans ag_upsideo_compte_histo
                        ag_upsideo_compte_histo cpthisto = db.ag_upsideo_compte_histo.Where(h => h.idfrontcompte == idCompte
                                                                                            && h.datehisto.Year == DateTime.Now.Year
                                                                                            && h.datehisto.Month == DateTime.Now.Month
                                                                                            && h.datehisto.Day == DateTime.Now.Day).FirstOrDefault();
                        if (cpthisto != null)
                        {
                            cpthisto.datehisto = DateTime.Now;
                            cpthisto.totalcompte = compteahistoriser.totalcompte.Value;
                        }
                        else
                        {
                            ag_upsideo_compte_histo cpthistonew = new ag_upsideo_compte_histo()
                            {
                                datehisto = DateTime.Now,
                                idfrontcompte = compteahistoriser.Idfrontcompte,
                                devise = string.IsNullOrEmpty(compteahistoriser.devise) ? "EUR" : compteahistoriser.devise,
                                totalcompte = compteahistoriser.totalcompte.HasValue ? compteahistoriser.totalcompte.Value : 0
                            };
                            //insert
                            db.ag_upsideo_compte_histo.AddObject(cpthistonew);
                        }
                        //save
                        db.SaveChanges();
                        //fin historisation
                    }
                }


            }
            catch (Exception ex)
            {
                ViewBag.Style = "style=color:red";
                ViewBag.Message = "Erreur: " + ex.Message;
                Upsilab.Business.Log.Log.AppendException(ex);
            }

            return RedirectToAction("Index", new { id = idCompte });
           
        }
        public ActionResult Deleteoperation(string id)
        {
            try
            {
                int idop = 0;
                Int32.TryParse(id, out idop);
                bool isValorisation = false;
                bool isOpdeleted = false;
                Guid idAgregCgp = SessionManager.GetUserSession().idAgregCGP.Value;
                ag_upsideo_cgp agregcgp = AgregCgpBL.GetCgpById(idAgregCgp);
                int idCompte = 0;
                SessionManager.Get<int>(agupsideocompteBL.AgregCompteIdSessionKey, out idCompte);
                using (UpsilabEntities db = new UpsilabEntities())
                {
                    ag_upsideo_cptrelsupports cptsupport;
                    ag_upsideo_cptrelsupports_histo cptsupporthisto;
                    ag_upsideo_operation op = db.ag_upsideo_operation.Where(o => o.idop == idop).FirstOrDefault();
                    if (op != null)
                    {
                        op.deleted = "o";
                        //save
                        db.SaveChanges();
                        //op.dateope = DateTime.Now;
                        isValorisation = (!string.IsNullOrEmpty(op.action) && op.action.ToLower() == "valoriser") ? true : false;
                        if (op.idfrontsupport != 0 && isValorisation)
                        {
                            double qteavantoperation = 0;
                            double qteoperation = 0;
                            double vlderniereoperation = 0;
                            double vloperation = 0;
                            cptsupport = db.ag_upsideo_cptrelsupports.Include("ag_upsideo_support").Where(c => c.Idfrontcompte == op.Idfrontcompte && c.idfrontsupport == op.idfrontsupport).FirstOrDefault();
                            cptsupporthisto = db.ag_upsideo_cptrelsupports_histo.Where(c => c.idfrontcompte == op.Idfrontcompte && c.idfrontsupport == op.idfrontsupport).FirstOrDefault();
                            if (cptsupport != null && cptsupporthisto != null)
                            {
                                //update
                                //maj pru
                                qteavantoperation = cptsupport.qte.HasValue ? cptsupport.qte.Value : 0;
                                qteoperation = op.qte.HasValue ? op.qte.Value : 0;
                                vlderniereoperation = cptsupporthisto.vl.HasValue ? cptsupporthisto.vl.Value : 0;
                                //vloperation = (cptsupport.ag_upsideo_support != null && cptsupport.ag_upsideo_support.vl.HasValue) ? cptsupport.ag_upsideo_support.vl.Value : 0;
                                vloperation = op.vl.HasValue ? op.vl.Value : 0;                                
                                
                                if (op.libelleoperation.ToLower().Contains("vente"))
                                {
                                    cptsupport.pru = ((qteavantoperation * vlderniereoperation) + (qteoperation * vloperation)) / (qteavantoperation + qteoperation);
                                }
                                else
                                {
                                    cptsupport.pru = (qteavantoperation == qteoperation)? 0 : ((qteavantoperation * vlderniereoperation) - (qteoperation * vloperation)) / (qteavantoperation - qteoperation);
                                }
                                //maj qté
                                if (op.libelleoperation.ToLower().Contains("vente") && op.qte.HasValue && cptsupport.qte.HasValue)
                                {
                                    cptsupport.qte = (cptsupport.qte.HasValue ? cptsupport.qte.Value : 0) + (op.qte.HasValue ? op.qte.Value : 0);
                                }
                                else if (op.qte.HasValue && cptsupport.qte.HasValue)
                                {
                                    cptsupport.qte = (cptsupport.qte.HasValue ? cptsupport.qte.Value : 0) - (op.qte.HasValue ? op.qte.Value : 0);
                                }                                
                                cptsupport.datemaj = DateTime.Now;

                                //update pru liquidité
                                double montanthorsfrais = (op.qte.HasValue ? op.qte.Value : 0) * (op.vl.HasValue ? op.vl.Value : 0);
                                double liquidite = 0;
                                if (op.libelleoperation.ToLower().Contains("vente"))
                                {
                                    liquidite = -montanthorsfrais * (1 + (op.frais.HasValue ? op.frais.Value : 0) / 100);//txtmontanthorsfrais * (1 + txtfrais / 100);                                                       
                                }
                                else
                                {
                                    liquidite = montanthorsfrais * (1 - (op.frais.HasValue ? op.frais.Value : 0) / 100);//txtmontanthorsfrais * (1 - txtfrais / 100);                                                       
                                }

                                //voir si le cabinet a un fond fictif (nomsupport = Liquidités)                        
                                ag_upsideo_support supportfictif = db.ag_upsideo_support.Where(s => s.idcrmcabinet == agregcgp.idcrmcabinet && s.nomsupport == "Liquidités" && (s.deleted == null || (s.deleted != null && s.deleted == "n"))).FirstOrDefault();
                                //si support fictif existe 
                                if (supportfictif != null)
                                {
                                    ag_upsideo_cptrelsupports relationfictif = db.ag_upsideo_cptrelsupports.Where(s => s.Idfrontcompte == op.Idfrontcompte && s.idfrontsupport == supportfictif.idfrontsupport).FirstOrDefault();
                                    if (relationfictif != null)
                                    {
                                        relationfictif.pru = relationfictif.pru + liquidite;
                                        relationfictif.qte = 1;
                                    }
                                }
                                //fin liquidité
                        
                            }
                        }

                        //save
                        db.SaveChanges();
                        //après chaque opération , lancer la proc frontalweb_majtotalcompte                      
                       
                        db.ExecuteStoreCommand("exec agreg.frontalweb_majtotalcompte @idcrmcabinet,@idfrontcompte", new SqlParameter("@idcrmcabinet", agregcgp.idcrmcabinet), new SqlParameter("@idfrontcompte", idCompte));
                        isOpdeleted = true;
                    }
                }
                if (isOpdeleted)
                {
                    using (UpsilabEntities db = new UpsilabEntities())
                    {
                        //add histo ag_upsideo_cptrelsupports_histo
                        double mtfondeuro = 0;
                        List<ag_upsideo_cptrelsupports> cptsupportListe = new List<ag_upsideo_cptrelsupports>();
                        cptsupportListe = db.ag_upsideo_cptrelsupports.Include("ag_upsideo_support").Where(c => c.Idfrontcompte == idCompte).ToList();
                        foreach (ag_upsideo_cptrelsupports cptsupportnow in cptsupportListe)
                        {
                            if (cptsupportnow.ag_upsideo_support.vl.HasValue
                            && cptsupportnow.ag_upsideo_support.vl.Value > 0
                            && cptsupportnow.qte.HasValue
                            && cptsupportnow.qte.Value > 1)
                            {
                                mtfondeuro = cptsupportnow.qte.Value * cptsupportnow.ag_upsideo_support.vl.Value;
                            }
                            else
                            {
                                mtfondeuro = cptsupportnow.pru.HasValue ? cptsupportnow.pru.Value : 0;
                            }
                            //regarde si déjà dans l'histo pour la date du jour
                            ag_upsideo_cptrelsupports_histo cptsupporthistonow = db.ag_upsideo_cptrelsupports_histo.Where(h => h.idfrontcompte == idCompte
                                                                                            && h.idfrontsupport == cptsupportnow.idfrontsupport
                                                                                            && h.datehisto.Value.Year == DateTime.Now.Year
                                                                                            && h.datehisto.Value.Month == DateTime.Now.Month
                                                                                            && h.datehisto.Value.Day == DateTime.Now.Day).FirstOrDefault();
                            if (cptsupporthistonow != null)
                            {
                                cptsupporthistonow.datemaj = DateTime.Now;
                                cptsupporthistonow.qte = cptsupportnow.qte;
                                cptsupporthistonow.pru = cptsupportnow.pru;
                                cptsupporthistonow.vl = cptsupportnow.ag_upsideo_support.vl;
                                cptsupporthistonow.mtfondeuro = mtfondeuro;
                            }
                            else
                            {
                                cptsupporthistonow = new ag_upsideo_cptrelsupports_histo()
                                {
                                    datehisto = DateTime.Now,
                                    datemaj = DateTime.Now,
                                    idfrontcompte = cptsupportnow.Idfrontcompte,
                                    idfrontsupport = cptsupportnow.idfrontsupport,
                                    qte = cptsupportnow.qte,
                                    pru = cptsupportnow.pru,
                                    vl = cptsupportnow.ag_upsideo_support.vl,
                                    mtfondeuro = mtfondeuro
                                };
                                db.ag_upsideo_cptrelsupports_histo.AddObject(cptsupporthistonow);
                            }

                        }

                        //compte aprés maj
                        ag_upsideo_compte compteahistoriser = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();

                        //historisé dans ag_upsideo_compte_histo
                        ag_upsideo_compte_histo cpthisto = db.ag_upsideo_compte_histo.Where(h => h.idfrontcompte == idCompte
                                                                                            && h.datehisto.Year == DateTime.Now.Year
                                                                                            && h.datehisto.Month == DateTime.Now.Month
                                                                                            && h.datehisto.Day == DateTime.Now.Day).FirstOrDefault();
                        if (cpthisto != null)
                        {
                            cpthisto.datehisto = DateTime.Now;
                            cpthisto.totalcompte = compteahistoriser.totalcompte.Value;
                        }
                        else
                        {
                            ag_upsideo_compte_histo cpthistonew = new ag_upsideo_compte_histo()
                            {
                                datehisto = DateTime.Now,
                                idfrontcompte = compteahistoriser.Idfrontcompte,
                                devise = string.IsNullOrEmpty(compteahistoriser.devise) ? "EUR" : compteahistoriser.devise,
                                totalcompte = compteahistoriser.totalcompte.HasValue ? compteahistoriser.totalcompte.Value : 0
                            };
                            //insert
                            db.ag_upsideo_compte_histo.AddObject(cpthistonew);
                        }
                        //save
                        db.SaveChanges();
                        //fin historisation
                    }
                }

            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                return Content("KO");
            }
            return Content("OK");
        }
        public ActionResult Deletemvmt(string id)
        {
            int idCompte = 0;
            SessionManager.Get<int>(agupsideocompteBL.AgregCompteIdSessionKey, out idCompte);
            int idmvmt = 0;
            Int32.TryParse(id, out idmvmt);
            Guid idAgregCgp = SessionManager.GetUserSession().idAgregCGP.Value;
            ag_upsideo_cgp agregcgp = AgregCgpBL.GetCgpById(idAgregCgp);
            try
            {
                ag_upsideo_compte compte;
                bool isValorisation = false;
                                
                using (UpsilabEntities db = new UpsilabEntities())
                {
                    ag_upsideo_mouvement _mvmt = db.ag_upsideo_mouvement.Where(m => m.idmouv == idmvmt).FirstOrDefault();
                    //new
                    if (_mvmt.libellemouvement.ToLower().Equals("souscription")
                        || _mvmt.libellemouvement.ToLower().Equals("coupon")
                        || _mvmt.libellemouvement.ToLower().Equals("remboursement")
                        || _mvmt.libellemouvement.ToLower() == "participation aux bénéfices"
                        || _mvmt.libellemouvement.ToLower() == "participation benefice"
                        || _mvmt.libellemouvement.ToLower() == "régulation historique"
                        || _mvmt.libellemouvement.ToLower() == "transfert"
                                    || _mvmt.libellemouvement.ToLower().Equals("souscription/adhésion/ouverture de compte")
                                    || _mvmt.libellemouvement.ToLower().Contains("versement"))
                    {
                        _mvmt.montantnet = _mvmt.montantnet.HasValue ? _mvmt.montantnet.Value : 0;                        
                    }
                    else
                    {
                        _mvmt.montantnet = _mvmt.montantnet.HasValue ? -Math.Abs(_mvmt.montantnet.Value) : 0;                        
                    }
                    //
                    compte = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();
                    if (_mvmt != null)
                    {
                        _mvmt.deleted = "o";
                        //save
                        db.SaveChanges();
                        //mvmt.datemvt = DateTime.Now;
                        isValorisation = (!string.IsNullOrEmpty(_mvmt.action) && _mvmt.action.ToLower() == "valoriser") ? true : false;                        
                        
                        if (isValorisation && compte != null)
                        {
                            string libellemouvement = _mvmt.libellemouvement.ToLower();
                            double pru = 0;                            
                            pru = _mvmt.montantnet.HasValue ? _mvmt.montantnet.Value : 0;                            

                            //voir si le cabinet a un fond fictif (nomsupport = Liquidités)                        
                            ag_upsideo_support support = db.ag_upsideo_support.Where(s => s.idcrmcabinet == agregcgp.idcrmcabinet && s.nomsupport == "Liquidités" && (s.deleted == null || (s.deleted != null && s.deleted == "n"))).FirstOrDefault();
                            if (support != null)
                            {
                                ag_upsideo_cptrelsupports relation = db.ag_upsideo_cptrelsupports.Where(s => s.Idfrontcompte == compte.Idfrontcompte && s.idfrontsupport == support.idfrontsupport).FirstOrDefault();
                                relation.pru = relation.pru + pru;
                                //save
                                db.SaveChanges();

                                db.CommandTimeout = 180;
                                db.ExecuteStoreCommand("exec agreg.frontalweb_majtotalcompte @idcrmcabinet,@idfrontcompte", new SqlParameter("@idcrmcabinet", agregcgp.idcrmcabinet), new SqlParameter("@idfrontcompte", idCompte));
                                //save
                                db.SaveChanges();
                            }                            

                        }    

                    }
                }
                //historiser
                if (isValorisation && compte != null)
                {
                    using (UpsilabEntities db = new UpsilabEntities())
                    {
                        //compte aprés maj
                        ag_upsideo_compte compteahistoriser = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();

                        //historisé dans ag_upsideo_compte_histo
                        ag_upsideo_compte_histo cpthisto = db.ag_upsideo_compte_histo.Where(h => h.idfrontcompte == idCompte
                                                                                            && h.datehisto.Year == DateTime.Now.Year
                                                                                            && h.datehisto.Month == DateTime.Now.Month
                                                                                            && h.datehisto.Day == DateTime.Now.Day).FirstOrDefault();
                        if (cpthisto != null)
                        {
                            cpthisto.datehisto = DateTime.Now;
                            cpthisto.totalcompte = compteahistoriser.totalcompte.Value;
                        }
                        else
                        {
                            ag_upsideo_compte_histo cpthistonew = new ag_upsideo_compte_histo()
                            {
                                datehisto = DateTime.Now,
                                idfrontcompte = compteahistoriser.Idfrontcompte,
                                devise = string.IsNullOrEmpty(compteahistoriser.devise) ? "EUR" : compteahistoriser.devise,
                                totalcompte = compteahistoriser.totalcompte.HasValue ? compteahistoriser.totalcompte.Value : 0
                            };
                            //insert
                            db.ag_upsideo_compte_histo.AddObject(cpthistonew);
                        }
                        //save
                        db.SaveChanges();
                        //fin historisation
                    }
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
                return Content("KO");
            }
            return Content("OK");
        }
        public ActionResult InsertMvmt(ag_upsideo_mouvement _mvmt)
        {
            int idCompte = 0;
            SessionManager.Get<int>(agupsideocompteBL.AgregCompteIdSessionKey, out idCompte);
            Guid idAgregCgp = SessionManager.GetUserSession().idAgregCGP.Value;
            ag_upsideo_cgp agregcgp = AgregCgpBL.GetCgpById(idAgregCgp);
            try
            {
                int idmouvement = 0;
                idmouvement = _mvmt.idmouv;
                ag_upsideo_mouvement newmvmt;
                ag_upsideo_compte compte;
                bool isValorisation = false;
                string action = "historique";
                if (Request.Form["Isvalorisation"] != null && Convert.ToInt32(Request.Form["Isvalorisation"]) == 1)
                {
                    isValorisation = true;
                    action = "valoriser";
                }
                //new
                if (_mvmt.libellemouvement.ToLower().Equals("souscription")
                    || _mvmt.libellemouvement.ToLower().Equals("coupon")
                    || _mvmt.libellemouvement.ToLower().Equals("remboursement")
                    || _mvmt.libellemouvement.ToLower() == "participation aux bénéfices"
                    || _mvmt.libellemouvement.ToLower() == "participation benefice"
                    || _mvmt.libellemouvement.ToLower() == "régulation historique"
                    || _mvmt.libellemouvement.ToLower() == "transfert"
                                || _mvmt.libellemouvement.ToLower().Equals("souscription/adhésion/ouverture de compte")
                                || _mvmt.libellemouvement.ToLower().Contains("versement"))
                {
                    _mvmt.montantnet = _mvmt.montantnet.HasValue ? _mvmt.montantnet.Value : 0;
                    _mvmt.montantbrut = _mvmt.montantbrut.HasValue ? _mvmt.montantbrut.Value : 0;
                    _mvmt.frais = _mvmt.frais.HasValue ? _mvmt.frais.Value : 0;
                }
                else
                {
                    _mvmt.montantnet = _mvmt.montantnet.HasValue ? -_mvmt.montantnet.Value : 0;
                    _mvmt.montantbrut = _mvmt.montantbrut.HasValue ? -_mvmt.montantbrut.Value : 0;
                    _mvmt.frais = _mvmt.frais.HasValue ? -_mvmt.frais.Value : 0;
                }
                //
                using (UpsilabEntities db = new UpsilabEntities())
                {
                    newmvmt = db.ag_upsideo_mouvement.Where(m => m.idmouv == idmouvement).FirstOrDefault();
                    if (idmouvement == 0)
                    {
                        newmvmt = new ag_upsideo_mouvement()
                        {
                            Idfrontcompte = idCompte,                            
                            libellemouvement = _mvmt.libellemouvement,
                            montantbrut = _mvmt.montantbrut,
                            montantnet = _mvmt.montantnet,
                            frais = _mvmt.frais/100,
                            devise = _mvmt.devise,
                            action = action,
                            datemvt = _mvmt.datemvt,
                            deleted = "n"
                        };
                        //insert
                        db.ag_upsideo_mouvement.AddObject(newmvmt);
                    }
                    else
                    {
                        newmvmt.datemvt = _mvmt.datemvt;
                        newmvmt.libellemouvement = _mvmt.libellemouvement;
                        newmvmt.montantbrut = _mvmt.montantbrut;
                        newmvmt.montantnet = _mvmt.montantnet;
                        newmvmt.frais = _mvmt.frais/100;
                        newmvmt.devise = _mvmt.devise;
                        newmvmt.action = action;                        
                    }
                    //save
                    db.SaveChanges();
                    //valoriser
                    //compte
                    compte = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();
                    if (isValorisation && compte !=null)
                    {
                        string libellemouvement = _mvmt.libellemouvement.ToLower();
                        double pru = 0;
                        //déjà definit en haut
                        /*if (libellemouvement.ToLower().Equals("souscription")
                                || libellemouvement.ToLower().Equals("souscription/adhésion/ouverture de compte")                                
                                || libellemouvement.ToLower().Contains("versement"))
                        {
                            pru = _mvmt.montantnet.HasValue ? _mvmt.montantnet.Value : 0;
                        }
                        else
                        {
                            pru = _mvmt.montantnet.HasValue ? -_mvmt.montantnet.Value : 0;
                        }*/
                        pru = _mvmt.montantnet.HasValue ? _mvmt.montantnet.Value : 0;
                        
                        //voir si le cabinet a un fond fictif (nomsupport = Liquidités)                        
                        ag_upsideo_support support = db.ag_upsideo_support.Where(s => s.idcrmcabinet == agregcgp.idcrmcabinet && s.nomsupport == "Liquidités" && (s.deleted == null || (s.deleted != null && s.deleted == "n"))).FirstOrDefault();
                        //crée un support si n'existe pas
                        if (support == null)
                        {
                            ag_upsideo_referentiel referentiel = db.ag_upsideo_referentiel.Where(r => r.nomsupport == "Liquidités").OrderByDescending(o => o.datevl).FirstOrDefault();
                            support = new ag_upsideo_support()
                            {
                                idrefsupport = referentiel.idrefsupport,
                                idcrmcabinet = agregcgp.idcrmcabinet,
                                idsg = -1,
                                idtypesupport = -1,
                                nomsupport = referentiel.nomsupport,
                                datevl = referentiel.datevl,
                                devise = referentiel.devise,
                                deleted = "n",
                                vl = 0,


                            };
                            support = AgregSupportBL.AddObjetcSupport(support);
                        }
                        else
                        {
                            support.deleted = "n";
                            support.vl = 0;
                        }
                        ag_upsideo_cptrelsupports relation = db.ag_upsideo_cptrelsupports.Where(s => s.Idfrontcompte == compte.Idfrontcompte && s.idfrontsupport == support.idfrontsupport).FirstOrDefault();
                        if (relation == null)
                        {
                            relation = new ag_upsideo_cptrelsupports()
                            {
                                Idfrontcompte = compte.Idfrontcompte,
                                idfrontsupport = support.idfrontsupport,
                                pru = pru,
                                qte = 1,
                                datemaj = DateTime.Now
                            };
                            db.ag_upsideo_cptrelsupports.AddObject(relation);
                        }
                        else
                        {
                            relation.pru = relation.pru + pru;
                            relation.qte = 1;
                        }
                        //save
                        db.SaveChanges();                                                                           
                        
                        db.CommandTimeout = 180;                        
                        db.ExecuteStoreCommand("exec agreg.frontalweb_majtotalcompte @idcrmcabinet,@idfrontcompte", new SqlParameter("@idcrmcabinet", agregcgp.idcrmcabinet), new SqlParameter("@idfrontcompte", idCompte));
                        //save
                        db.SaveChanges();
                        
                    }                    

                }

                if (isValorisation && compte != null)
                {
                    using (UpsilabEntities db = new UpsilabEntities())
                    {
                        //compte aprés maj
                        ag_upsideo_compte compteahistoriser = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();

                        //historisé dans ag_upsideo_compte_histo
                        ag_upsideo_compte_histo cpthisto = db.ag_upsideo_compte_histo.Where(h => h.idfrontcompte == idCompte
                                                                                            && h.datehisto.Year == DateTime.Now.Year
                                                                                            && h.datehisto.Month == DateTime.Now.Month
                                                                                            && h.datehisto.Day == DateTime.Now.Day).FirstOrDefault();
                        if (cpthisto != null)
                        {
                            cpthisto.datehisto = DateTime.Now;
                            cpthisto.totalcompte = compteahistoriser.totalcompte.Value;
                        }
                        else
                        {
                            ag_upsideo_compte_histo cpthistonew = new ag_upsideo_compte_histo()
                            {
                                datehisto = DateTime.Now,
                                idfrontcompte = compteahistoriser.Idfrontcompte,
                                devise = string.IsNullOrEmpty(compteahistoriser.devise) ? "EUR" : compteahistoriser.devise,
                                totalcompte = compteahistoriser.totalcompte.HasValue ? compteahistoriser.totalcompte.Value : 0
                            };
                            //insert
                            db.ag_upsideo_compte_histo.AddObject(cpthistonew);
                        }
                        //save
                        db.SaveChanges();
                        //fin historisation
                    }
                }
               
            }
            catch (Exception ex)
            {
                ViewBag.Style = "style=color:red";
                ViewBag.Message = "Erreur: " + ex.Message;                
            }

            return RedirectToAction("Index", new { id = idCompte });
        }
        public static ag_upsideo_compte_histo AddCompteHisto(ag_upsideo_compte compte)
        {            
            using (UpsilabEntities db = new UpsilabEntities())
            {
                ag_upsideo_compte_histo cpthisto = db.ag_upsideo_compte_histo.Where(h => h.idfrontcompte == compte.Idfrontcompte
                                                                                    && h.datehisto.Year == DateTime.Now.Year
                                                                                    && h.datehisto.Month == DateTime.Now.Month
                                                                                    && h.datehisto.Day == DateTime.Now.Day).FirstOrDefault();
                if (cpthisto != null)
                {
                    cpthisto.datehisto = DateTime.Now;
                    cpthisto.totalcompte = compte.totalcompte.HasValue ? compte.totalcompte.Value : 0;
                }
                else
                {
                    cpthisto = new ag_upsideo_compte_histo()
                    {
                        datehisto = DateTime.Now,
                        idfrontcompte = compte.Idfrontcompte,
                        devise = string.IsNullOrEmpty(compte.devise) ? "EUR" : compte.devise,
                        totalcompte = compte.totalcompte.HasValue ? compte.totalcompte.Value : 0
                    };
                    //insert
                    db.ag_upsideo_compte_histo.AddObject(cpthisto);
                }
                //save
                db.SaveChanges();

                return cpthisto;
            }
            
        }       
        public ActionResult UpdateSupport(ag_upsideo_cptrelsupports _cpt)
        {
            int idCompte = 0;
            SessionManager.Get<int>(agupsideocompteBL.AgregCompteIdSessionKey, out idCompte);
            Guid idCgpAgreg = Guid.Empty;
            User currentUser = SessionManager.GetUserSession();
            if (currentUser.IsEndUser())
            {
                CustomerProspect currentCustomer = SessionManager.GetCustomerProspectSession();
                User currenttUserCreated = currentCustomer.User1;
                idCgpAgreg = currenttUserCreated.idAgregCGP.Value;
            }
            else
            {
                idCgpAgreg = currentUser.idAgregCGP.Value;
            }
            ag_upsideo_cgp cgpagreg = AgregCgpBL.GetCgpById(idCgpAgreg);
            try
            {
                int IdFrontsupport = 0;
                double qte = 0;
                double pam = 0;
                int idrefsupport = 0;
                if (Request.Form["idsupport"] != null && !string.IsNullOrEmpty(Request.Form["idsupport"]))
                {
                    IdFrontsupport = Convert.ToInt32(Request.Form["idsupport"]);
                }
                if (Request.Form["quantite"] != null && !string.IsNullOrEmpty(Request.Form["quantite"]))
                {
                    qte = Convert.ToDouble(Request.Form["quantite"]);
                }
                if (Request.Form["pam"] != null && !string.IsNullOrEmpty(Request.Form["pam"]))
                {
                    pam = Convert.ToDouble(Request.Form["pam"]);
                }
                if (Request.Form["idrefsupport"] != null && !string.IsNullOrEmpty(Request.Form["idrefsupport"]))
                {
                    idrefsupport = Convert.ToInt32(Request.Form["idrefsupport"]);
                }

                //il faut en 1er créer le support selectionné depuis le réferentiel dans la table support
                //ensuite prendre le support depuis la table support                
                if (IdFrontsupport == 0 && idrefsupport > 0)
                {
                    using (UpsilabEntities db = new UpsilabEntities())
                    {
                        ag_upsideo_referentiel refer = db.ag_upsideo_referentiel.Where(r => r.idrefsupport == idrefsupport).FirstOrDefault();
                        if (refer != null)
                        {                            
                            ag_upsideo_support newsup = new ag_upsideo_support()
                            {
                                idrefsupport = refer.idrefsupport,
                                idcrmcabinet = cgpagreg.idcrmcabinet,
                                idsg = 0,
                                idtypesupport = refer.idtypesupport,
                                nomsupport = refer.nomsupport,
                                datevl = refer.datevl,
                                vl = refer.vl,
                                codeisin = refer.codeisin,
                                devise = refer.devise,
                                niveaurisque = refer.niveaurisque,
                                categorisation = refer.categorisation,
                                Vleuro = refer.Vleuro,
                                actions = refer.actions,
                                obligations = refer.obligations,
                                monetaire = refer.monetaire,
                                immobilier = refer.immobilier,
                                autres = refer.autres,
                                Performance12mois = refer.Performance12mois,
                                Performance3112 = refer.Performance3112,
                                Performance60mois = refer.Performance60mois,
                                Volatilite12mois = refer.Volatilite12mois,
                                Volatilite60mois = refer.Volatilite60mois,
                                deleted = "n",
                                fiche_prospectus = refer.fiche_prospectus,
                                fiche_dici = refer.fiche_dici
                            };
                            db.ag_upsideo_support.AddObject(newsup);
                            db.SaveChanges();
                            //set new support
                            IdFrontsupport = newsup.idfrontsupport;
                        }
                    }
                }
                using (UpsilabEntities db = new UpsilabEntities())
                {                  
                    //regarder si la table relation existe
                    ag_upsideo_cptrelsupports cptsupport = db.ag_upsideo_cptrelsupports.Include("ag_upsideo_support").Where(c => c.Idfrontcompte == idCompte && c.idfrontsupport == IdFrontsupport).FirstOrDefault();
                    ag_upsideo_cptrelsupports_histo cpthisto = db.ag_upsideo_cptrelsupports_histo.Where(c => c.idfrontcompte == idCompte && c.idfrontsupport == IdFrontsupport).FirstOrDefault();
                    //update
                    double qtedepart = 0;
                    bool isRachat = false;
                    bool isNewRelation = false;
                    if (cptsupport != null)
                    {
                        qtedepart = cptsupport.qte.HasValue ? cptsupport.qte.Value : 0;
                         isRachat =(qte < qtedepart) ? true : false;

                        if (qte == qtedepart)
                        {
                            ViewBag.Message = "Le pru n'a pas pu être calculé";
                            AgregCompteDetail agregcomptedetail = new AgregCompteDetail();
                            agregcomptedetail.AgregCompteDetailList = agupsideocompteBL.GetCompteDetail(idCompte);
                            agregcomptedetail.AgregCompte = agupsideocompteBL.GetComptesByIdCompte(idCompte);
                            agregcomptedetail.SoldeEspece = agupsideocompteBL.SoldeEspece(idCompte);
                            return View("CompteDetail",agregcomptedetail);
                        }
                        else
                        {
                            double vlhisto = 0;
                            if(cpthisto == null)
                            {
                                vlhisto = cptsupport.ag_upsideo_support.vl.HasValue ? cptsupport.ag_upsideo_support.vl.Value : 0;
                            }
                             else
                            {
                                vlhisto = cpthisto.vl.HasValue ? cpthisto.vl.Value : 0; 
                            }                           
                            //calcul pru
                            if (isRachat)
                            {
                                cptsupport.pru = ((qtedepart * vlhisto) - (qte * pam)) / (qtedepart - qte);                                
                            }
                            else
                            {
                                cptsupport.pru = ((qte * pam) - (qtedepart * vlhisto)) / (qte - qtedepart);                               
                            }
                            cptsupport.qte = qte;
                            cptsupport.datemaj = DateTime.Now;
                            
                        }
                    }
                    //ajout
                    else
                    {
                        //ajout pru
                        isNewRelation = true;
                        cptsupport = new ag_upsideo_cptrelsupports()
                        {
                            Idfrontcompte = idCompte,
                            idfrontsupport = IdFrontsupport,
                            qte = qte,
                            pru = pam,
                            datemaj = DateTime.Now
                        };                       
                        db.ag_upsideo_cptrelsupports.AddObject(cptsupport);
                    }

                    //update pru liquidité                    
                    double liquidite = 0;
                    liquidite = isRachat ? (qtedepart - qte) * pam : -(qte - qtedepart) * pam;
                    //voir si le cabinet a un fond fictif (nomsupport = Liquidités)                        
                    ag_upsideo_support supportfictif = db.ag_upsideo_support.Where(s => s.idcrmcabinet == cgpagreg.idcrmcabinet && s.nomsupport == "Liquidités" && (s.deleted == null || (s.deleted != null && s.deleted == "n"))).FirstOrDefault();
                    //si support fictif existe 
                    if (supportfictif != null)
                    {
                        ag_upsideo_cptrelsupports relationfictif = db.ag_upsideo_cptrelsupports.Where(s => s.Idfrontcompte == idCompte && s.idfrontsupport == supportfictif.idfrontsupport).FirstOrDefault();
                        if (relationfictif != null)
                        {
                            relationfictif.pru = relationfictif.pru + liquidite;
                            relationfictif.qte = 1;
                        }
                    }
                    //fin maj pru fictif

                    //add histo ag_upsideo_cptrelsupports_histo
                    double mtfondeuro = 0;
                    List<ag_upsideo_cptrelsupports> cptsupportListe = new List<ag_upsideo_cptrelsupports>();
                    cptsupportListe = db.ag_upsideo_cptrelsupports.Include("ag_upsideo_support").Where(c => c.Idfrontcompte == idCompte).ToList();
                    foreach (ag_upsideo_cptrelsupports cptsupportnow in cptsupportListe)
                    {
                        if (cptsupportnow.ag_upsideo_support.vl.HasValue
                        && cptsupportnow.ag_upsideo_support.vl.Value > 0
                        && cptsupportnow.qte.HasValue
                        && cptsupportnow.qte.Value > 1)
                        {
                            mtfondeuro = cptsupportnow.qte.Value * cptsupportnow.ag_upsideo_support.vl.Value;
                        }
                        else
                        {
                            mtfondeuro = cptsupportnow.pru.HasValue ? cptsupportnow.pru.Value : 0;
                        }
                        //regarde si déjà dans l'histo pour la date du jour
                        ag_upsideo_cptrelsupports_histo cptsupporthistonow = db.ag_upsideo_cptrelsupports_histo.Where(h => h.idfrontcompte == idCompte
                                                                                        && h.idfrontsupport == cptsupportnow.idfrontsupport
                                                                                        && h.datehisto.Value.Year == DateTime.Now.Year
                                                                                        && h.datehisto.Value.Month == DateTime.Now.Month
                                                                                        && h.datehisto.Value.Day == DateTime.Now.Day).FirstOrDefault();
                        if (cptsupporthistonow != null)
                        {
                            cptsupporthistonow.datemaj = DateTime.Now;
                            cptsupporthistonow.qte = cptsupportnow.qte;
                            cptsupporthistonow.pru = cptsupportnow.pru;
                            cptsupporthistonow.vl = cptsupportnow.ag_upsideo_support.vl;
                            cptsupporthistonow.mtfondeuro = mtfondeuro;
                        }
                        else
                        {
                            cptsupporthistonow = new ag_upsideo_cptrelsupports_histo()
                            {
                                datehisto = DateTime.Now,
                                datemaj = DateTime.Now,
                                idfrontcompte = cptsupportnow.Idfrontcompte,
                                idfrontsupport = cptsupportnow.idfrontsupport,
                                qte = cptsupportnow.qte,
                                pru = cptsupportnow.pru,
                                vl = cptsupportnow.ag_upsideo_support.vl,
                                mtfondeuro = mtfondeuro
                            };
                            db.ag_upsideo_cptrelsupports_histo.AddObject(cptsupporthistonow);
                        }

                    }
                    //si un nouveau relation (pas encore dans la table relation)
                    if (isNewRelation)
                    {
                        if (cptsupport.ag_upsideo_support != null
                        && cptsupport.ag_upsideo_support.vl.HasValue
                        && cptsupport.ag_upsideo_support.vl.Value > 0
                        && cptsupport.qte.HasValue
                        && cptsupport.qte.Value > 1)
                        {
                            mtfondeuro = cptsupport.qte.Value * cptsupport.ag_upsideo_support.vl.Value;
                        }
                        else
                        {
                            mtfondeuro = cptsupport.pru.HasValue ? cptsupport.pru.Value : 0;
                        }

                        ag_upsideo_cptrelsupports_histo cptsupporthistofornewrelation = new ag_upsideo_cptrelsupports_histo()
                        {
                            datehisto = DateTime.Now,
                            datemaj = DateTime.Now,
                            idfrontcompte = cptsupport.Idfrontcompte,
                            idfrontsupport = cptsupport.idfrontsupport,
                            qte = cptsupport.qte,
                            pru = cptsupport.pru,
                            vl = cptsupport.ag_upsideo_support.vl.Value,
                            mtfondeuro = mtfondeuro
                        };
                        db.ag_upsideo_cptrelsupports_histo.AddObject(cptsupporthistofornewrelation);
                    }
                    //fin histo ag_upsideo_cptrelsupports_histo  
                    //save
                    db.SaveChanges();
                    //après chaque opération , lancer la proc frontalweb_majtotalcomptecpts                   
                    db.CommandTimeout = 180;
                    db.ExecuteStoreCommand("exec agreg.frontalweb_majtotalcompte @idcrmcabinet,@idfrontcompte", new SqlParameter("@idcrmcabinet", cgpagreg.idcrmcabinet), new SqlParameter("@idfrontcompte", idCompte));

                }

                using (UpsilabEntities db = new UpsilabEntities())
                {
                    //compte aprés maj
                    ag_upsideo_compte compteahistoriser = db.ag_upsideo_compte.Where(c => c.Idfrontcompte == idCompte && (c.deleted == null || (c.deleted != null && c.deleted == "n"))).FirstOrDefault();

                    //historisé dans ag_upsideo_compte_histo
                    ag_upsideo_compte_histo cpthisto = db.ag_upsideo_compte_histo.Where(h => h.idfrontcompte == idCompte
                                                                                        && h.datehisto.Year == DateTime.Now.Year
                                                                                        && h.datehisto.Month == DateTime.Now.Month
                                                                                        && h.datehisto.Day == DateTime.Now.Day).FirstOrDefault();
                    if (cpthisto != null)
                    {
                        cpthisto.datehisto = DateTime.Now;
                        cpthisto.totalcompte = compteahistoriser.totalcompte.Value;
                    }
                    else
                    {
                        ag_upsideo_compte_histo cpthistonew = new ag_upsideo_compte_histo()
                        {
                            datehisto = DateTime.Now,
                            idfrontcompte = compteahistoriser.Idfrontcompte,
                            devise = string.IsNullOrEmpty(compteahistoriser.devise) ? "EUR" : compteahistoriser.devise,
                            totalcompte = compteahistoriser.totalcompte.HasValue ? compteahistoriser.totalcompte.Value : 0
                        };
                        //insert
                        db.ag_upsideo_compte_histo.AddObject(cpthistonew);
                    }
                    //save
                    db.SaveChanges();
                    //fin historisation
                }

            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);                
                ViewBag.Message = "Erreur: " + ex.Message;
                AgregCompteDetail agregcomptedetail = new AgregCompteDetail();
                agregcomptedetail.AgregCompteDetailList = agupsideocompteBL.GetCompteDetail(idCompte);
                agregcomptedetail.AgregCompte = agupsideocompteBL.GetComptesByIdCompte(idCompte);
                agregcomptedetail.SoldeEspece = agupsideocompteBL.SoldeEspece(idCompte);
                return View("CompteDetail", agregcomptedetail);
            }

            return RedirectToAction("CompteDetail", new { id = idCompte });
        }
        public ActionResult InsertCompte(ag_upsideo_compte _compte)
        {
            Guid idClient = Guid.Empty;
            SessionManager.Get<Guid>(agupsideocompteBL.AgregClientIdSessionKey, out idClient);
            Guid idCgpAgreg = Guid.Empty;
            User currentUser = SessionManager.GetUserSession();
            if (currentUser.IsEndUser())
            {
                CustomerProspect currentCustomer = SessionManager.GetCustomerProspectSession();
                User currenttUserCreated = currentCustomer.User1;
                idCgpAgreg = currenttUserCreated.idAgregCGP.Value;
            }
            else
            {
                idCgpAgreg = currentUser.idAgregCGP.Value;
            }
            try
            {

                if (Request.Form["typecontrat"] != null && idClient != Guid.Empty)
                {
                    using (UpsilabEntities db = new UpsilabEntities())
                    {
                        //new compte
                        ag_upsideo_compte compte = new ag_upsideo_compte();
                        string typecontrat = Request.Form["typecontrat"].ToString();
                        compte.typecontrat = typecontrat;
                        compte.idclient = idClient;
                        compte.idcgp = idCgpAgreg;
                        compte.deleted = "n";
                        compte.type = "o";
                        if (typecontrat.ToLower() == agupsideocompteBL.comptetitrespea.ToLower() || typecontrat.ToLower() == agupsideocompteBL.capitalisation.ToLower())
                        {
                            if (Request.Form["isPEA"] != null && Request.Form["isPEA"].ToString() == "on")
                                compte.pea = "o";
                            else
                                compte.pea = "n";
                            if (Request.Form["numcomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["numcomptecontrat"].ToString()))
                                compte.numcompte = Request.Form["numcomptecontrat"].ToString();
                            if (Request.Form["titulairecomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["titulairecomptecontrat"].ToString()))
                                compte.NomTitulaire1 = Request.Form["titulairecomptecontrat"].ToString();
                            if (Request.Form["depositairecomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["depositairecomptecontrat"].ToString()))
                                compte.idfrontfournisseur = int.Parse(Request.Form["depositairecomptecontrat"].ToString());
                            if (Request.Form["Ddscomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["Ddscomptecontrat"].ToString()))
                                compte.dds = DateTime.Parse(Request.Form["Ddscomptecontrat"].ToString());
                        }
                        else if (typecontrat.ToLower() == agupsideocompteBL.assurancevie.ToLower() || typecontrat.ToLower() == agupsideocompteBL.comptebancaire.ToLower())
                        {
                            if (Request.Form["numcomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["numcomptecontrat"].ToString()))
                                compte.numcompte = Request.Form["numcomptecontrat"].ToString();
                            if (Request.Form["titulairecomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["titulairecomptecontrat"].ToString()))
                                compte.NomTitulaire1 = Request.Form["titulairecomptecontrat"].ToString();
                            if (Request.Form["depositairecomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["depositairecomptecontrat"].ToString()))
                                compte.idfrontfournisseur = int.Parse(Request.Form["depositairecomptecontrat"].ToString());
                            if (Request.Form["Ddscomptecontrat"] != null && !string.IsNullOrEmpty(Request.Form["Ddscomptecontrat"].ToString()))
                                compte.dds = DateTime.Parse(Request.Form["Ddscomptecontrat"].ToString());
                        }
                        else if (typecontrat.ToLower() == agupsideocompteBL.immobilier.ToLower())
                        {
                            if (Request.Form["designationimmobilier"] != null && !string.IsNullOrEmpty(Request.Form["designationimmobilier"].ToString()))
                                compte.designation = Request.Form["designationimmobilier"].ToString();
                            if (Request.Form["dateacquisimmobilier"] != null && !string.IsNullOrEmpty(Request.Form["dateacquisimmobilier"].ToString()))
                                compte.dateacquisition = DateTime.Parse(Request.Form["dateacquisimmobilier"].ToString());
                            if (Request.Form["valacquisimmobilier"] != null && !string.IsNullOrEmpty(Request.Form["valacquisimmobilier"].ToString()))
                                compte.valeuracquisition = double.Parse(Request.Form["valacquisimmobilier"].ToString());
                            if (Request.Form["valvenalimmobilier"] != null && !string.IsNullOrEmpty(Request.Form["valvenalimmobilier"].ToString()))
                                compte.totalcompte = double.Parse(Request.Form["valvenalimmobilier"].ToString());
                            if (Request.Form["fiscaliteimmobilier"] != null && !string.IsNullOrEmpty(Request.Form["fiscaliteimmobilier"].ToString()))
                                compte.fiscalite = double.Parse(Request.Form["fiscaliteimmobilier"].ToString());
                        }
                        else if (typecontrat.ToLower() == agupsideocompteBL.professionels.ToLower())
                        {
                            if (Request.Form["designationprofessionel"] != null && !string.IsNullOrEmpty(Request.Form["designationprofessionel"].ToString()))
                                compte.designation = Request.Form["designationprofessionel"].ToString();
                            if (Request.Form["valacquisprofessionel"] != null && !string.IsNullOrEmpty(Request.Form["valacquisprofessionel"].ToString()))
                                compte.valeuracquisition = double.Parse(Request.Form["valacquisprofessionel"].ToString());
                            if (Request.Form["valoprofessionel"] != null && !string.IsNullOrEmpty(Request.Form["valoprofessionel"].ToString()))
                                compte.totalcompte = double.Parse(Request.Form["valoprofessionel"].ToString());

                        }
                        else if (typecontrat.ToLower() == agupsideocompteBL.capitalrisque.ToLower())
                        {
                            if (Request.Form["designationcapital"] != null && !string.IsNullOrEmpty(Request.Form["designationcapital"].ToString()))
                                compte.designation = Request.Form["designationcapital"].ToString();
                            if (Request.Form["montantcapital"] != null && !string.IsNullOrEmpty(Request.Form["montantcapital"].ToString()))
                                compte.totalcompte = double.Parse(Request.Form["montantcapital"].ToString());
                            if (Request.Form["ddscapital"] != null && !string.IsNullOrEmpty(Request.Form["ddscapital"].ToString()))
                                compte.dds = DateTime.Parse(Request.Form["ddscapital"].ToString());
                        }

                        //save                        
                        db.ag_upsideo_compte.AddObject(compte);
                        db.SaveChanges();

                        //historisé rd 9711
                        ag_upsideo_compte_histo cpthistonew = new ag_upsideo_compte_histo()
                        {
                            datehisto = DateTime.Now,
                            idfrontcompte = compte.Idfrontcompte,
                            devise = string.IsNullOrEmpty(compte.devise) ? "EUR" : compte.devise,
                            totalcompte = compte.totalcompte.HasValue ? compte.totalcompte.Value : 0
                        };
                        //insert
                        db.ag_upsideo_compte_histo.AddObject(cpthistonew);
                        db.SaveChanges();
                    }

                }

            }
            catch (Exception ex)
            {
                ViewBag.Style = "style=color:red";
                ViewBag.Message = "Erreur: " + ex.Message;
                Upsilab.Business.Log.Log.AppendException(ex);
            }

            return RedirectToAction("Index", new { id = idClient });
        }