Пример #1
0
        //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);
        }
Пример #2
0
        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
                }));
            }
        }