//TODO: performance optimize this method to cancel tickets in bulk public CancelTicketResponse CancelAndRefundTicket(long hostId, long ticketId, out string status) { CancelTicketResponse result = null; AdmissionServices admissionServices = new AdmissionServices(); //Get ticket info var ticket = admissionServices.GetTicketById(ticketId); if (ticket == null) { status = CancelTicketStatuses.TicketNotFound; return(null); } if (ticket.Status == TicketStatuses.Used) { status = CancelTicketStatuses.TicketAlreadyUsed; return(null); } if (ticket.Status == TicketStatuses.Cancelled) { status = CancelTicketStatuses.TicketAlreadyCancelled; return(null); } //Get event info var eventInfo = GetEventByRef(hostId, ticket.EventReferenceId); if (eventInfo == null) { status = CancelTicketStatuses.EventNotFound; return(null); } //Validate event status if (eventInfo.Status != EventStatuses.Active) { status = CancelTicketStatuses.EventNotActive; return(null); } //Validate if event start date is over if (DateTime.UtcNow >= eventInfo.StartDate) { status = CancelTicketStatuses.EventHasAlreadyStarted; return(null); } //Get event tier EventsServices eventsServices = new EventsServices(); var eventTier = eventsServices.GetEventTiersByRef(hostId, ticket.TierReferenceId); if (eventTier == null) { status = CancelTicketStatuses.TierNotFound; return(null); } //Get customer info CustomerServices customerServices = new CustomerServices(); var customer = customerServices.GetCustomerByRef(hostId, ticket.CustomerReferenceId); if (customer == null) { status = CancelTicketStatuses.CustomerNotFound; return(null); } //Refund the customer using funds from the event address WalletServices walletServices = new WalletServices(); walletServices.Transfer(eventInfo.WalletAddress, customer.WalletAddress, ticket.PaidPrice.Value, ticket.BookingId, "Refund"); //Update ticket status to cancelled admissionServices.UpdateTicketStatus(ticketId, TicketStatuses.Cancelled); //Update ticket availability BookingServices bookingServices = new BookingServices(); bookingServices.UpdateAvailableTickets(eventTier.TierId.Value, eventTier.AvailableTickets.Value + 1); //Commit to blockchain ContractApi blockchainContract = new ContractApi(); blockchainContract.CancelTicket(ticket.TicketNo); status = CancelEventStatuses.Success; result = new CancelTicketResponse(); result.EventTitle = ticket.EventTitle; result.TierTitle = ticket.TierTitle; result.PaidPrice = ticket.PaidPrice; result.NewTicketStatus = TicketStatuses.Cancelled; return(result); }
public HttpResponseMessage CancelTicket(CancelTicketRequest request) { CancelTicketResponse responseData = null; try { //Authenticate API key long?hostId = HostServices.GetCallerHostId(); if (!hostId.HasValue) { Log.Warn(ResponseMessages.InvalidAPIKey); return(Request.CreateResponse(new GenericResponse(null, ResponseCodes.InvalidAPIKey, ResponseMessages.InvalidAPIKey))); } //Validate input if (request == null || string.IsNullOrEmpty(request.TicketNumber)) { return(Request.CreateResponse(new GenericResponse(null, ResponseCodes.InvalidParam, ResponseMessages.InvalidParam))); } //Perform transaction EventsServices eventsService = new EventsServices(); string status = null; responseData = eventsService.CancelTicket(hostId.Value, request, out status); if (status == CancelTicketStatuses.TicketNotFound) { return(Request.CreateResponse(new GenericResponse(null, CancelTicketStatuses.TicketNotFound, "TicketNotFound"))); } else if (status == CancelTicketStatuses.TicketAlreadyCancelled) { return(Request.CreateResponse(new GenericResponse(null, CancelTicketStatuses.TicketAlreadyCancelled, "TicketAlreadyCancelled"))); } else if (status == CancelTicketStatuses.TicketAlreadyUsed) { return(Request.CreateResponse(new GenericResponse(null, CancelTicketStatuses.TicketAlreadyUsed, "TicketAlreadyUsed"))); } else if (status == CancelTicketStatuses.EventNotFound) { return(Request.CreateResponse(new GenericResponse(null, CancelTicketStatuses.EventNotFound, "EventNotFound"))); } else if (status == CancelTicketStatuses.EventNotActive) { return(Request.CreateResponse(new GenericResponse(null, CancelTicketStatuses.EventNotActive, "Event is already cancelled or closed."))); } else if (status == CancelTicketStatuses.EventHasAlreadyStarted) { return(Request.CreateResponse(new GenericResponse(null, CancelTicketStatuses.EventHasAlreadyStarted, "EventHasAlreadyStarted"))); } else if (status == CancelTicketStatuses.CustomerNotFound) { return(Request.CreateResponse(new GenericResponse(null, CancelTicketStatuses.CustomerNotFound, "CustomerNotFound"))); } else if (status == CancelTicketStatuses.Success) { return(Request.CreateResponse(new GenericResponse(responseData, ResponseCodes.Success, ResponseMessages.Success))); } else { Log.Error("Unrecognized status: " + status); return(Request.CreateResponse(new GenericResponse(null, ResponseCodes.Error, ResponseMessages.Error))); } } catch (Exception ex) { Log.Exception(ex); return(Request.CreateResponse(new GenericResponse(null, ResponseCodes.Error, ResponseMessages.Error))); } }
public IActionResult CancelTicket([FromBodyAttribute] cancelTicketRequest Request) { ErrorResponseOnCencel error = new ErrorResponseOnCencel(); if (!ModelState.IsValid || string.IsNullOrEmpty(Request.request.agentTxnId) || string.IsNullOrEmpty(Request.request.psgnToken) || string.IsNullOrEmpty(Request.request.reservationId)) { return(Ok(new Application_ResponseWrapper() { ResponseCode = "1000", ResponseMessage = "Invalid model", Status = "failed", ResponseResult = "" })); } if (string.IsNullOrEmpty(_irctcUrl) || string.IsNullOrEmpty(_irctc_userName) || string.IsNullOrEmpty(_irctc_password)) { return(Ok(new Application_ResponseWrapper() { ResponseCode = "1001", ResponseMessage = "No IRCTC configuration found", Status = "failed" })); } _irctcUrl = _irctcUrl + "tatktservices/cancel"; try { CommunicationLog("OxiRail", "cancelBookedTicket OUT->>" + JsonConvert.SerializeObject(Request).ToString(), Request.userSession); CancelTicketResponse Response = new CancelTicketResponse(); var response = _booking.CancelTicket(_irctcUrl, Request.request, Request.userSession, _authInfo); Response = (CancelTicketResponse)JsonConvert.DeserializeObject(response.ToString(), typeof(CancelTicketResponse)); if (Response.cancellationId != null) { CommunicationLog("OxiRail", "cancelBookedTicket IN->>" + JsonConvert.SerializeObject(Response).ToString(), Request.userSession); ITicketCancellationRepository objCan = new TicketCancellationRepository(_applicationDbContext); int[] psngrIndex = common.FindcharIndexInString(Request.request.psgnToken, 'Y'); IBookedTicketsRepository objBooked = new BookedTicketsRepository(_applicationDbContext); ITicketPassengersRepository psnger = new TicketPassengersRepository(_applicationDbContext); ICancelledTicketPassengersRepository PsngrLog = new CancelledTicketPassengersRepository(_applicationDbContext); var BookedTicket = objBooked.FindBy(x => x.pnrNumber == Response.pnrNo).SingleOrDefault(); List <TicketPassengers> PsngrList = psnger.FindBy(x => x.ticketOrderId == BookedTicket.ticketOrderId).OrderBy(x => x.Id).ToList <TicketPassengers>(); TicketCancellations objTicketCancel = objCan.AddCancelTicket(new TicketCancellations() { bookedTicketId = BookedTicket.Id, noOfPassenger = Convert.ToInt32(Response.noOfPsgn), ticketNumber = BookedTicket.ticketNumber, status = true, amountCollected = Convert.ToDecimal(Response.amountCollected), refundedAmount = Convert.ToDecimal(Response.refundAmount), cashDeducted = Convert.ToDecimal(Response.cashDeducted), cashCollected = Convert.ToDecimal(Response.amountCollected), amount = Convert.ToDecimal(Response.refundAmount), paymentGateways = 1, sessions = Request.userSession, date = DateTime.Now, cancelledDate = Response.cancelledDate }); objCan.Commit(); foreach (int index in psngrIndex) { long psngrId = PsngrList[index].Id;// To be inserted in Cancelled ticket Passenger objTicketCancel PsngrLog.Add(new CancelledTicketPassengers { ticketId = objTicketCancel.Id, passengerId = psngrId }); } PsngrLog.Commit(); return(Ok(new Application_ResponseWrapper() { ResponseCode = "0", ResponseMessage = "success", Status = "success", ResponseResult = Response })); } else { error = (ErrorResponseOnCencel)JsonConvert.DeserializeObject(response.ToString(), typeof(ErrorResponseOnCencel)); CommunicationLog("OxiRail", "cancelBookedTicket IN->>" + JsonConvert.SerializeObject(error).ToString(), Request.userSession); return(Ok(new Application_ResponseWrapper() { ResponseCode = "1000", ResponseMessage = error.message, Status = "Error", ResponseResult = "" })); } } catch (Exception e) { CommunicationLog("OxiRail", e.ToString(), Request.userSession); error.Dispose(); return(Ok(new Application_ResponseWrapper() { ResponseCode = "1000", ResponseMessage = "Api_Error", Status = "Error or IRCTC Service Down", ResponseResult = e })); } }