예제 #1
0
 public static void CloseTicket(Ticket ticket)
 {
     if (!ActiveTicket.IsFutureTimed ||
         (ActiveTicket.StartTime < DateTime.Now))
     {
         Lock.Delete(TableName.Ticket, ActiveTicket.PrimaryKey.Id);
         ActiveTicket.SetPrepareTime(DateTime.Now);
         ActiveTicket.Update();
     }
 }
예제 #2
0
        public PayResult Pay(PayRequest payRequest)
        {
            var parts   = payRequest.Qrcode.Split('|');
            var request = new PayRequest1()
            {
                Type            = (TransportType)int.Parse(parts[0]),
                Route           = int.Parse(parts[1]),
                TransportNumber = parts[2]
            };

            if (request.Type == TransportType.Tram) // emulate payment system failure
            {
                return(new PayResult()
                {
                    Succeeded = false,
                    ErrorType = ErrorType.PaymentSystemFailed
                });
            }

            var          id = User.Identity.GetUserId();
            ActiveTicket activeTicket;

            using (var context = new ApplicationDbContext())
            {
                var user = context.Users.FirstOrDefault(x => x.Id == id);

                if (user.ParentUser != null)
                {
                    if (user.Limit - Rate < 0)
                    {
                        Notifications.Instance.Send("Your child is out of limit", user.ParentUser.Id);
                        return(new PayResult()
                        {
                            Succeeded = false,
                            ErrorType = ErrorType.OutOfLimit
                        });
                    }
                }

                activeTicket = new ActiveTicket()
                {
                    Route           = request.Route,
                    TransportNumber = request.TransportNumber,
                    Type            = request.Type,
                    ValidateDate    = DateTime.UtcNow
                };

                if (user.LongTermTicket != null && user.LongTermTicket.RemainingTrips > 0)
                {
                    user.LongTermTicket.RemainingTrips--;
                }
                else if (user.ParentUser != null)
                {
                    user.Limit -= Rate;
                    Notifications.Instance.Send($"Your child spent {Rate} rubles on single ticket", user.ParentUser.Id);
                }
                else
                {
                    // TODO pay
                }

                user.ActiveTicket = activeTicket;
                context.SaveChanges();
                activeTicket.Id = user.ActiveTicket.Id;
            }

            return(new PayResult()
            {
                Succeeded = true,
                ActiveTicket = activeTicket
            });
        }