Exemple #1
0
        public IActionResult Payer(int idPersonne, int idVoyage, [Bind("Email", "Telephone", "Datenaissance")] List <Personne> voyageurs)
        {
            //Récupération de la personne
            var client = _context.Personne.Find(idPersonne);

            //Vérifie si la personne qui effectue une réservation est déjà enregistrée en tant que Client ou non
            if (!_context.Client.Any(c => c.Id == idPersonne))
            {
                client.TypePers = 1;
                client.Client   = new Models.Client {
                    Id = idPersonne
                };
            }

            //Récupération du voyage à réserver
            var voyage = _context.Voyage.Include(v => v.IdDestinationNavigation).FirstOrDefault(v => v.Id == idVoyage);

            var price = voyage.PrixHt;

            foreach (var item in voyageurs)
            {
                //Vérifie que l'adresse mail de chaque voyageur est différente de celle du client
                if (item.Email == client.Email)
                {
                    return(BadRequest($"L'adresse mail {item.Email} est déjà utilisée par le client, merci d'utiliser une adresse mail différente."));
                }

                if (!_context.Personne.Where(p => p.Email == item.Email).Any())
                {
                    item.Civilite = "";
                    item.Nom      = "";
                    item.Prenom   = "";
                    item.TypePers = 2;
                    item.Datenaissance ??= null;
                    item.Telephone ??= null;

                    try
                    {
                        //Enregistre la personne dans un premier temps, afin de pouvoir récupérer son ID et l'assigner en tant que voyageur
                        _context.Personne.Add(item);
                        _context.SaveChanges();
                    }
                    catch (DbUpdateException dbue)
                    {
                        var sqle = (SqlException)dbue.InnerException;

                        //Vérifie si l'erreur reçue a pour numéro 515, et renvoie un message associé
                        if (sqle.Number == 515)
                        {
                            return(BadRequest("L'adresse email doit être renseignée et unique pour tous les voyageurs."));
                        }
                    }
                    catch (Exception)
                    {
                        return(BadRequest("Une erreur innatendue est survenue. Merci de rééssayer."));
                    }

                    //Instancie le voyageur et sauvegarde sa liaison
                    Voyageur voyageur = new Voyageur()
                    {
                        Id = item.Id, Idvoyage = idVoyage
                    };
                    _context.Voyageur.Add(voyageur);
                }
                else
                {
                    //Si le voyageur existe déjà en base, l'associe au voyage, au lieu de créer un nouveau voyageur, basé sur son adresse email
                    var voyageur = _context.Personne.Where(p => p.Email == item.Email).FirstOrDefault();
                    _context.Voyageur.Add(new Voyageur()
                    {
                        Id = voyageur.Id, Idvoyage = idVoyage
                    });
                }

                if (item.Datenaissance != null)
                {
                    var age = DateTime.Today.Year - ((DateTime)item.Datenaissance).Year;
                    if (((DateTime)item.Datenaissance).Date > DateTime.Today.AddYears(-age))
                    {
                        age--;
                    }

                    // Réduc enfant
                    if (age <= 12)
                    {
                        price += voyage.PrixHt * (decimal)0.40;
                    }
                    else
                    {
                        price += voyage.PrixHt;
                    }
                }
                else
                {
                    price += voyage.PrixHt;
                }
            }

            //Création du dossier de réservation
            var dossierRes = new Dossierresa
            {
                IdClient      = idPersonne,
                IdEtatDossier = 1,
                IdVoyage      = idVoyage,
                NumeroCb      = "",
                PrixTotal     = price
            };

            try
            {
                _context.Personne.Update(client);
                _context.SaveChanges();
            }
            catch (DbUpdateException dbue)
            {
                var sqle = (SqlException)dbue.InnerException;

                //Vérifie si l'erreur reçue a pour numéro 2627, et renvoie un message associé
                if (sqle.Number == 2627)
                {
                    return(BadRequest("Un des voyageurs participe déjà à ce voyage."));
                }
            }
            catch (Exception)
            {
                return(BadRequest("Une erreur innatendue est survenue. Merci de rééssayer."));
            }

            return(View("Payer", dossierRes));
        }
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl      = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
            if (ModelState.IsValid)
            {
                //Partie compte Personne
                var personne = new Personne
                {
                    Email    = Input.Email, Nom = Input.Nom, Prenom = Input.Prenom, Civilite = Input.Civilite,
                    TypePers = 2, Telephone = Input.Telephone, Datenaissance = Input.Datenaissance
                };

                try
                {
                    _context.Personne.Add(personne);
                    _context.SaveChanges();
                }
                catch (Exception)
                {
                    throw;
                }

                //Partie standard compte AspNetUser
                var user = new IdentityUser {
                    UserName = Input.Email, Email = Input.Email
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation("L'utilisateur a créé un nouveau compte avec mot de passe.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { area = "Identity", userId = user.Id, code = code },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirmer votre email",
                                                      $"Confirmez votre compte en <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>cliquant ici</a>.");

                    if (_userManager.Options.SignIn.RequireConfirmedAccount)
                    {
                        return(RedirectToPage("RegisterConfirmation", new { email = Input.Email }));
                    }
                    else
                    {
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }