Example #1
0
        public async Task <int> SaveTicketSaleAsync(SaleViewModel saleViewModel)
        {
            try
            {
                var buyer = new Buyer()
                {
                    BuyerName           = saleViewModel.Buyer.BuyerName,
                    BuyerLastName       = saleViewModel.Buyer.BuyerLastName,
                    BuyerIdentification = saleViewModel.Buyer.BuyerIdentification,
                    Phone        = saleViewModel.Buyer.Phone,
                    AcountNumber = saleViewModel.Buyer.AcountNumber,
                };

                var saleTicket = new TicketSale()
                {
                    NumTransaction = saleViewModel.TicketSale.NumTransaction,
                    Country        = saleViewModel.TicketSale.Country,
                    UserId         = saleViewModel.User.Id
                };


                var ticket = new Ticket()
                {
                    NumTicked = saleViewModel.Ticket.NumTicked
                };


                return(await _ticketSaleRepository.SaveTicketSaleAsync(saleTicket, buyer, ticket));
            }
            catch
            {
                throw;
            }
        }
        public async Task <ActionResult <TicketSaleModel> > Post(int customerId, [FromBody] TicketRequestModel model)
        {
            try
            {
                var customer = await _repository.GetCustomerAsync(customerId);

                if (customer == null)
                {
                    return(NotFound());
                }

                // Check Ticket Availability
                var result = await _ticketService.ReserveTickets(model.TicketIds);

                if (result)
                {
                    // Process Creditcard (no/op in example)

                    // Finalize Tickets
                    var finalizedTickets = await _ticketService.FinalizeTickets(model.TicketIds);

                    if (finalizedTickets.Success)
                    {
                        // Create the Sales Record

                        var ticketSale = new TicketSale()
                        {
                            Customer          = customer,
                            Completed         = true,
                            ApprovalCode      = "FOOBAR",
                            TransactionNumber = "123456",
                            PaymentType       = "Credit Card",
                            TransactionTotal  = finalizedTickets.Tickets.Sum(t => (decimal)t.Price),
                            Tickets           = finalizedTickets.Tickets.ToArray()
                        };

                        _repository.Add(ticketSale);

                        if (await _repository.SaveAllAsync())
                        {
                            return(CreatedAtRoute(new { customerId = customerId, id = ticketSale.Id }, _mapper.Map <TicketSaleModel>(ticketSale)));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("Failed to create TicketRequest", ex);
            }

            return(BadRequest());
        }
Example #3
0
        private static TicketSaleInfoDto Map(TicketSale ticketSale, Conference conference)
        {
            int?availableTickets = null;
            var totalTickets     = ticketSale.Amount;

            if (totalTickets.HasValue)
            {
                availableTickets = ticketSale.Tickets.Count(x => x.UserId is null);
            }

            return(new TicketSaleInfoDto(ticketSale.Name, new ConferenceDto(conference.Id, conference.Name), ticketSale.Price,
                                         totalTickets, availableTickets, ticketSale.From, ticketSale.To));
        }
Example #4
0
        public async Task <int> SaveTicketSaleAsync(TicketSale ticketResponse, Buyer buyer, Ticket ticket)
        {
            await _dbContext.Buyers.AddAsync(buyer);

            ticketResponse.Buyer = buyer;


            await _dbContext.TicketSales.AddAsync(ticketResponse);

            ticket.TicketSale = ticketResponse;
            await _dbContext.Tickets.AddAsync(ticket);

            return(await _dbContext.SaveChangesAsync());
        }
Example #5
0
        private async Task PurchaseAvailableAsync(TicketSale ticketSale, Guid userId)
        {
            var ticket = ticketSale.Tickets.Where(x => x.UserId is null)
                         .OrderBy(_ => Guid.NewGuid())
                         .FirstOrDefault();

            if (ticket is null)
            {
                throw new TicketsUnavailableException(ticketSale.ConferenceId);
            }

            ticket.Purchase(userId, _dateTimeService.GetDateTimeUtcNow(), ticketSale.Price);
            await _ticketsRepository.UnitOfWork.SaveChangesAsync();
        }
Example #6
0
        /// <summary>
        /// Gets the maximum tickets for sale.
        /// </summary>
        /// <param name="ts">The ts.</param>
        /// <returns></returns>
        /// <remarks>
        /// This method is to avoid multiple roundtrips to the database.
        /// </remarks>
        public int GetMaxTicketsForSale(TicketSale ts)
        {
            int max = 0;

            if (!_buffer.ContainsKey(ts.Id))
            {
                max = ts.GetMaxTicketsForSale(10, 20);
                _buffer.Add(ts.Id, max);
            }
            else
            {
                max = _buffer[ts.Id];
            }
            return(max);
        }
        public TicketSale GetTicketSaleByID(long id)
        {
            TicketSale item = new TicketSale();

            try
            {
                item          = Database.TicketSales.Where(ts => ts.IID == id && ts.IsRemoved == 0).FirstOrDefault();
                item.Supplier = item.Supplier;
                item.Customer = item.Customer;
            }
            catch (Exception ex)
            {
            }
            return(item);
        }
        async Task PersistReddeUssdData(string ticketTypeNumber, string userNumber)
        {
            try
            {
                TicketType ticketType = Misc.GetTicketType(ticketTypeNumber);


                var mobileNumber = "0" + Misc.NormalizePhoneNumber(userNumber);

                //voucher code is same as transaction Reference
                var txRef = Misc.GenerateVoucherCode(mobileNumber);

                var        ticket     = dbContext.Tickets.Where(t => t.Match.MatchDate >= DateTime.Now && t.TicketType == ticketType).OrderBy(i => i.Match.MatchDate).FirstOrDefault();
                TicketSale ticketSale = null;
                if (ticket != null)
                {
                    ticketSale = new TicketSale
                    {
                        BuyerPhone  = Misc.FormatGhanaianPhoneNumberWp(mobileNumber),
                        DateBought  = DateTime.Now,
                        Ticket      = ticket,
                        VoucherCode = txRef
                    };
                    dbContext.TicketsSales.Add(ticketSale);
                }
                else
                {
                    //Take an Action if the ticket is not found
                }


                dbContext.SaveChanges();

                try
                {
                    var transactionId = Misc.GenerateAndSendReddeInvoice(ticketSale, Settings.ReddeSettings).Result;
                    ticketSale.PaymentId = (int)transactionId;
                    dbContext.Entry(ticketSale).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                    dbContext.SaveChanges();
                }
                catch (Exception ex)
                {
                }
            }
            catch (Exception ex)
            {
            }
        }
Example #9
0
        private async Task PurchaseAvailableAsync(TicketSale ticketSale, Guid userId, decimal?price)
        {
            var conferenceId = ticketSale.ConferenceId;
            var ticket       = ticketSale.Tickets.Where(x => x.UserId is null).OrderBy(_ => Guid.NewGuid()).FirstOrDefault();

            if (ticket is null)
            {
                throw new TicketsUnavailableException(conferenceId);
            }

            ticket.Purchase(userId, _clock.CurrentDate(), price);
            await _ticketRepository.UpdateAsync(ticket);

            _logger.LogInformation($"Ticket with ID: '{ticket.Id}' was purchased for the conference: " +
                                   $"'{conferenceId}' by user: '******'.");
        }
Example #10
0
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json", false, true);
            IConfigurationRoot configurationRoot = builder.Build();
            var connectionString = configurationRoot.GetConnectionString("DebugConnectionString");
            var providerName     = configurationRoot.GetSection("AppConfig").GetChildren().Single(item => item.Key == "ProviderName").Value;

            DbProviderFactories.RegisterFactory(providerName, SqlClientFactory.Instance);

            Repository <Flight> repository = new Repository <Flight>(connectionString, providerName);

            TicketSale ticketSale = new TicketSale(connectionString, providerName);

            ticketSale.BuyTicket();
        }
Example #11
0
        public async Task AddAsync(TicketSaleDto dto)
        {
            var conference = await _conferenceRepository.GetAsync(dto.ConferenceId);

            if (conference is null)
            {
                throw new ConferenceNotFoundException(dto.ConferenceId);
            }

            if (conference.ParticipantsLimit.HasValue)
            {
                var ticketsCount = await _ticketRepository.CountForConferenceAsync(conference.Id);

                if (ticketsCount + dto.Amount > conference.ParticipantsLimit)
                {
                    throw new TooManyTicketsException(conference.Id);
                }
            }

            dto.Id = Guid.NewGuid();
            var ticketSale = new TicketSale
            {
                Id           = dto.Id,
                ConferenceId = dto.ConferenceId,
                From         = dto.From,
                To           = dto.To,
                Amount       = dto.Amount,
                Price        = dto.Price,
                Name         = dto.Name
            };
            await _ticketSaleRepository.AddAsync(ticketSale);

            _logger.LogInformation($"Added a ticket sale conference with ID: '{conference.Id}' ({dto.From} - {dto.To}).");

            if (ticketSale.Amount.HasValue)
            {
                _logger.LogInformation($"Generating {ticketSale.Amount} tickets for conference with ID: '{conference.Id}'...");
                var tickets = new List <Ticket>();
                for (var i = 0; i < ticketSale.Amount; i++)
                {
                    var ticket = _ticketGenerator.Generate(conference.Id, ticketSale.Id, ticketSale.Price);
                    tickets.Add(ticket);
                }

                await _ticketRepository.AddManyAsync(tickets);
            }
        }
        public void ExecuteReservationCommand()
        {
            Excursion  excursion  = Repositories.RExcursions.FindById(ExcursionList[SelectedIndex].Id);
            TicketSale ticketSale = Repositories.RTicketSales.FindAll(x => x.Excursion.Id == excursion.Id).FirstOrDefault();

            if (CurrentClient.Login != null)
            {
                Repositories.RTicketSaleClients.Add(new TicketSaleClient()
                {
                    Client = CurrentClient, TicketSale = ticketSale, TicketAmount = (int)TicketAmount
                });
            }
            else
            {
                Repositories.RTicketSaleGuests.Add(new TicketSaleGuest()
                {
                    Guest = CurrentGuest, TicketSale = ticketSale, TicketAmount = (int)TicketAmount
                });
            }
        }
Example #13
0
        public static async Task <int?> GenerateAndSendReddeInvoice(TicketSale ticketSale, ReddeSettingsDTO reddeSettings)
        {
            try
            {
                ReddeRequest request = new ReddeRequest
                {
                    Amount          = ticketSale.Ticket.Price,
                    Appid           = reddeSettings.AppId,
                    Clientreference = ticketSale.BuyerPhone,
                    Clienttransid   = ticketSale.VoucherCode,
                    Description     = "Ticket Sale for " + ticketSale.DateBought,
                    Nickname        = reddeSettings.NickName,
                    Paymentoption   = getReddePayOption(ticketSale.BuyerPhone),
                    Walletnumber    = FormatGhanaianPhoneNumberWp(ticketSale.BuyerPhone)
                };

                var httpClient = new HttpClient();


                var data = JsonConvert.SerializeObject(request, new JsonSerializerSettings {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });
                var stringContent = new StringContent(data);
                httpClient.DefaultRequestHeaders.Add("apikey", reddeSettings.ApiKey);
                stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var responseMessage = await httpClient.PostAsync("https://api.reddeonline.com/v1/receive", stringContent);

                var contentString = await responseMessage.Content.ReadAsStringAsync();

                ReddeInitialResponse response = JsonConvert.DeserializeObject <ReddeInitialResponse>(contentString);

                return(response.Transactionid);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"GenerateReddeToken {ex.Message}");
                return(null);
            }
        }
        public async Task AddAsync(TicketSaleDto dto)
        {
            var conference = await _conferenceRepository.GetAsync(dto.ConferenceId);

            if (conference is null)
            {
                throw new ConferenceNotFoundException(dto.ConferenceId);
            }

            if (conference.ParticipantsLimit.HasValue)
            {
                var ticketsCount = await _ticketRepository.CountForConferenceAsync(conference.Id);

                if (ticketsCount + dto.Amount > conference.ParticipantsLimit)
                {
                    throw new TooManyTicketsException(conference.Id);
                }
            }

            var ticketSale = new TicketSale(dto.ConferenceId, dto.Name, dto.Price, dto.Amount, dto.From, dto.To);

            _ticketSaleRepository.Add(ticketSale);
            await _ticketSaleRepository.UnitOfWork.SaveChangesAsync();

            if (ticketSale.Amount.HasValue)
            {
                var tickets = new List <Ticket>();
                for (var i = 0; i < ticketSale.Amount; i++)
                {
                    var ticket = _ticketsFactory.Generate(conference.Id, ticketSale.Price, ticketSale);
                    tickets.Add(ticket);
                }

                _ticketRepository.AddMany(tickets);
                await _ticketRepository.UnitOfWork.SaveChangesAsync();
            }
        }
Example #15
0
 public async Task DeleteAsync(TicketSale ticketSale)
 {
     _ticketSales.Remove(ticketSale);
     await _context.SaveChangesAsync();
 }
 public void Add(TicketSale ticketSale)
 {
     _context.TicketSales.Add(ticketSale);
 }
 public void Delete(TicketSale ticketSale)
 {
     _context.TicketSales.Remove(ticketSale);
 }
Example #18
0
 public Ticket Generate(Guid conferenceId, decimal?price, TicketSale ticketSale)
 {
     return(new(conferenceId, price, ticketSale, _dateTimeService.GetDateTimeUtcNow()));
 }
Example #19
0
 public static string GetTicketPurchaseMessage(TicketSale ticketSale)
 {
     return($"Hello {ticketSale.BuyerPhone}, your ticket Number for {ticketSale.Ticket.Match.Name} bought on {ticketSale.DateBought} is {ticketSale.VoucherCode}");
 }
Example #20
0
 public async Task UpdateAsync(TicketSale ticketSale)
 {
     _ticketSales.Update(ticketSale);
     await _context.SaveChangesAsync();
 }
Example #21
0
        public async Task AddAsync(TicketSale ticketSale)
        {
            await _ticketSales.AddAsync(ticketSale);

            await _context.SaveChangesAsync();
        }