public static void GenerateLicense(FirmInstitution pFirm, Subscription pSub)
        {
            LicenseType licLAB = LicenseTypeBL.GetLicenseTypeeByName(LicenseTypeBL.LabApplication);
            LicenseType licReport = LicenseTypeBL.GetLicenseTypeeByName(LicenseTypeBL.RecueilApplication);

            List<int> lstLicenseType = new List<int>();
            List<string> lstLicensePrefixe = new List<string>();
            switch (pSub.Application)
            {
                case "Lab":
                    lstLicenseType.Add(licLAB.idLicenseType);
                    lstLicensePrefixe.Add("L");
                    break;
                case "Recueil":
                    lstLicenseType.Add(licReport.idLicenseType);
                    lstLicensePrefixe.Add("R");
                    break;
                case "Recueil+Lab":
                    lstLicenseType.Add(licLAB.idLicenseType);
                    lstLicenseType.Add(licReport.idLicenseType);
                    lstLicensePrefixe.Add("L");
                    lstLicensePrefixe.Add("R");
                    break;
            }

            using (UpsilabEntities context = new UpsilabEntities())
            {
                for (int j = 0; j < lstLicenseType.Count; j++)
                {
                    for (int i = 1; i <= pSub.UserCount; i++)
                    {
                        Upsilab.Data.Model.License li = new Data.Model.License();
                        li.idLicense = Guid.NewGuid();
                        li.DateCreated = DateTime.Now;
                        li.DateExpired = pSub.DateExpired;
                        li.idLicenseType = lstLicenseType[j];
                        li.IsValid = true;
                        li.IdSubscription = pSub.IdSubscription;
                        li.LicenseKey = GenerateLicenseKey(pFirm.idFirmInstitution, lstLicensePrefixe[j], pSub.DateCreated, i);
                        context.License.AddObject(li);
                    }
                }
                context.SaveChanges();

            }
        }
        public ActionResult UnLogiciel(string id)
        {
            var languageData = Upsilab.Business.Utility.PageLanguageHelper.GetLanguageContent("Public", "Identification");
            try
            {
                List<int> lstNbUsers = new List<int>();
                for (int i = 1; i <= 50; i++)
                    lstNbUsers.Add(i);
                ViewBag.ListNbUsers = new SelectList(lstNbUsers);

                var CreditPackageList = db.CreditCost.Where(cr => cr.HostCode == Upsilab.Business.Utility.ConfigurationManager.ExtranetHostCode).ToList();
                ViewBag.CreditPackageList = CreditPackageList;

                Dictionary<int, string> lstDuration = new Dictionary<int, string>();
                for (int i = 1; i <= 5; i++)
                {
                    if (i == 1)
                        lstDuration.Add(i, string.Format("{0} {1}", i, languageData.GetContent("UP_Year")));
                    else
                        lstDuration.Add(i, string.Format("{0} {1}", i, languageData.GetContent("UP_Years")));
                }
                ViewBag.ListDuration = new SelectList(lstDuration, "Key", "Value");

                Subscription souscription = new Subscription();
                souscription.Application = "Recueil+Lab";
                souscription.CreditNumber = CreditPackageList.Single(cred => cred.IsMostPopular).CreditNumber;
                if (!string.IsNullOrEmpty(id))
                    souscription.SponsorshipCode = id;
                souscription.DateCreated = DateTime.Now;
                souscription.DateExpired = souscription.DateCreated.AddYears(1);

                return View(souscription);
            }
            catch (Exception ex)
            {
                ViewBag.Info = languageData.GetContent("UP_Error") + " : " + ex.Message;
                return View();
            }
        }
        public ActionResult UnLogiciel(string id)
        {
            try
            {
                List<int> lstNbUsers = new List<int>();
                for (int i = 1; i <= 50; i++)
                    lstNbUsers.Add(i);
                ViewBag.ListNbUsers = new SelectList(lstNbUsers);

                var CreditPackageList = db.CreditCost.ToList();
                ViewBag.CreditPackageList = CreditPackageList;

                Dictionary<int, string> lstDuration = new Dictionary<int, string>();
                for (int i = 1; i <= 5; i++)
                {
                    if (i == 1)
                        lstDuration.Add(i, string.Format("{0} an", i));
                    else
                        lstDuration.Add(i, string.Format("{0} ans", i));
                }
                ViewBag.ListDuration = new SelectList(lstDuration, "Key", "Value");

                Subscription souscription = new Subscription();
                souscription.Application = "Recueil+Lab";
                souscription.CreditNumber = CreditPackageList.Single(cred => cred.IsMostPopular).CreditNumber;
                if (!string.IsNullOrEmpty(id))
                    souscription.SponsorshipCode = id;
                souscription.DateCreated = DateTime.Now;
                souscription.DateExpired = souscription.DateCreated.AddYears(1);

                return View(souscription);
            }
            catch (Exception ex)
            {
                ViewBag.Info = "Erreur : " + ex.Message;
                return View();
            }
        }
        public static void UpdateLicenseDateExpired(Subscription subscription)
        {
            IList<Data.Model.License> lstLicencesToRenew = subscription.LicensesToRenew;

            using (Data.Model.UpsilabEntities db = new UpsilabEntities())
            {

                foreach (Data.Model.License li in lstLicencesToRenew)
                {
                    //TODO : remove from loop ?
                    Data.Model.License license = db.License.Where(lic => lic.idLicense == li.idLicense).FirstOrDefault();

                    //New Expired date : take the greatest date between Expired date and current date
                    DateTime dateExpired = DateTime.Now;
                    int resultDate = DateTime.Compare(license.DateExpired.Value, DateTime.Now);

                    if (resultDate <= 0) //Earlier or equal
                    {
                        dateExpired = DateTime.Now;
                    }
                    else
                    {
                        dateExpired = license.DateExpired.Value;
                    }

                    //license.DateExpired = dateExpired.AddYears(license.Subscription.Duration.Value);
                    license.DateExpired = dateExpired.AddYears(subscription.Duration.Value);
                }

                db.SaveChanges();
            }
        }
        public static Subscription Calculate(Subscription pSouscription, IList<Data.Model.License> pLstLicenseToRenew)
        {
            pSouscription = GroupLicencesToRenewByApplicationType(pSouscription, pLstLicenseToRenew);

            //Application cost
            pSouscription.ApplicationCost = pSouscription.LicensesToRenew.Sum(lic => lic.AmountHT);

            pSouscription.AmountHT = pSouscription.ApplicationCost;
            //Reduction saisie formulaire

            //Sponsorship -  reduction TODO
            decimal reduction = 0;
            decimal reductionPercent = 0;
            string status;

            if (SponsorshipBL.IsCodeValid(pSouscription.SponsorshipCode, out status))
            {
                if (pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC01.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC02.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC03.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC04.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC05.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC06.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC07.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC08.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC09.ToString()
                    || pSouscription.SponsorshipCode == Sponsorship.Reduction.RLC00.ToString()
                    )
                {
        private void GenerateInvoice(Subscription pSubscription, FirmInstitution pFirmInstitution)
        {
            //Génération de la facture
            string factName = "";
            string logoPath = System.IO.Path.Combine(Server.MapPath("~/Content/images/"), "LogoUpsideoFoxit.png");

            string invoicePath = ConfigurationManager.InvoicePath;
            if (!System.IO.Directory.Exists(invoicePath))
            {
                System.IO.Directory.CreateDirectory(invoicePath);
            }

            SouscriptionBL.GenerateInvoiceForSubscription(pSubscription, pFirmInstitution, invoicePath, logoPath, out factName);
            SetSubscriptionInvoiceName(pSubscription, factName, false); // Don't save yet
        }
 private void GenerateLicences(Subscription objSubscription)
 {
     FirmInstitution objFI = objSubscription.FirmInstitution;
     LicenseBL.GenerateLicense(objFI, objSubscription);
 }
        private void SetSubscriptionAsPaid(Subscription subscription, bool bSaveChanges)
        {
            // Subscription
            subscription.IsPaid = true;

            if (bSaveChanges)
            {
                db.SaveChanges();
            }
        }
        /// <summary>
        /// Mise à jour de la table Sponsorship après l'utilisation de code parrainage
        /// </summary>
        private void UpdateSponsorShipState(Subscription objSubscription, bool bSaveChanges)
        {
            FirmInstitution objFirmParrain = null;

            //
            if (objSubscription != null)
            {
                // Chercher une occurence de Sponsorship dont Sponsorship.Code = au code obtenu à partir de la souscription
                // Si on a trouvé, on la met à jour
                //Sponsorship objSponsorship = SponsorshipBL.GetSponsorshipByCode(objSubscription.SponsorshipCode);
                Sponsorship objSponsorship = db.Sponsorship.Include("FirmInstitution1").Include("FirmInstitution1.User").Where(s => s.Code == objSubscription.SponsorshipCode).FirstOrDefault();

                if (objSponsorship != null)
                {
                    // Mise à jour de la table Sponsorship 
                    objSponsorship.idCustomerFilleul = objSubscription.IdFirmInstitution;
                    objSponsorship.Assests = true;
                    objSponsorship.ActivationDate = DateTime.Now;
                    objSponsorship.ExpirationDate = null;

                    #region "Mise à jour de la table sponsorship"
                    //// Sponsorship
                    //db.Sponsorship.Attach(objSponsorship);
                    //db.ObjectStateManager.ChangeObjectState(objSponsorship, System.Data.EntityState.Modified);

                    if (bSaveChanges)
                    {
                        db.SaveChanges();
                    }

                    objFirmParrain = objSponsorship.FirmInstitution1;  //Parrain

                    #endregion

                    #region "Envoi mail"
                    try
                    {
                        // Envoi du mail après activation de code parrainage
                        if (objFirmParrain != null)
                        {
                            // envoi du mail à l'administrateur de la firm
                            if (objFirmParrain.User != null)
                            {
                                var template = EmailManager.GetEmailTemplateContentByName(EmailManager.SponsorshipInformParrain);
                                string sFrom = System.Configuration.ConfigurationManager.AppSettings["EmailFrom"].ToString();
                                string sSujet = LanguageContentBL.Translate("mailParrainageSubject");//Activation de votre code parrainage
                                string sMessage = string.Format(template
                                    , objSubscription.SponsorshipCode
                                    , objSponsorship.CreatedDate.ToString("dd/MM/yyyy")
                                    , objSponsorship.ReductionParrain);

                                EmailManager.SendEmail(sFrom, objFirmParrain.User.UserEmail, null, sSujet, sMessage, true);

                                //Log mail
                                EmailLogBL.Log(null, sFrom, objFirmParrain.User.idUser, objFirmParrain.User.UserEmail, EmailLogBL.TypeDestinataire.ProspectedAdviser, System.Reflection.MethodBase.GetCurrentMethod().Name);

                                /*
                                 * Lorsque le filleul utilise le code parrainage avec TypeParainage=2, envoyer un email à [email protected] indiquant que le filleul "XXXXX" (Nom prénom (e-mail)) a souscrit en utilisant le code "XXX" (code parrainage) du parrain "XXXXXX" (Nom prénom (e-mail)).
                                 */
                                if (objSponsorship.UseGiftAmountParrain.HasValue && objSponsorship.UseGiftAmountParrain.Value)
                                {
                                    var templateMsgToFinaveo = EmailManager.GetEmailTemplateContentByName(EmailManager.SponsorshipInformParrainForFinaveo);
                                    string sFrom1 = System.Configuration.ConfigurationManager.AppSettings["EmailFrom"].ToString();
                                    string sTo1 = System.Configuration.ConfigurationManager.AppSettings["EmailFrom"].ToString();
                                    string sSujet1 = LanguageContentBL.Translate("mailCodeParrainageUsedByFilleulSubject"); //CodeParrainage utilisé par un filleul
                                    string sMessage1 = string.Format(templateMsgToFinaveo
                                        , objSponsorship.FirstnameFilleul
                                        , objSponsorship.NameFilleul
                                        , objSponsorship.EmailFilleul
                                        , objSponsorship.Code
                                        , objSponsorship.FirmInstitution1.User.UserFirstName
                                        , objSponsorship.FirmInstitution1.User.UserName
                                        , objSponsorship.FirmInstitution1.User.UserEmail
                                        );

                                    string sCC = string.Format("{0};{1}", System.Configuration.ConfigurationManager.AppSettings["EmailArnaudLallain"].ToString(), System.Configuration.ConfigurationManager.AppSettings["EmailDavidBadihi"].ToString());
                                    EmailManager.SendEmail(sFrom1, sTo1, sCC, sSujet1, sMessage1, true);

                                    //Log mail
                                    EmailLogBL.Log(null, sFrom1, Guid.Empty, sTo1, EmailLogBL.TypeDestinataire.Upsideo, System.Reflection.MethodBase.GetCurrentMethod().Name);
                                }
                            }
                        }
                    }
                    catch { }
                    #endregion
                }
            }
        }
        /// <summary>
        /// Mise à jour de la table Sponsorship après l'utilisation de code parrainage
        /// </summary>
        private void UpdateSponsorShipState(Subscription objSubscription, bool bSaveChanges)
        {
            FirmInstitution objFirmParrain = null;

            //
            if (objSubscription != null)
            {
                // Chercher une occurence de Sponsorship dont Sponsorship.Code = au code obtenu à partir de la souscription
                // Si on a trouvé, on la met à jour
                Sponsorship objSponsorship = SponsorshipBL.GetSponsorshipByCode(objSubscription.SponsorshipCode);

                if (objSponsorship != null)
                {
                    // Mise à jour de la table Sponsorship 
                    objSponsorship.idCustomerFilleul = objSubscription.IdFirmInstitution;
                    objSponsorship.Assests = true;
                    objSponsorship.ActivationDate = DateTime.Now;
                    objSponsorship.ExpirationDate = null;

                    #region "Mise à jour de la table sponsorship"

                    // Sponsorship
                    db.Sponsorship.Attach(objSponsorship);
                    db.ObjectStateManager.ChangeObjectState(objSponsorship, System.Data.EntityState.Modified);

                    if (bSaveChanges)
                    {
                        db.SaveChanges();
                    }

                    objFirmParrain = objSponsorship.FirmInstitution1;  //Parrain

                    #endregion

                    #region "Envoi mail"
                    try
                    {
                        // Envoi du mail après activation de code parrainage
                        if (objFirmParrain != null)
                        {
                            // envoi du mail à l'administrateur de la firm
                            if (objFirmParrain.User != null)
                            {
                                var template = EmailManager.GetEmailTemplateContentByName(EmailManager.SponsorshipInformParrain);
                                string sFrom = System.Configuration.ConfigurationManager.AppSettings["EmailFrom"].ToString();

                                string sSujet = LanguageData.GetContent("Activation_code_parrainage");
                                string sMessage = string.Format(template
                                    , objSubscription.SponsorshipCode
                                    , objSponsorship.CreatedDate.ToString("dd/MM/yyyy")
                                    , objSponsorship.ReductionParrain);

                                EmailManager.SendEmail(sFrom, objFirmParrain.User.UserEmail, null, sSujet, sMessage, true);

                                //Log mail
                                EmailLogBL.Log(null, sFrom, objFirmParrain.User.idUser, objFirmParrain.User.UserEmail, EmailLogBL.TypeDestinataire.ProspectedAdviser, System.Reflection.MethodBase.GetCurrentMethod().Name);
                            }
                        }
                    }
                    catch { }
                    #endregion
                }
            }
        }
        public ActionResult AdminSouscrire(Subscription souscription)
        {
            //Subscription newSouscription = null;
            IDictionary<string, string> dicoRes = new Dictionary<string, string>();

            dicoRes.Add("Page_title", LanguageData.GetContent("Page_title"));
            dicoRes.Add("Title_h1", LanguageData.GetContent("Title_h1"));
            dicoRes.Add("Title_h1_span", LanguageData.GetContent("Title_h1_span"));
            dicoRes.Add("Table_Title", LanguageData.GetContent("Table_Title_ok"));
            dicoRes.Add("Message", LanguageData.GetContent("Message_ok"));

            try
            {
                string isPaymentChecked = Request.Params["chkPaiement"]; ;
                DateTime datePayment;
                Guid idSelectedFirm;
                DateTime? dateUpdated = null;

                DateTime.TryParse(Request.Params["inputPaiement"], out datePayment);
                Guid.TryParse(Request.Params["SelectedFirmInstitutionId"], out idSelectedFirm);

                FirmInstitution f = FirmInstitutionBL.GetFirmInstitutionByIdFirmInstitution(idSelectedFirm);

                #region Sponsor
                string sIdSponsor = Request.Params["IdSponsor"].ToString();
                int idSponsor;

                Int32.TryParse(sIdSponsor, out idSponsor);

                if (idSponsor != 0)
                {
                    FirmInstitutionBL.UpdateFirmInstitution(f.idFirmInstitution, "FirmInstitution.IdSponsor", idSponsor.ToString());
                }
                #endregion

                if (f != null)
                {
                    SessionManager.Get<Subscription>(SouscriptionBL.SubscriptionSession, out souscription);
                    //----------
                    //SouscriptionBL.Calculate(souscription, false, f.idFirmInstitution.ToString());
                    //Ne plus calculer ? prendre la valeur en session ?
                    //
                    souscription.IdFirmInstitution = f.idFirmInstitution;
                    souscription.Product = SouscriptionBL.Product_Type_credits.ToString();
                    souscription.DateCreated = DateTime.Now;
                    souscription.DateExpired = DateTime.Now.AddYears(1);

                    // Si payé, on additionne avec le creditnumber déjà existant
                    if (!string.IsNullOrEmpty(isPaymentChecked) && isPaymentChecked == "on" && datePayment != null)
                    {
                        // mettre a jour credit de la firm
                        if (f != null)
                        {
                            var newCreditNumber = f.CreditCount + souscription.CreditNumber;
                            FirmInstitutionBL.UpdateFirmInstitution(f.idFirmInstitution, "FirmInstitution.CreditCount", newCreditNumber.ToString());
                        }
                        
                        souscription.DateUpdate = datePayment;
                        souscription.IsPaid = true;

                        dateUpdated = datePayment;
                    }

                    SouscriptionBL.AddSubscription(souscription);

                    #region Génération pdf
                    //Génération de la facture
                    string factName = "";
                    string logoPath = System.IO.Path.Combine(Server.MapPath("~/Content/images/"), "LogoUpsideoFoxit.png");

                    string invoicePath = ConfigurationManager.InvoicePath;
                    if (!System.IO.Directory.Exists(invoicePath))
                    {
                        System.IO.Directory.CreateDirectory(invoicePath);
                    }

                    SouscriptionBL.GenerateInvoiceForSubscription(souscription, f, invoicePath, logoPath, out factName, dateUpdated);
                    #endregion

                    souscription.InvoiceFilename = factName;
                    SouscriptionBL.UpdateSubscription(souscription);

                    //Envoi l'email au contact de facturation
                    if (souscription.IsPaid)
                    {
                        //Ne plus envoyer d'email au contact facturation
                        //souscription = SouscriptionBL.GetSubscriptionsById(souscription.IdSubscription); //load firm                        
                        //SouscriptionBL.SendInvoiceMail(souscription, true); //Send to FirmIntitution Email
                        //souscription.DateSendEmail = DateTime.Now;
                    }

                    SessionManager.Clear(SouscriptionBL.SubscriptionSession);

                }
                else
                {
                    dicoRes["Table_Title"] = LanguageData.GetContent("Table_Title_firm_non_ok");
                    dicoRes["Message"] = LanguageData.GetContent("Message_firm_non_ok");
                }
            }
            catch (Exception ex)
            {
                dicoRes["Table_Title"] = LanguageData.GetContent("Table_Title_non_ok");
                dicoRes["Message"] = LanguageData.GetContent("Message_non_ok") + ex.Message;
            }

            dicoRes.Add("ProductType", SouscriptionBL.Product_Type_credits);

            TempData["DicoRetour"] = dicoRes;
            return RedirectToAction("Retour");
        }
        public PartialViewResult GetPaymentForRenewalLicenses()
        {
            var currentUser = SessionManager.GetUserSession();

            //Get commerciaux
            List<Commercial> commercials = CommercialBL.Get();
            ViewBag.Commercials = new SelectList(commercials, "Code", "Fullname");

            List<License> lstLicenseToRenew = new List<License>();
            if (!string.IsNullOrEmpty(Request.Params["idFirm"]))
            {
                //Parameters
                Guid idFirm = new Guid(Request.Params["idFirm"].ToString());
                string sponsorshipCode = Request.Params["sponsorshipCode"].ToString();
                int? duration = string.IsNullOrEmpty(Request.Params["duration"]) ? 0 : Convert.ToInt32(Request.Params["duration"].ToString());

                lstLicenseToRenew = LicenseBL.GetLicensesToRenewByFirmId(idFirm);

                if (!string.IsNullOrEmpty(Request.Params["idLicense"]))
                {
                    List<Guid> guidArray = Array.ConvertAll(((Request.Params["idLicense"]).ToString()).Split(','), x => new Guid(x)).ToList();

                    //Licences to renew checked ?
                    lstLicenseToRenew = lstLicenseToRenew.Where(lic => guidArray.Contains(lic.idLicense)).ToList();

                    Subscription subscription = new Subscription()
                    {
                        Duration = (duration > 0) ? duration : null,
                        IdFirmInstitution = idFirm,
                        DateCreated = DateTime.Now,
                        DateExpired = DateTime.Now,
                        UserCount = 0, //depend on initial subscription
                        SponsorshipCode = sponsorshipCode
                    };

                    if (lstLicenseToRenew.Select(lt => lt.idLicenseType).Contains(1) && lstLicenseToRenew.Select(lt => lt.idLicenseType).Contains(2))
                    {
                        subscription.Product = SouscriptionBL.Product_Type_renouvellement_recueil_lab;
                    }
                    else if (lstLicenseToRenew.Select(lt => lt.idLicenseType).Contains(1))
                    {
                        subscription.Product = SouscriptionBL.Product_Type_renouvellement_lab;
                    }
                    else if (lstLicenseToRenew.Select(lt => lt.idLicenseType).Contains(2))
                    {
                        subscription.Product = SouscriptionBL.Product_Type_renouvellement_recueil;
                    }

                    subscription.LicensesToRenew = lstLicenseToRenew;

                    subscription = SouscriptionBL.Calculate(subscription);

                    //Save subscription to session so, don't calculate again when saving ?
                    SessionManager.Set<Subscription>(SouscriptionBL.SubscriptionSession, subscription);

                    //Durée : Pour le superadmin, afficher la duree de souscription, permettre aussi la modif
                    //La duree est obtenue apres execution de la fonction "Calculate"
                    if (currentUser.IsSuperAdmin())
                    {
                        var durationDefaultValue = (subscription.Duration.HasValue) ? subscription.Duration.Value : 0;
                        ViewBag.ListDuration = GetSubcriptionDurations(durationDefaultValue);
                    }

                    return PartialView("SouscriptionPaiementPartial", subscription);
                }
                else
                {
                    Upsilab.Data.Model.Subscription souscription = new Upsilab.Data.Model.Subscription();
                    return PartialView("SouscriptionPaiementPartial", souscription);
                }


            }
            else
            {
                Upsilab.Data.Model.Subscription souscription = new Upsilab.Data.Model.Subscription();
                return PartialView("SouscriptionPaiementPartial", souscription);
            }


        }
        public ActionResult UnLogiciel(Subscription souscription)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    switch (souscription.Application)
                    {
                        case "Recueil": souscription.Product = SouscriptionBL.Product_Type_Recueil; break;
                        case "Lab": souscription.Product = SouscriptionBL.Product_Type_lab; break;
                        case "Recueil+Lab": souscription.Product = SouscriptionBL.Product_Type_Recueil_lab.ToString(); break;
                    }

                    SouscriptionBL.Calculate(souscription, true);
                    SessionManager.Set<Data.Model.Subscription>(SouscriptionBL.SubscriptionSession, souscription);
                    return View("UnLogicielPaiement", souscription);
                }
                else
                {
                    return View(souscription);
                }
            }
            catch (Exception ex)
            {
                Upsilab.Business.Log.Log.AppendException(ex);
            }

            return View(souscription);
        }
        /// <summary>
        /// </summary>
        /// <param name="pSouscription"></param>
        /// <param name="pLstLicenseToRenew"></param>
        /// <returns></returns>
        public static Subscription GroupLicencesToRenewByApplicationType(Subscription pSouscription)
        {
            List<Data.Model.License> lstLicensesToRenew = pSouscription.LicensesToRenew;
            using (UpsilabEntities db = new UpsilabEntities())
            {
                var lstInitialSubscriptionId = lstLicensesToRenew.Select(lic => lic.IdSubscription).ToList();

                //Optimisation : get the initial subscriptions list corresponding to licences
                var lstInitialSubscriptions = db.Subscription.Where(sub => lstInitialSubscriptionId.Contains(sub.IdSubscription)).ToList();

                //Extranet admin : afficher la duree initiale de souscription, si plusieurs, prendre le maximum
                //if (SessionManager.GetUserSession().IsSuperAdmin() && !pSouscription.Duration.HasValue)
                if (!pSouscription.Duration.HasValue)
                {
                    int maxDuration = lstInitialSubscriptions.Max(s => s.Duration).Value;
                    pSouscription.Duration = maxDuration;
                }

                //Get subcription for each licences
                foreach (var lic in lstLicensesToRenew)
                {
                    if (lic.Subscription == null)
                    {
                        lic.Subscription = lstInitialSubscriptions.Where(sub => sub.IdSubscription == lic.IdSubscription).FirstOrDefault();
                    }
                }

                //Licences "Recueil+LAB"
                List<Data.Model.License> lstLicences_RecueilLAB = lstLicensesToRenew.Where(lic => lic.Subscription.Application == SouscriptionBL.ReportLabApplication.ToString() && lic.idLicenseType == LicenseBL.ReportId).ToList(); //Pourquoi LicenseBL.ReportId seulement : pour ne pas compter 2 fois les licences "Recueil+LAB"

                //Licences "Recueil"
                List<Data.Model.License> lstLicenses_Recueil = lstLicensesToRenew.Where(lic => lic.Subscription.Application == SouscriptionBL.ReportApplication && lic.idLicenseType == LicenseBL.ReportId).ToList();

                //Licences "LAB"
                List<Data.Model.License> lstLicenses_LAB = lstLicensesToRenew.Where(lic => lic.Subscription.Application == SouscriptionBL.LabApplication && lic.idLicenseType == LicenseBL.LabId).ToList();


                decimal applicationReportLABCost = 0;
                decimal applicationReportCost = 0;
                decimal applicationLABCost = 0;

                pSouscription.LicensesToRenewGroupedByApplicationType = new List<LicenceViewModel>();

                //Recueil+LAB
                if (lstLicences_RecueilLAB.Count > 0)
                {
                    applicationReportLABCost = CalculateApplicationCost(pSouscription, lstLicences_RecueilLAB, SouscriptionBL.ReportLabApplication, lstInitialSubscriptions, db);

                    var licenceViewModel = new LicenceViewModel()
                    {
                        ApplicationType = SouscriptionBL.ReportLabApplication.ToString(),
                        AmountHT = applicationReportLABCost,
                        Licences = lstLicences_RecueilLAB
                    };

                    pSouscription.LicensesToRenewGroupedByApplicationType.Add(licenceViewModel);
                }

                //Recueil
                if (lstLicenses_Recueil.Count > 0)
                {
                    applicationReportCost = CalculateApplicationCost(pSouscription, lstLicenses_Recueil, SouscriptionBL.ReportApplication, lstInitialSubscriptions, db);

                    var licenceViewModel = new LicenceViewModel()
                    {
                        ApplicationType = SouscriptionBL.ReportApplication.ToString(),
                        AmountHT = applicationReportCost,
                        Licences = lstLicenses_Recueil
                    };

                    pSouscription.LicensesToRenewGroupedByApplicationType.Add(licenceViewModel);
                }

                //LAB
                if (lstLicenses_LAB.Count > 0)
                {
                    applicationLABCost = CalculateApplicationCost(pSouscription, lstLicenses_LAB, SouscriptionBL.LabApplication, lstInitialSubscriptions, db);

                    var licenceViewModel = new LicenceViewModel()
                    {
                        ApplicationType = SouscriptionBL.LabApplication.ToString(),
                        AmountHT = applicationLABCost,
                        Licences = lstLicenses_LAB
                    };

                    pSouscription.LicensesToRenewGroupedByApplicationType.Add(licenceViewModel);
                }
            }

            return pSouscription;
        }
        private static decimal CalculateApplicationCost(Subscription pCurrentSubscription, List<Data.Model.License> pLicenses, string applicationType, List<Subscription> pInitialSubcriptions, UpsilabEntities db)
        {
            decimal applicationCost = 0;

            var subscriptionCost = db.SubscriptionCost.SingleOrDefault(sub => sub.SubscriptionCostName == applicationType
                                   && pLicenses.Count >= sub.UserNumberMin && pLicenses.Count <= sub.UserNumberMax
                                   && sub.HostCode == ConfigurationManager.ExtranetHostCode);

            int duration = (pCurrentSubscription.Duration.HasValue && pCurrentSubscription.Duration.Value > 0) ? pCurrentSubscription.Duration.Value : 0;

            if (subscriptionCost != null)
            {
                foreach (Data.Model.License lic in pLicenses)
                {
                    var initialSubscription = pInitialSubcriptions.Where(sub => sub.IdSubscription == lic.IdSubscription).FirstOrDefault();

                    //Duration : take duration choosen by user or initial subcription duration
                    duration = (duration > 0) ? duration : initialSubscription.Duration.Value;

                    applicationCost += subscriptionCost.SubscriptionCost1 * 12 * duration; //12
                }

            }

            return applicationCost;
        }
        public PartialViewResult SouscriptionPaiementPartial(Subscription _Subscription)
        {
            SessionManager.Clear(SouscriptionBL.SubscriptionSession);

            //Get commerciaux
            List<Commercial> commercials = CommercialBL.Get();
            ViewBag.Commercials = new SelectList(commercials, "Code", "Fullname");

            //Calculate montant
            if (_Subscription.IdFirmInstitution != null)
            {
                Guid idSelectedFirm = _Subscription.IdFirmInstitution;

                if (!string.IsNullOrEmpty(_Subscription.Application))
                {
                    switch (_Subscription.Application)
                    {
                        case "Recueil": _Subscription.Product = SouscriptionBL.Product_Type_Recueil; break;
                        case "Lab": _Subscription.Product = SouscriptionBL.Product_Type_lab; break;
                        case "Recueil+Lab": _Subscription.Product = SouscriptionBL.Product_Type_Recueil_lab.ToString(); break;
                    }
                }

                _Subscription = SouscriptionBL.Calculate(_Subscription, true, idSelectedFirm.ToString()); //new firm ??

                //Save subscription to session so, don't calculate again when saving ?
                SessionManager.Set<Subscription>(SouscriptionBL.SubscriptionSession, _Subscription);

                return PartialView("SouscriptionPaiementPartial", _Subscription);
            }
            else
            {
                var creditPackageList = db.CreditCost.OrderBy(c => c.CreditCost1).ToList();

                Subscription souscription = new Subscription()
                {
                    CreditNumber = creditPackageList.Single(cred => cred.IsMostPopular).CreditNumber,
                    Duration = 1,
                    DateCreated = DateTime.Now,
                    DateExpired = DateTime.Now.AddYears(1)
                };

                ViewBag.CreditPackageList = creditPackageList;

                return PartialView("SouscriptionPaiementPartial", souscription);
            }
        }
        public ActionResult UnLogiciel(Subscription souscription)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    SouscriptionBL.Calculate(souscription, true);
                    SessionManager.Set<Data.Model.Subscription>(SouscriptionBL.SubscriptionSession, souscription);
                    return View("UnLogicielPaiement", souscription);
                }
                else
                {
                    return View(souscription);
                }
            }
            catch
            {
                //Exception
            }

            return View(souscription);
        }
        private void UpdateSessionDataToExport(Subscription updatedSubscription)
        {
            if (SessionManager.Exists(DATA_TO_EXCEL))
            {
                IList<Subscription> listSub = null;
                SessionManager.Get<IList<Subscription>>(DATA_TO_EXCEL, out listSub);

                var subcription = listSub.Where(s => s.IdSubscription == updatedSubscription.IdSubscription).FirstOrDefault();
                
                subcription.Commercial = updatedSubscription.Commercial;
                subcription.Remuneration = updatedSubscription.Remuneration;
            }
        }
 private void SendMailInvoice(Subscription objSubscription)
 {
     try
     {
         SouscriptionBL.SendInvoiceMail(objSubscription, true); //Send to FirmIntitution Email
     }
     catch(Exception ex)
     {
         Log.AppendException(ex);
     }
 }
        private SubscriptionModel GetSubcriptionModel(Guid idFirmInstitution)
        {
            //Data to send to view
            //1- Récupération des licenses existantes pour le Firm
            List<License> unexpiredLicences = LicenseBL.GetListUnexpiredLicensesByFirmId(idFirmInstitution);

            //2- Nombre utilisateurs
            List<int> lstNbUsers = new List<int>();
            for (int i = 1; i <= 50; i++)
                lstNbUsers.Add(i);
            ViewBag.ListNbUsers = new SelectList(lstNbUsers);

            //3- Duree
            ViewBag.ListDuration = GetSubcriptionDurations();

            //4- Credits list
            var CreditPackageList = db.CreditCost.Where(cc => cc.HostCode == Upsilab.Business.Utility.ConfigurationManager.ExtranetHostCode).ToList();
            ViewBag.CreditPackageList = CreditPackageList;

            //5- Subscription
            Subscription souscription = new Subscription()
            {
                Application = "Recueil+Lab",
                CreditNumber = 0,
                DateCreated = DateTime.Now,
                DateExpired = DateTime.Now.AddYears(1) //TODO : why add 1 ?
            };

            //6- List of firmparents : ne pas inclure les etablissements qui n'ont pas encore payé
            bool includeFirmWaitingValidation = false;
            List<FirmInstitution> firmInstitutionParents = FirmInstitutionBL.GetFirmInstitutionParents(includeFirmWaitingValidation);
            firmInstitutionParents.Insert(0, new FirmInstitution() { idFirmInstitution = Guid.Empty, FirmInstitutionName = "Sélectionner un établissement" });

            //7- Subscription cost
            List<SubscriptionCost> subscriptionCosts = SouscriptionBL.GetSubscriptionCosts();

            SubscriptionModel subscriptionModel = new SubscriptionModel()
            {
                Subscription = souscription,
                FirmInstitutionsParents = firmInstitutionParents,
                Licences = unexpiredLicences,
                SubscriptionCosts = subscriptionCosts,
                //TODO
            };

            return subscriptionModel;
        }
        /// <summary>
        /// Mise à jour de la table Sponsorship après réabonnement
        /// </summary>
        private void UpdateSponsorShipReabon(Subscription objSubscription, bool bSavechanges)
        {
            FirmInstitution objFirm = objSubscription.FirmInstitution;

            if (objFirm != null)
            {
                List<Sponsorship> lstSponsorship = SponsorshipBL.GetReabonCount(objFirm.idFirmInstitution);

                // si on trouve plus de 1 sponsorship dont assets = true et reabon = false à partir d'un idFirmInstitution
                // on met ReabonParrain à true et ReabonParrainDate à la date courante de ces occurences
                if (lstSponsorship != null && lstSponsorship.Count() >= 2)
                {

                    // Mise à jour des champs
                    foreach (var objSponsor in lstSponsorship)
                    {
                        objSponsor.ReabonParrain = true;
                        objSponsor.ReabonParrainDate = DateTime.Now;

                        // Sponsorship
                        db.Sponsorship.Attach(objSponsor);
                        db.ObjectStateManager.ChangeObjectState(objSponsor, System.Data.EntityState.Modified);
                    }

                    if (bSavechanges)
                    {
                        db.SaveChanges();
                    }
                }
            }
        }
        public ActionResult DesCredits(string id)
        {
            var creditPackageList = db.CreditCost.Where(cr => cr.HostCode == Upsilab.Business.Utility.ConfigurationManager.ExtranetHostCode).OrderBy(c => c.CreditCost1).ToList();
            Guid? idSelectedFirm = null;

            Subscription souscription = new Subscription()
            {
                CreditNumber = creditPackageList.Single(cred => cred.IsMostPopular).CreditNumber,
                Duration = 1,
                DateCreated = DateTime.Now,
                DateExpired = DateTime.Now.AddYears(1)
            };

            ViewBag.CreditPackageList = creditPackageList;

            #region Seulement pour SuperAdmin
            // Le superAdmin peut voir toutes les souscription
            if (SessionManager.GetUserSession().IsSuperAdmin())
            {
                FirmInstitution firmInstitution = null;

                if (!string.IsNullOrEmpty(id)) //id from dashboard
                {
                    Guid idFirm = Guid.Empty;
                    Guid.TryParse(id, out idFirm);

                    if (idFirm != null && idFirm != Guid.Empty)
                    {
                        firmInstitution = FirmInstitutionBL.GetFirmInstitutionByIdFirmInstitution(idFirm);
                        if (firmInstitution != null)
                        {
                            SessionManager.SetSelectedFirmInstitutionBySuperAdmin(firmInstitution);
                        }
                    }
                }
                else
                {
                    firmInstitution = SessionManager.GetSelectedFirmInstitutionBySuperAdmin();
                }

                if (firmInstitution != null)
                {
                    idSelectedFirm = firmInstitution.idFirmInstitution;
                }

                //Ne pas inclure les etablissements qui n'ont pas encore payé
                bool includeFirmWaitingValidation = false;
                List<FirmInstitution> lstFirmeParents = FirmInstitutionBL.GetFirmInstitutionParents(includeFirmWaitingValidation);
                ViewBag.ListFirmInstitutionParents = new SelectList(lstFirmeParents, "idFirmInstitution", "FirmInstitutionName", idSelectedFirm);
            }

            #endregion

            return View(souscription);
        }
        private void SetSubscriptionInvoiceName(Subscription pSubcription, string pInvoiceName, bool pSaveChanges)
        {
            pSubcription.InvoiceFilename = pInvoiceName;

            if (pSaveChanges)
            {
                db.SaveChanges();
            }
        }
        public ActionResult DesCredits(Subscription souscription)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    User currentUser = SessionManager.GetUserSession();

                    FirmInstitution firm = SessionManager.GetFirmInstitutionSession(); ;

                    if (firm != null)
                    {
                        souscription.Product = SouscriptionBL.Product_Type_credits.ToString();

                        SouscriptionBL.Calculate(souscription, false, firm.idFirmInstitution.ToString());
                        // TVA or NOT
                        if (ConfigurationManager.ExtranetHostCode == PageLanguageHelper.HostCode.BE.ToString())
                        {
                            if (!string.IsNullOrEmpty(firm.NumeroTVAIntracommunautaire) && firm.NumeroTVAIntracommunautaire.StartsWith("BE-0"))
                            {
                                souscription.TotalAmount = souscription.AmountHT;
                            }
                        }

                        
                        SessionManager.Set<Data.Model.Subscription>(SouscriptionBL.SubscriptionSession, souscription);

                        ViewBag.Title = LanguageData.GetContent("des_credits");
                        ViewBag.SelectedClass = "mt2"; //Credit

                        #region Seulement pour SuperAdmin
                        if (currentUser.IsSuperAdmin())
                        {
                            var creditPackageList = db.CreditCost.Where(c => c.HostCode == ConfigurationManager.ExtranetHostCode).OrderBy(c => c.CreditCost1).ToList();
                            ViewBag.CreditPackageList = creditPackageList;

                            Guid? selectedFirm = null;
                            if (Request.Params["SelectedFirmInstitutionId"] != null)
                            {
                                string id = Request.Params["SelectedFirmInstitutionId"].ToString();
                                Guid idFirm = Guid.Empty;
                                Guid.TryParse(id, out idFirm);
                                selectedFirm = idFirm;

                                firm = FirmInstitutionBL.GetFirmInstitutionByIdFirmInstitution(selectedFirm.Value);

                                int idSponsor = 0;
                                if (firm != null)
                                {
                                    #region Sponsor
                                    string sIdSponsor = Request.Params["IdSponsor"].ToString();
                                    Int32.TryParse(sIdSponsor, out idSponsor);

                                    if (idSponsor != 0)
                                    {
                                        firm.IdSponsor = idSponsor;
                                    }
                                    #endregion

                                    SessionManager.SetSelectedFirmInstitutionBySuperAdmin(firm);
                                }

                            }

                            //Ne pas inclure les etablissements qui n'ont pas encore payé
                            bool includeFirmWaitingValidation = false;
                            List<FirmInstitution> lstFirmeParents = FirmInstitutionBL.GetFirmInstitutionParents(includeFirmWaitingValidation);
                            ViewBag.ListFirmInstitutionParents = new SelectList(lstFirmeParents, "idFirmInstitution", "FirmInstitutionName", selectedFirm.Value);
                            ViewBag.ShowSouscriptionPaiment = true;
                            return View("DesCredits", souscription);
                        }
                        #endregion
                        else
                        {
                            return View("SouscriptionPaiement", souscription);
                        }
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }

                }
                else
                {
                    return View(souscription);
                }
            }
            catch
            {
            }
            return View(souscription);
        }
 private void SendMailInvoice(Subscription objSubscription)
 {
     try
     {
         SouscriptionBL.SendInvoiceMail(objSubscription, true); //Send to FirmIntitution Email
     }
     catch
     {
     }
 }
        /// <summary>
        /// Nouvelle souscription d'un client existant
        /// </summary>
        /// <returns></returns>
        public ActionResult NouvelleSouscription()
        {
            try
            {
                //Vérifier que l'utilisateur connecté est un administrateur ???
                User u = SessionManager.GetUserSession();
                if (CanViewPage(u))
                {
                    FirmInstitution firm = SessionManager.GetFirmInstitutionSession();
                    if (firm != null)
                    {
                        //Récupération des souscriptions + Nombre de crédits dont il dispose.
                        ViewBag.CreditNumber = firm.CreditCount;

                        List<Subscription> lstSubscriptions = SouscriptionBL.GetActivesSubscriptionsByFirm(firm.idFirmInstitution);
                        ViewBag.LabNumber = lstSubscriptions.Where(s => s.Application.ToLower() == "lab").Sum(s => s.UserCount);
                        ViewBag.RecueilNumber = lstSubscriptions.Where(s => s.Application.ToLower() == "recueil").Sum(s => s.UserCount);
                        ViewBag.RecueilPlusLabNumber = lstSubscriptions.Where(s => s.Application.ToLower() == "recueil+lab").Sum(s => s.UserCount);

                        List<int> lstNbUsers = new List<int>();
                        for (int i = 1; i <= 50; i++)
                            lstNbUsers.Add(i);
                        ViewBag.ListNbUsers = new SelectList(lstNbUsers);

                        var CreditPackageList = db.CreditCost.ToList();
                        ViewBag.CreditPackageList = CreditPackageList;

                        Subscription souscription = new Subscription();
                        souscription.Application = "Recueil+Lab";
                        souscription.CreditNumber = CreditPackageList.Single(cred => cred.IsMostPopular).CreditNumber;
                        souscription.DateCreated = DateTime.Now;
                        souscription.DateExpired = souscription.DateCreated.AddYears(1);

                        return View(souscription);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                    return RedirectToAction("Index", "Home");
            }
            catch (Exception ex)
            {
                ViewBag.Info = "Erreur: " + ex.Message;
                return View();
            }
        }
        private void UpdateUserCountAndCreditCount(Subscription objSubscription, bool bSaveChanges)
        {
            FirmInstitution firmInstitution = objSubscription.FirmInstitution;
            firmInstitution.MaxUserCount = firmInstitution.MaxUserCount + objSubscription.UserCount;
            firmInstitution.CreditCount = firmInstitution.CreditCount + objSubscription.CreditNumber;

            if (bSaveChanges)
            {
                db.SaveChanges();
            }
        }
        public ActionResult NouvelleSouscription(Subscription souscription)
        {
            if (ModelState.IsValid)
            {
                FirmInstitution firm = SessionManager.GetFirmInstitutionSession();
                if (firm != null)
                {
                    SouscriptionBL.Calculate(souscription, false, firm.idFirmInstitution.ToString());
                    SessionManager.Add<Data.Model.Subscription>(souscription, SouscriptionBL.SubscriptionSession);

                    return View("NouvelleSouscriptionPaiement", souscription);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }

            }
            else
            {
                return View(souscription);
            }
        }
        /// <summary>
        /// Calcul les montants de la souscription effectuée
        /// </summary>
        /// <param name="pSouscription"></param>
        /// <param name="pIsNewFirm">True s'il s'agit d'une première souscription</param>
        /// <param name="pIdFirmInstitution">idFirmInstitution pour un FirmInstitution existant </param>
        public static void Calculate(Subscription pSouscription, bool pIsNewFirm, string pIdFirmInstitution = "")
        {
            using (UpsilabEntities db = new UpsilabEntities())
            {
                bool useGiftAmountParrain = false;

                //application cost
                var subCost = db.SubscriptionCost.SingleOrDefault(sub => sub.SubscriptionCostName == pSouscription.Application
                    && pSouscription.UserCount >= sub.UserNumberMin
                    && pSouscription.UserCount <= sub.UserNumberMax);

                if (subCost != null && pSouscription.Duration.HasValue)
                    pSouscription.ApplicationCost = subCost.SubscriptionCost1 * pSouscription.UserCount * 12 * pSouscription.Duration.Value; // *12 pour une année

                //credit cost
                var creditCost = db.CreditCost.SingleOrDefault(cred => cred.CreditNumber == pSouscription.CreditNumber);
                if (creditCost != null)
                {
                    pSouscription.CreditCost = creditCost.CreditCost1;
                }

                pSouscription.AmountHT = pSouscription.ApplicationCost + pSouscription.CreditCost; //TODO

                decimal reductionPercent = 0;
                decimal reduction = 0;

                //S'il s'agit d'un nouveau FirmInstitution, gérer le code de parrainage s'il a été saisi
                if (pIsNewFirm)
                {
                    //Sponsorship
                    string status;

                    if (SponsorshipBL.IsCodeValid(pSouscription.SponsorshipCode, out status))
                    {
                        if (pSouscription.SponsorshipCode == Sponsorship.Reduction.FV030.ToString()
                            || pSouscription.SponsorshipCode == Sponsorship.Reduction.FV050.ToString()
                            || pSouscription.SponsorshipCode == Sponsorship.Reduction.FV100.ToString()
                            || pSouscription.SponsorshipCode == Sponsorship.Reduction.PVI03.ToString()
                            || pSouscription.SponsorshipCode == Sponsorship.Reduction.ALN05.ToString()
                            || pSouscription.SponsorshipCode == Sponsorship.Reduction.ARA10.ToString()
                            )
                        {
                            reductionPercent = Convert.ToInt32(status);
                        }
                        else if (pSouscription.SponsorshipCode == Sponsorship.Reduction.APE07.ToString())
                        {
                            // permettre d'obtenir une remise de 375€ HT sur le montant des licenses si la souscription est de au moins une licence Recueil+LAB, un an minimum et au moins 1500 credits
                            if (pSouscription.Product == Product_Type_Recueil_lab
                                && pSouscription.Duration >= 1
                                && pSouscription.CreditNumber >= 1500)
                            {
                                reduction = Convert.ToInt32(status);
                            }

                        }
                        else if (pSouscription.SponsorshipCode == Sponsorship.Reduction.FFO33.ToString())
                        {
                            //permettre d'obtenir une remise de 900€ HT sur le montant des licenses si la souscription est de au moins une licence Recueil+LAB, deux ans minimum et au moins 3000 credits
                            if (pSouscription.Product == Product_Type_Recueil_lab
                                && pSouscription.Duration >= 2
                                && pSouscription.CreditNumber >= 3000)
                            {
                                reduction = Convert.ToInt32(status);
                            }
                        }
                        else
                        {
                            reductionPercent = db.Sponsorship.SingleOrDefault(sp => sp.Code == pSouscription.SponsorshipCode).ReductionFilleul;
                        }
                    }
                    else
                    {
                        pSouscription.SponsorshipCode = string.Empty;
                    }
                }
                // Nouvelle souscription d'un Firm Existant ---> Vérifier la réduction à appliquer pour un parrain
                else
                {
                    Guid g_idFirmInstitution = Guid.Parse(pIdFirmInstitution);
                    reductionPercent = SponsorshipBL.GetParrainReduction(g_idFirmInstitution, out useGiftAmountParrain);
                }

                //reduction = (pSouscription.AmountHT * (reductionPercent / 100));
                if (reduction == 0) //Reduction percent
                {
                    if (useGiftAmountParrain)
                    {
                        reductionPercent = 0;
                        reduction = 0;
                    }
                    else
                    {
                        reduction = (pSouscription.ApplicationCost * (reductionPercent / 100)); //Reduction uniquement sur les Licences pas sur le credit
                    }
                }

                pSouscription.AmountHT = pSouscription.AmountHT - reduction;
                pSouscription.ReductionPercent = reductionPercent;
                pSouscription.Reduction = reduction;
                pSouscription.TotalAmount = pSouscription.AmountHT + (pSouscription.AmountHT * (ConfigurationManager.TauxTVA / 100));
            }

        }
 public static void AddSubscription(Subscription sub)
 {
     using (Data.Model.UpsilabEntities createContext = new UpsilabEntities())
     {
         createContext.Subscription.AddObject(sub);
         createContext.SaveChanges();
     }
 }