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()); }