Exemple #1
0
        public string AddTrainTicket(string from, string to, DateTime dateTime, decimal price, decimal studentprice)
        {
            var ticket = new TrainTicket(from, to, dateTime, price, studentprice);
            var result = this.AddTicket(ticket);

            return result;
        }
Exemple #2
0
        /// <summary>
        /// 刷票定时器
        /// </summary>
        void Auto(object obj)
        {
            object[] array       = obj as object[];
            string   fromStation = array[0].ToString();
            string   toStation   = array[1].ToString();
            string   trainDate   = array[2].ToString();

            while (ThreadStatus)
            {
                lock (TIMER_LOCK)
                {
                    try
                    {
                        if (AutoCount < ulong.MaxValue)
                        {
                            AutoCount++;
                        }
                        this.UpdateStatus(string.Format("状态:正在进行第 {0} 次刷票...", AutoCount));
                        Thread.Sleep(1000);
                        // 查询
                        QueryTrainData[] dataArray = TrainTicket.Query(fromStation, toStation, trainDate);
                        if (dataArray != null)
                        {
                            Console.WriteLine("data length:" + dataArray.Length);
                        }
                    }
                    catch (Exception ex)
                    {
                        ArrayList list = new ArrayList();
                        list.Add(ex.Message);
                        Log.Log.Write(list);
                    }
                }
            }
        }
Exemple #3
0
        private void TrainTicketsInfoView_DragDrop(object sender, DragEventArgs e)
        {
            string[]     fileNames  = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            List <Image> loudimages = new List <Image>();

            if (fileNames.Length > 0)
            {
                foreach (var item in fileNames)
                {
                    try
                    {
                        loudimages.Add(Image.FromFile(item));
                    }
                    catch
                    {
                        MessageBox.Show("错误!拖入的:" + item + "不是有效的图片文件", "图片加载", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                    //
                }
                if (loudimages.Count > 0)
                {
                    foreach (var item in loudimages)
                    {
                        TrainTicket.AI_TrainTicket(item);
                    }
                }
            }
        }
Exemple #4
0
        public void RemoveTrainTicket(string logid)
        {
            if (TrainTicket.TrainTickets_Info.Count <= 0)
            {
                MessageBox.Show("你还没导入任何车票呢!\n你删除个鬼啊?", "删除操作", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (TrainTicketsInfoView.SelectedIndex == -1)
            {
                MessageBox.Show("车票都没选......\n你让我删啥玩意?", "删除操作", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            var iscontinue = MessageBox.Show("确定要删除车票\n" + logid, "车票识别系统", MessageBoxButtons.YesNo,
                                             MessageBoxIcon.Information);

            if (iscontinue == DialogResult.No)
            {
                return;
            }
            TrainTicket.TrainTickets_Info.Remove(TrainTicket.GetTrainTicket(logid));
            TrainTicketsInfoView.Items.Remove(logid);
            TrainTicket.TrainTickets_Image.Remove(logid);
            ClearTicketPictureBoxImage();
            ClearTickText();
            if (Width > OrinWidth)
            {
                ISOpen = false;
                FormOpentimer.Enabled = true;
            }
            MessageBox.Show("成功删除车票:" + logid, "删除车票", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
Exemple #5
0
        public string AddTrainTicket(string departureTown, string arrivalTown, DateTime departureDateTime, decimal regularPrice, decimal studentPrice)
        {
            var ticket = new TrainTicket(departureTown, arrivalTown, departureDateTime, regularPrice, studentPrice);
            var result = this.AddTicket(ticket);

            return(result);
        }
        public async Task <IActionResult> PutTrainTicket([FromRoute] int id, [FromBody] TrainTicket trainTicket)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != trainTicket.Id)
            {
                return(BadRequest());
            }

            _context.Entry(trainTicket).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TrainTicketExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
Exemple #7
0
        public void CreateTrainTicket()
        {
            var NEWticket = new TrainTicketInfo();

            //初始化车票信息
            {
                Random ran = new Random();
                int    n   = ran.Next(10, 24);
                int    n2  = ran.Next(10, 24);
                NEWticket.train_starttime = n + ":" + n2;
                int n3 = ran.Next(1, 9);
                NEWticket.train_che = "0" + n3;
                int n4 = ran.Next(1, 9);
                NEWticket.logid               = GetRandomlogid();
                NEWticket.train_hao           = "0" + n4 + "B";
                NEWticket.ticket_num          = "Z19W051789";
                NEWticket.date                = "2019年06月29日";
                NEWticket.destination_station = "杭州东站";
                NEWticket.starting_station    = "绍兴北站";
                NEWticket.seat_category       = "二等座";
                NEWticket.train_num           = "G1234";
                NEWticket.ticket_rates        = "¥10.0元";
                NEWticket.name                = "王小明";
                NEWticket.ID       = "384951990042215674";
                NEWticket.bottomid = TrainTicket.GetRandombottomid();
                NEWticket.jianpiao = String.Format("检票:{0}", TrainTicket.GetRandomLetter().ToString() + new Random().Next(0, 9).ToString());
            }
            //var ticket = TrainTicket.AI_TrainTicket(TicketImageTool.LoadAllTrainTicketsImage()[0]);
            //  TrainTicket.TrainTickets_Info.Add(ticket);
            // TrainTicket.TrainTickets_Info.Add(NEWticket);
            AddTrainTicket(NEWticket);
        }
Exemple #8
0
        private void Button_Save_Click(object sender, EventArgs e)
        {
            if (TrainTicketsInfoView.Items.Count <= 0 || TrainTicketsInfoView.SelectedIndex == -1)
            {
                MessageBox.Show("您并没有选择任何车票", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            NowSlectTickets.ticket_num          = text_ticket_num.Text;
            NowSlectTickets.train_num           = text_train_num.Text;
            NowSlectTickets.ticket_rates        = text_ticket_rates.Text;
            NowSlectTickets.starting_station    = text_starting_station.Text;
            NowSlectTickets.destination_station = text_destination_station.Text;
            NowSlectTickets.ID              = text_ID.Text;
            NowSlectTickets.name            = text_name.Text;
            NowSlectTickets.date            = text_date.Text;
            NowSlectTickets.train_starttime = text_starttime.Text;
            NowSlectTickets.seat_category   = text_seat_category.Text;
            NowSlectTickets.bottomid        = text_bottomid.Text;
            NowSlectTickets.jianpiao        = text_jianpiao.Text;
            NowSlectTickets.train_che       = text_che.Text;
            NowSlectTickets.train_hao       = text_hao.Text;
            TrainTicket.ChangeTrainTicketInfo(NowSlectTickets);

            if (TrainTicketsInfoView.SelectedItem == null)
            {
                return;
            }

            UpateTicketPictureBoxImage(TrainTicketsInfoView.SelectedItem.ToString());
            MessageBox.Show("保存成功:", "保存信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        public async Task <IActionResult> Edit(int id, [Bind("Id,PassengerName,TrainScheduleId")] TrainTicket trainTicket)
        {
            if (id != trainTicket.Id)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(trainTicket);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!TrainTicketExists(trainTicket.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            return(View(trainTicket));
        }
Exemple #10
0
        public string DeleteTrainTicket(string departureTown, string arrivalTown, DateTime departureDateTime)
        {
            var    ticket    = new TrainTicket(departureTown, arrivalTown, departureDateTime);
            string uniqueKey = ticket.TicketKey;
            var    result    = this.DeleteTicket(TicketType.Train, uniqueKey);

            return(result);
        }
Exemple #11
0
        public string GetRandomlogid()
        {
            string result = null;

            for (int i = 0; i < 11; i++)
            {
                result += TrainTicket.GetRandomNumber();
            }
            return(result);
        }
        public async Task <IActionResult> Create([Bind("Id,PassengerName,TrainScheduleId")] TrainTicket trainTicket)
        {
            if (ModelState.IsValid)
            {
                _context.Add(trainTicket);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(trainTicket));
        }
        public string AddTrainTicket(string from, string to, string dt, string pp, string studentpp)
        {
            TrainTicket ticket = new TrainTicket(from, to, dt, pp, studentpp);

            string result = this.AddTicket(ticket);
            if (result.Contains("created"))
            {
                this.trainTicketsCount++;
            }

            return result;
        }
        public async Task <IActionResult> PostTrainTicket([FromBody] TrainTicket trainTicket)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            _context.Tickets.Add(trainTicket);
            await _context.SaveChangesAsync();

            return(CreatedAtAction("GetTrainTicket", new { id = trainTicket.Id }, trainTicket));
        }
        private string DeleteTrainTicket(string from, string to, string dateAndTime)
        {
            TrainTicket ticket = new TrainTicket(from, to, dateAndTime);
            string      result = this.DeleteTicket(ticket);

            if (result.Contains(GlobalConstants.Deleted))
            {
                this.trainTicketsCount--;
            }

            return(result);
        }
        public string AddTrainTicket(string from, string to, DateTime dateTime, decimal price, decimal studentPrice)
        {
            TrainTicket ticket = new TrainTicket(from, to, dateTime, price, studentPrice);
            string      result = this.AddTicket(ticket);

            if (result.Contains("added"))
            {
                this.trainTicketsCount++;
            }

            return(result);
        }
        public string DeleteTrainTicket(string from, string to, DateTime dateTime)
        {
            TrainTicket ticket = new TrainTicket(from, to, dateTime);
            string      result = this.DeleteTicket(ticket);

            if (result.Contains("deleted"))
            {
                this.trainTicketsCount--;
            }

            return(result);
        }
Exemple #18
0
        void AI_LoadAllTrainTickets()
        {
            TrainTicketsInfoView.Items.Clear();
            TrainTicket.TrainTickets_Info.Clear();
            TrainTicket.TrainTickets_Image.Clear();
            var AllTrainticketimage = TicketImageTool.LoadAllTrainTicketsImage();

            foreach (var item in AllTrainticketimage)
            {
                TrainTicket.AI_TrainTicket(item);
            }
        }
    string DeleteTrainTicket(string from, string to, string dt)
    {
        TrainTicket ticket = new TrainTicket(from, to, dt);
        string      result = AddDeleteTicket(ticket, false);



        if (result.Contains("deleted"))
        {
            trainTicketsCount--;
        }
        return(result);
    }
        public string AddTrainTicket(string from, string to, string dateAndTime, string price, string studentPrice)
        {
            TrainTicket ticket = new TrainTicket(from, to, dateAndTime, price, studentPrice);

            string result = this.AddTicket(ticket);

            if (result.Contains(GlobalConstants.Created))
            {
                this.trainTicketsCount++;
            }

            return(result);
        }
Exemple #21
0
        public string AddTrainTicket(string from, string to, DateTime dateTime, decimal price, decimal studentPrice)
        {
            if (!this.trainTickets.Any(t =>
                                       t.From == from &&
                                       t.To == to &&
                                       t.DepartureDateAndTime == dateTime))
            {
                var ticket = new TrainTicket(from, to, dateTime, price, studentPrice);
                this.trainTickets.Add(ticket);
                return("Ticket added");
            }

            return("Duplicate ticket");
        }
        public string AddTrainTicket(string from, string to, DateTime dateTime, decimal price, decimal studentPrice)
        {
            if (!this.trainTickets.Any(t =>
                t.From == from &&
                t.To == to &&
                t.DepartureDateAndTime == dateTime))
            {
                var ticket = new TrainTicket(from, to, dateTime, price, studentPrice);
                this.trainTickets.Add(ticket);
                return "Ticket added";
            }

            return "Duplicate ticket";
        }
Exemple #23
0
        private void TrainTicketsInfoView_SelectedIndexChanged(object sender, EventArgs e)
        {
            // MessageBox.Show(TrainTicketsInfoView.SelectedItem.ToString(), "信息", MessageBoxButtons.OK);
            if (TrainTicketsInfoView.SelectedItem == null)
            {
                TrainTicketsInfoView.ClearSelected();
                return;
            }

            var logid = TrainTicketsInfoView.SelectedItem.ToString();

            NowSlectTickets = TrainTicket.GetTrainTicket(logid);

            text_ticket_num.Text          = NowSlectTickets.ticket_num;
            text_train_num.Text           = NowSlectTickets.train_num;
            text_ticket_rates.Text        = NowSlectTickets.ticket_rates;
            text_starting_station.Text    = NowSlectTickets.starting_station;
            text_destination_station.Text = NowSlectTickets.destination_station;
            text_ID.Text            = NowSlectTickets.ID;
            text_name.Text          = NowSlectTickets.name;
            text_date.Text          = NowSlectTickets.date;
            text_starttime.Text     = NowSlectTickets.train_starttime;
            text_seat_category.Text = NowSlectTickets.seat_category;
            text_bottomid.Text      = NowSlectTickets.bottomid;
            text_jianpiao.Text      = NowSlectTickets.jianpiao;
            text_che.Text           = NowSlectTickets.train_che;
            text_hao.Text           = NowSlectTickets.train_hao;

            if (TrainTicket.TrainTickets_Image.ContainsKey(logid))
            {
                var findimage = TrainTicket.GetTrainTicketImage(logid);
                var trimvalue = 222;
                if (findimage == null)
                {
                    MessageBox.Show("由于没有模板文件,车票无法制作成功", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
                TicketPictureBox.Image = TicketImageTool.shrinkTo(findimage, new Size((findimage.Width + trimvalue) / 3, (findimage.Height + trimvalue) / 3), false);
            }
            else
            {
                UpateTicketPictureBoxImage(TrainTicketsInfoView.SelectedItem.ToString());
            }
            if (Width < OpenWidth)
            {
                ISOpen = true;
                FormOpentimer.Enabled = true;
            }
        }
Exemple #24
0
        private void 导入ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();

            dlg.Filter = "JPG文件|*.jpg|PNG文件|*.png";
            Image loudimage = null;

            if (dlg.ShowDialog() == DialogResult.OK)
            {
                loudimage = Image.FromFile(dlg.FileName);
                if (loudimage != null)
                {
                    TrainTicket.AI_TrainTicket(loudimage);
                }
            }
        }
    public string AddTrainTicket(string from,


                                 string to, string dt,
                                 string pp, string studentpp)
    {
        TrainTicket ticket = new TrainTicket(from, to, dt, pp, studentpp);



        string result = this.AddDeleteTicket(ticket, true);

        if (result.Contains("added"))
        {
            trainTicketsCount++;
        }
        return(result);
    }
Exemple #26
0
        void UpateTicketPictureBoxImage(string number)
        {
            var Tickets = TrainTicket.GetTrainTicket(number);

            if (TrainTicket.TrainTickets_Image.ContainsKey(number))
            {
                TrainTicket.TrainTickets_Image.Remove(number);
            }
            TrainTicket.TrainTickets_Image.Add(number, TicketImageTool.MakeTrainTickImage(Tickets));
            NowSlectTickets = TrainTicket.GetTrainTicket(number);
            var findimage = TrainTicket.GetTrainTicketImage(number);
            var trimvalue = 222;

            if (findimage == null)
            {
                MessageBox.Show("由于没有模板文件,车票无法制作成功", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            TicketPictureBox.Image = TicketImageTool.shrinkTo(findimage, new Size((findimage.Width + trimvalue) / 3, (findimage.Height + trimvalue) / 3), false);
        }
Exemple #27
0
        private void 导出ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if (TrainTicketsInfoView.SelectedIndex == -1)
            {
                var dialogresult = MessageBox.Show("车票都没选。。。要不我导出一个空气给你?", "导出车票错误", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dialogresult == DialogResult.Yes)
                {
                    MessageBox.Show("你还真的。。。。、\n脸皮厚。。。没车票导出个鬼啊!!!", "导出车票错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                return;
            }
            if (TrainTicketsInfoView.Items.Count <= 0)
            {
                MessageBox.Show("一张车票都没有,导出啥玩意?", "导出车票错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            var logid = TrainTicketsInfoView.SelectedItem.ToString();

            TrainTicket.GetTrainTicketImage(logid).Save(TrainTicket.savePath + logid + ".jpg");
            MessageBox.Show("车票" + logid + "导出成功", "导出车票成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
            System.Diagnostics.Process.Start(TrainTicket.savePath);
        }
Exemple #28
0
        private void TrainTicketMainForm_Load(object sender, EventArgs e)
        {
            var APP_ID     = "16672550";
            var API_KEY    = "lNls0VC4YjB4LocNTDGB9jn0";
            var SECRET_KEY = "OoGRDa7sYsM6qjOwGEDvx7r7mWBLPsG0";

            Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
            // PhotoName = Console.ReadLine();
            TrainTicket.client         = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);
            TrainTicket.client.Timeout = 60000;  // 修改超时时间
            Console.WriteLine(TrainTicket.LoudTicketsPath);
            TrainTicket.InitPeople_ID();
            TrainTicket.BaseTicketImage             = TicketImageTool.LoadAllBaseTrainTicketsImage();
            TrainTicket.OnTrainTicketMaked         += UpdateTrainTicketView;
            TrainTicket.OnTrainTicketError         += TrainTicketError;
            Control.CheckForIllegalCrossThreadCalls = false;
            _S.Opacity        = 0;
            _S.timer1.Enabled = true;
            _S.Text           = String.Format("AI智能火车票[识别/修改]系统-版本:{0}", Application.ProductVersion);
            OpenWidth         = Width;
            Width             = 350;
        }
        public string AddTrainTicket(
            string departureTown,
            string arrivalTown,
            DateTime dateAndTime,
            decimal regularPrice,
            decimal studentPrice)
        {
            TrainTicket ticket = new TrainTicket(
                departureTown,
                arrivalTown,
                dateAndTime.ToString("dd.MM.yyyy HH:mm"),
                regularPrice.ToString(),
                studentPrice.ToString());

            string result = this.AddDeleteTicket(ticket, true);
            if (result == "Ticket added")
            {
                this.trainTicketsCount++;
            }

            return result;
        }
Exemple #30
0
 /// <summary>
 /// 查询
 /// </summary>
 void btnQuery_Click(object sender, EventArgs e)
 {
     try
     {
         if (this.ValidateQuery())
         {
             this.btnQuery.Enabled = false;
             PWLoading.Show(this, "正在查询...", new Action(() =>
             {
                 QueryTrainData[] data = TrainTicket.Query(
                     this.txtFromStation.Tag.ToString(),
                     this.txtToStation.Tag.ToString(),
                     this.dtpTrainDate.Value.ToString("yyyy-MM-dd"));
                 if (this.InvokeRequired)
                 {
                     this.Invoke(new Action(() =>
                     {
                         this.LoadQueryData(data);
                     }));
                 }
                 else
                 {
                     this.LoadQueryData(data);
                 }
             }));
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, "错误:" + ex.Message, "系统错误");
         this.ResetQuery();
     }
     finally
     {
         this.ResetQuery();
     }
 }
Exemple #31
0
 public string AddTrainTicket(string from, string to, DateTime date, decimal price, decimal studentPrice)
 {
     TrainTicket ticket = new TrainTicket(from, to, date, price, studentPrice);
     return this.AddTicket(ticket);
 }
        public ActionResult Purchase(PurchaseTicketViewModel ticket)
        {
            var currentUserId = User.Identity.GetUserId();
            var train         = db.Trains.Find(ticket.Id);

            if (train == null)
            {
                return(new HttpStatusCodeResult(404));
            }

            var viewModel = new AvailableTrainViewModel()
            {
                Id    = train.Id,
                Route = train.Route,
                BusinessClassPassengersCount = (db.TrainTickets
                                                .Where(t => t.TrainId == train.Id)
                                                .Where(t => t.IsConfirmed)
                                                .Where(t => t.IsBusinessClass)
                                                .Select(t => t.PassengersCount)
                                                .DefaultIfEmpty()
                                                .Sum()),
                EconomicClassPassengersCount = (db.TrainTickets
                                                .Where(t => t.TrainId == train.Id)
                                                .Where(t => t.IsConfirmed)
                                                .Where(t => !t.IsBusinessClass)
                                                .Select(t => t.PassengersCount)
                                                .DefaultIfEmpty()
                                                .Sum()),
                DepartureTime = train.DepartureTime
            };

            if (train.DepartureTime < DateTime.Now)
            {
                ViewBag.Error = "This train has already departed.";
                return(View(viewModel));
            }
            else if (train.DepartureTime > DateTime.Now.AddDays(AppConstants.MAX_DAYS_BEFORE_RESERVATION))
            {
                ViewBag.Error = "You can only purchase tickets as late as two weeks before departure.";
                return(View(viewModel));
            }

            string errorMessage = ValidateAvailableSeats(ticket, viewModel);

            if (!string.IsNullOrEmpty(errorMessage))
            {
                ViewBag.Error = errorMessage;
                return(View(viewModel));
            }

            var generatedTicket = new TrainTicket()
            {
                UserId          = new Guid(currentUserId),
                TrainId         = train.Id,
                Departure       = train.Route.Departure,
                Arrival         = train.Route.Arrival,
                DepartureTime   = train.DepartureTime,
                PurchasedOn     = DateTime.Now,
                IsBusinessClass = ticket.TravellerClass == "business" ? true : false,
                PassengersCount = ticket.PassengersCount,
                Price           = train.Route.Price * ticket.PassengersCount,
                IsConfirmed     = false
            };

            generatedTicket.Price *= generatedTicket.IsBusinessClass
                ? AppConstants.BUSINESS_CLASS_MULTIPLIER : 1.0m;

            db.TrainTickets.Add(generatedTicket);
            db.SaveChanges();

            return(SendPurchaseConfirmationEmail(generatedTicket.Id));
        }
Exemple #33
0
        public string DeleteTrainTicket(string from, string to, DateTime dateTime)
        {
            var ticket = new TrainTicket(from, to, dateTime);
            var result = this.DeleteTicket(ticket);

            return result;
        }
        public string AddTrainTicket(string from, string to, string dateTime, string price, string studentPrice)
        {
            TrainTicket ticket = new TrainTicket(from, to, dateTime, price, studentPrice);

            string result = this.AddTicket(ticket);
            if (result.Contains("added"))
            {
                this.trainTicketsCount++;
            }

            return result;
        }
        public string DeleteTrainTicket(string from, string to, DateTime dt)
        {
            var ticket = new TrainTicket(from, to, dt);
            var result = this.DeleteTicket(ticket);

            if (result.Contains("deleted"))
            {
                this.trainTicketsCount--;
            }

            return result;
        }
        public string AddTrainTicket(string from, string to, DateTime dt, decimal price, decimal studentPrice)
        {
            var ticket = new TrainTicket(from, to, dt, price, studentPrice);

            var result = this.AddTicket(ticket);
            if (result.Contains("created"))
            {
                this.trainTicketsCount++;
            }

            return result;
        }
        public ActionResult Purchase(PurchaseTicketViewModel ticket)
        {
            var currentUserId = User.Identity.GetUserId();
            var train = db.Trains.Find(ticket.Id);

            if (train == null)
            {
                return new HttpStatusCodeResult(404);
            }

            var viewModel = new AvailableTrainViewModel()
            {
                Id = train.Id,
                Route = train.Route,
                BusinessClassPassengersCount = (db.TrainTickets
                                        .Where(t => t.TrainId == train.Id)
                                        .Where(t => t.IsConfirmed)
                                        .Where(t => t.IsBusinessClass)
                                        .Select(t => t.PassengersCount)
                                        .DefaultIfEmpty()
                                        .Sum()),
                EconomicClassPassengersCount = (db.TrainTickets
                                        .Where(t => t.TrainId == train.Id)
                                        .Where(t => t.IsConfirmed)
                                        .Where(t => !t.IsBusinessClass)
                                        .Select(t => t.PassengersCount)
                                        .DefaultIfEmpty()
                                        .Sum()),
                DepartureTime = train.DepartureTime
            };

            if (train.DepartureTime < DateTime.Now)
            {
                ViewBag.Error = "This train has already departed.";
                return View(viewModel);
            }
            else if (train.DepartureTime > DateTime.Now.AddDays(AppConstants.MAX_DAYS_BEFORE_RESERVATION))
            {
                ViewBag.Error = "You can only purchase tickets as late as two weeks before departure.";
                return View(viewModel);
            }

            string errorMessage = ValidateAvailableSeats(ticket, viewModel);

            if (!string.IsNullOrEmpty(errorMessage))
            {
                ViewBag.Error = errorMessage;
                return View(viewModel);
            }

            var generatedTicket = new TrainTicket()
            {
                UserId = new Guid(currentUserId),
                TrainId = train.Id,
                Departure = train.Route.Departure,
                Arrival = train.Route.Arrival,
                DepartureTime = train.DepartureTime,
                PurchasedOn = DateTime.Now,
                IsBusinessClass = ticket.TravellerClass == "business" ? true : false,
                PassengersCount = ticket.PassengersCount,
                Price = train.Route.Price * ticket.PassengersCount,
                IsConfirmed = false
            };
            generatedTicket.Price *= generatedTicket.IsBusinessClass
                ? AppConstants.BUSINESS_CLASS_MULTIPLIER : 1.0m;

            db.TrainTickets.Add(generatedTicket);
            db.SaveChanges();

            return SendPurchaseConfirmationEmail(generatedTicket.Id);
        }
        public string DeleteTrainTicket(string departureTown, string arrivalTown, DateTime dateTime)
        {
            TrainTicket ticket = new TrainTicket(departureTown, arrivalTown, dateTime.ToString("dd.MM.yyyy HH:mm"));
            string result = this.AddDeleteTicket(ticket, false);

            if (result == "Ticket deleted")
            {
                this.trainTicketsCount--;
            }

            return result;
        }
        public string DeleteTrainTicket(string from, string to, string dateTime)
        {
            TrainTicket ticket = new TrainTicket(from, to, dateTime);
            string result = this.DeleteTicket(ticket);

            if (result.Contains("deleted"))
            {
                this.trainTicketsCount--;
            }

            return result;
        }
        public string AddTrainTicket(string from, string to, string dt, string pp, string studentpp)
        {
            var ticket = new TrainTicket(from, to, dt, pp, studentpp);

            var result = this.AddDeleteTicket(ticket, true);
            if (result.Contains("added"))
            {
                this.trainTicketsCount++;
            }
            return result;
        }
        public string DeleteTrainTicket(string from, string to, DateTime dateAndTime)
        {
            TrainTicket ticket = new TrainTicket(from, to, dateAndTime);
            string result = this.DeleteTicketByUniqueKey(ticket.UniqueKey);

            return result;
        }
        private string DeleteTrainTicket(string from, string to, string dt)
        {
            var ticket = new TrainTicket(from, to, dt);
            var result = this.AddDeleteTicket(ticket, false);

            if (result.Contains("deleted"))
            {
                this.trainTicketsCount--;
            }
            return result;
        }