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