Imagara 2 lat temu
rodzic
commit
c9c5d20103

+ 26 - 1
RaspisKusach/Functions.cs

@@ -50,10 +50,35 @@ namespace RaspisKusach
             return cnt.db.RoutesStations.Where(item => item.IdRoute == route.IdRoute).Select(item => item.Stations.Location).FirstOrDefault();
         }
         // Получение количества свободных мест в вагоне
-        public static int GetAvailableSeats(Carriages carriage)
+        public static int GetCountAvailableSeats(Carriages carriage)
         {
             return carriage.Places - cnt.db.Tickets.Where(item => item.IdCarriage == carriage.IdCarriage).Count();
         }
+        // Получение свободного места
+        public static int GetAvailableSeat(Carriages carriage)
+        {
+            int availableSeat = -1;
+
+            if(GetCountAvailableSeats(carriage) > 0)
+            {
+                if (cnt.db.Tickets.Where(item => item.IdCarriage == carriage.IdCarriage).Select(item => item.PlaceNumber).DefaultIfEmpty(0).Max() + 1 <= carriage.Places)
+                    availableSeat = cnt.db.Tickets.Where(item => item.IdCarriage == carriage.IdCarriage).Select(item => item.PlaceNumber).DefaultIfEmpty(0).Max() + 1;
+                else
+                {
+                    int seatCounter = 1;
+                    foreach (var item in cnt.db.Tickets.Where(item => item.IdCarriage == carriage.IdCarriage).OrderBy(item => item.PlaceNumber))
+                    {
+                        if (item.PlaceNumber != seatCounter)
+                        {
+                            availableSeat = seatCounter;
+                            break;
+                        }
+                        seatCounter++;
+                    }
+                }
+            }
+            return availableSeat;
+        }
 
         // Проверка на необходимую длину и содержание только цифр
         public static bool IsOnlyDigitsAndLengthCorrect(string str, int length)

+ 59 - 58
RaspisKusach/Pages/RegisterPage.xaml.cs

@@ -20,56 +20,56 @@ namespace RaspisKusach.Pages
 
         private void RegisterButton_Click(object sender, RoutedEventArgs e)
         {
-            try
-            {
-                string[] fio = new string[3];
+            string[] fio = new string[3];
 
-                switch (registerStage)
-                {
-                    case 1:
-                        if (!Functions.IsMinLengthCorrect(LogBox.Text, 5))
-                            new ErrorWindow("Поле «Логин» должно содержать не менее 5 символов.").Show();
-                        else if (!Functions.IsMinLengthCorrect(PassBox.Password, 5))
-                            new ErrorWindow("Поле «Пароль» должно содержать не менее 5 символов.").Show();
-                        else if (!Functions.IsLogEqualPass(LogBox.Text, PassBox.Password))
-                            new ErrorWindow("Поля «Логин» и «Пароль» не должны быть равны.").Show();
-                        else if (Functions.IsLoginAlreadyTaken(LogBox.Text))
-                            new ErrorWindow("Данный логин уже занят").Show();
-                        else
-                        {
-                            RegA.Visibility = Visibility.Collapsed;
-                            RegB.Visibility = Visibility.Visible;
-                            RegC.Visibility = Visibility.Collapsed;
-                            registerStage = 2;
-                        }
-                        break;
-                    case 2:
-                        fio = FIOBox.Text.Split(' ');
-                        if (!Functions.IsEmailCorrect(EmailBox.Text))
-                            new ErrorWindow("Email введен неверно.").Show();
-                        else if (Functions.IsEmailAlreadyTaken(EmailBox.Text))
-                            new ErrorWindow("Данный email уже используется.").Show();
-                        else if (!Functions.IsMinLengthCorrect(fio[0], 2)
-                            || !Functions.IsMinLengthCorrect(fio[1], 2)
-                            || !Functions.IsMinLengthCorrect(fio[2], 2))
-                            new ErrorWindow("Поле ФИО введено неверно.").Show();
-                        else
-                        {
-                            RegA.Visibility = Visibility.Collapsed;
-                            RegB.Visibility = Visibility.Collapsed;
-                            RegC.Visibility = Visibility.Visible;
-                            registerStage = 3;
-                            RegisterButton.Content = "Регистрация";
-                        }
-                        break;
-                    case 3:
-                        if (!Functions.IsOnlyDigitsAndLengthCorrect(PhoneBox.Text, 11))
-                            new ErrorWindow("Номер телефона введен неверно.").Show();
-                        else if (!Functions.IsPhoneNumberAlreadyTaken(PhoneBox.Text))
-                            new ErrorWindow("Номер телефона уже используется.").Show();
-                        else if (!Functions.IsOnlyDigitsAndLengthCorrect(PassportBox.Text, 10))
-                            new ErrorWindow("Паспорт введен неверно.").Show();
-                        else
+            switch (registerStage)
+            {
+                case 1:
+                    if (!Functions.IsMinLengthCorrect(LogBox.Text, 5))
+                        new ErrorWindow("Поле «Логин» должно содержать не менее 5 символов.").Show();
+                    else if (!Functions.IsMinLengthCorrect(PassBox.Password, 5))
+                        new ErrorWindow("Поле «Пароль» должно содержать не менее 5 символов.").Show();
+                    else if (!Functions.IsLogEqualPass(LogBox.Text, PassBox.Password))
+                        new ErrorWindow("Поля «Логин» и «Пароль» не должны быть равны.").Show();
+                    else if (Functions.IsLoginAlreadyTaken(LogBox.Text))
+                        new ErrorWindow("Данный логин уже занят").Show();
+                    else
+                    {
+                        RegA.Visibility = Visibility.Collapsed;
+                        RegB.Visibility = Visibility.Visible;
+                        RegC.Visibility = Visibility.Collapsed;
+                        registerStage = 2;
+                    }
+                    break;
+                case 2:
+                    fio = FIOBox.Text.Split(' ');
+                    if (!Functions.IsEmailCorrect(EmailBox.Text))
+                        new ErrorWindow("Email введен неверно.").Show();
+                    else if (Functions.IsEmailAlreadyTaken(EmailBox.Text))
+                        new ErrorWindow("Данный email уже используется.").Show();
+                    else if (!Functions.IsMinLengthCorrect(fio[0], 2)
+                        || !Functions.IsMinLengthCorrect(fio[1], 2)
+                        || !Functions.IsMinLengthCorrect(fio[2], 2))
+                        new ErrorWindow("Поле ФИО введено неверно.").Show();
+                    else
+                    {
+                        RegA.Visibility = Visibility.Collapsed;
+                        RegB.Visibility = Visibility.Collapsed;
+                        RegC.Visibility = Visibility.Visible;
+                        registerStage = 3;
+                        RegisterButton.Content = "Регистрация";
+                    }
+                    break;
+                case 3:
+                    if (!Functions.IsOnlyDigitsAndLengthCorrect(PhoneBox.Text, 11))
+                        new ErrorWindow("Номер телефона введен неверно.").Show();
+                    else if (!Functions.IsPhoneNumberAlreadyTaken(PhoneBox.Text))
+                        new ErrorWindow("Номер телефона уже используется.").Show();
+                    else if (!Functions.IsOnlyDigitsAndLengthCorrect(PassportBox.Text, 10))
+                        new ErrorWindow("Паспорт введен неверно.").Show();
+                    else
+                    {
+                        try
                         {
                             Users newUser = new Users()
                             {
@@ -88,16 +88,17 @@ namespace RaspisKusach.Pages
                             Session.User = cnt.db.Users.Max();
                             NavigationService.Navigate(new ProfilePage());
                         }
-                        break;
-                    default:
-                        new ErrorWindow("Ошибка.").Show();
-                        break;
-                }
-            }
-            catch
-            {
-                new ErrorWindow("Ошибка.").ShowDialog();
+                        catch
+                        {
+                            new ErrorWindow("Ошибка.").ShowDialog();
+                        }
+                    }
+                    break;
+                default:
+                    new ErrorWindow("Ошибка.").Show();
+                    break;
             }
+
         }
     }
 }

+ 2 - 2
RaspisKusach/Pages/TripInfoPage.xaml

@@ -125,8 +125,8 @@
 
                                 <Button Grid.Column="2"
                                         Content="Купить"
-                                        Margin="6">
-                                    
+                                        Margin="6"
+                                        Click="BuyTicketButton_Click">
                                 </Button>
                             </Grid>
                         </Grid>

+ 39 - 2
RaspisKusach/Pages/TripInfoPage.xaml.cs

@@ -1,6 +1,8 @@
-using System.Collections.Generic;
+using System.Windows;
+using System.Collections.Generic;
 using System.Linq;
 using System.Windows.Controls;
+using System;
 
 namespace RaspisKusach.Pages
 {
@@ -27,13 +29,48 @@ namespace RaspisKusach.Pages
                 {
                     Carriage = item,
                     CarriageNum = carrNum,
-                    AvailableSeats = Functions.GetAvailableSeats(item)
+                    AvailableSeats = Functions.GetCountAvailableSeats(item)
                 });
                 carrNum++;
             }
 
             CarriageListBox.ItemsSource = routeList;
         }
+        private void BuyTicketButton_Click(object sender, RoutedEventArgs e)
+        {
+            Button btn = (Button)sender;
+            if (btn.DataContext is CarriageClass)
+            {
+                Carriages carr = ((CarriageClass)btn.DataContext).Carriage;
+                if (Session.User == null)
+                    new ErrorWindow("Для покупки необходимо войти в профиль.").ShowDialog();
+                else if (Functions.GetCountAvailableSeats(carr) <= 0)
+                    new ErrorWindow("Свободных мест не осталось.").ShowDialog();
+                else
+                {
+                    try
+                    {
+                        Tickets newTicket = new Tickets()
+                        {
+                            IdTicket = cnt.db.Tickets.Select(p => p.IdTicket).DefaultIfEmpty(0).Max() + 1,
+                            IdUser = Session.User.IdUser,
+                            IdTrip = trip.IdTrip,
+                            IdCarriage = carr.IdCarriage,
+                            PlaceNumber = Functions.GetAvailableSeat(carr),
+                            BuyDate = DateTime.Now,
+                        };
+                        cnt.db.Tickets.Add(newTicket);
+                        cnt.db.SaveChanges();
+                        new ErrorWindow("Успешная покупка").ShowDialog();
+                    }
+                    catch (Exception ex)
+                    {
+                        new ErrorWindow($"Ошибка: {ex}").ShowDialog();
+                    }
+                }
+            }
+
+        }
         public class CarriageClass
         {
             public Carriages Carriage { get; set; }