README.md
# PrioTicket
[![Gem Version](https://badge.fury.io/rb/prioticket.svg)](https://badge.fury.io/rb/prioticket)
[![Dependency Status](https://gemnasium.com/henkm/prioticket.svg)](https://gemnasium.com/henkm/prioticket)
[![Code Climate](https://codeclimate.com/github/henkm/prioticket/badges/gpa.svg)](https://codeclimate.com/github/henkm/prioticket)
This gem works as a simple Ruby wrapper for the PrioTicket API. All the API functions are implemented.
Instead of working with JSON, you work with Ruby Classes and intuitive methods.
**This gem communicates with the API Version 2.4.**
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'prioticket'
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install prioticket
## Configuration
First, obtain an API key from PrioTicket. Set it up like this:
```ruby
PrioTicket::Config.api_key = "MY-API-KEY"
PrioTicket::Config.environment = "test"
```
To use this gem in a Rails project:
```ruby
# config/development.rb
config.prioticcket.api_key = "MY-API-KEY"
config.prioticcket.environment = "test"
```
## Usage
The available classes and methods are listed below. General rule of thumb: all the naming is 100% consistant with the official API Documentation. So use `PrioTicket::Booking.new(booking_name: 'John Doe', booking_email: 'john@example.net')` instead of using the more intuitive `PrioTicket::Booking.new(name: 'John Doe', email: 'john@example.com')`
**Important**: the `Reservation` and `Booking` classes will only create a new reservation/booking in memory, when initialized (e.g. `Reservation.new(...)`). To submit it to the server, call `save`.
### TicketList
To list the available tickets, call:
```ruby
@ticket_list = PrioTicket::TicketList.find(distributor_id: 1234, identifier: "my-unique-order-abc-123")
# Returns an object with a method `tickets`, which returns an array of tickets:
# => <PrioTicket::TicketList @tickets=[##<PrioTicket::Ticket @ticket_id=362, @ticket_title="100 Highlights Cruise", @venue_name="Stromma Nederland", @txt_language="zh,ru,pt,nl,it,fr,de,es,en">, etc...]>
```
### TicketDetails
There are two ways to collect detailed information about a Ticket from the TicketList:
#### Find them using the `find` method
```ruby
@ticket_details = PrioTicket::TicketDetails.find(distributor_id: 1234, ticket_id: 123, identifier: "my-unique-order-abc-123")
# => <PrioTicket::TicketDetails @ticket_id=1234, @ticket_title="100 Highlights Cruise", @short_description="The No.1 Amsterdam canal cruise", etc...>
```
#### Collect them via the parent object
```ruby
@ticket_list = PrioTicket::TicketList.find(distributor_id: 1234, identifier: "my-unique-order-abc-123")
@ticket_details = @ticket_list.first.ticket_details
# => <PrioTicket::TicketDetails @ticket_id=1234, @ticket_title="100 Highlights Cruise", @short_description="The No.1 Amsterdam canal cruise", etc...>
```
So to get the tags from a certain TicketDetails, you can call:
```ruby
@ticket_list.first.ticket_details.tags
# => ["Students", "Wheelchair accessible"]
```
or:
```ruby
@ticket_list.first.ticket_details.company_opening_times.first.start_from
# => "09:00:00"
```
### Availabilities
The same goes for fetching availabilities:
```ruby
@availabilities = PrioTicket::Availabilities.find(distributor_id: 1234, ticket_id: 123, identifier: "my-unique-order-abc-123", from_date: Time.now, until_date: Time.now+(60*60*24*7))
# or:
@availabilities = @ticket_details.availabilities(from_date: Time.now, until_date: Time.now+(60*60*24*7))
```
### Reservation
To reserve a date, use the `PrioTicket::Reservation` class:
```ruby
@reservation = PrioTicket::Reservation.new(
identifier: "my-unique-order-abc-123",
distributor_id: 1234,
ticket_id: 123,
from_date_time: @availabilities.first.from_date_time,
to_date_time: @availabilities.first.to_date_time,
booking_details: [{ticket_type: "ADULT", count: 1}],
distributor_reference: "TEST_RESERVATION"
)
# at this point, the reservation is only made in memory, but not yet
# send to the PrioTicket server. To make in final, call `save`.
@reservation.save
# => #<PrioTicket::Reservation @identifier="test-1522067114", @distributor_id=1234, @ticket_id=123, @from_date_time="2018-03-26T23:00:00+02:00", @to_date_time="2018-03-26T23:59:00+02:00", @booking_details=[#<OpenStruct ticket_type="ADULT", count=1>], @distributor_reference="TEST_RESERVATION", @booking_status="Reserved", @reservation_reference="YYY2067115376XXX">
# Cancel this reservation:
@reservation.cancel
@reservation.booking_status #=> "Cancelled"
```
A direct way to cancel a reservation, is to call the class method `.cancel`:
```ruby
PrioTicket::Reservation.cancel(
distributor_id: 1234,
reservation_reference: "YYY2067115376XXX",
distributor_reference: "TEST_RESERVATION",
identifier: "my-unique-order-abc-123"
)
```
### Booking
To make a booking, please take note of the official API Documentation: for tickets of type_2 and type_3, a `from_date_time` and `to_date_time` must be present.
Example code in section below.
## Full example
All the steps are combined in the example below:
1. Setup the API credentials
2. Get a list of all the tickets/products
3. Find out details of a specific ticket
4. Get availability
5. Make a booking
6. Get status / cancel booking
```ruby
# step 1
# config/development.rb (in case of Ruby on Rails App)
config.prioticcket.api_key = "MY-API-KEY"
config.prioticcket.environment = "test"
# Code below goes in a controller or model, handling the application logic
# step 2
@ticket_list = PrioTicket::TicketList.find(distributor_id: 1234, identifier: "test-123")
# step 3
@ticket = @ticket_list.tickets.first.details
#=> <PrioTicket::TicketDetails> includes name, prices, etc.
# step 4
# method defaults to 3 weeks ahead, you can provice from_date_time and to_date_time
@available_times = @ticket.availabilities
# step 5 - book first available time
@booking = PrioTicket::Booking.new(
identifier: "test-123",
distributor_id: 1234,
booking_type: {
ticket_id: @ticket.ticket_id,
booking_details: [{
ticket_type: "ADULT",
count: 2,
extra_options: []
}]
},
booking_name: "John Doe",
booking_email: "john@example.com",
contact: {
address: {
street: "Amstel 1",
postal_code: "1011 PN",
city: "Amsterdam"
},
phonenumber: "0643210123"
},
notes: ["This is a test booking"],
product_language: "en",
distributor_reference: "ABC123456"
)
# the booking is now made in memory, but not yet final
@booking.confirmed?
# => false
@booking.save
# => <PrioTicket::Booking> object, with status and barcodes
@booking.confirmed?
# => true
@booking.cancel
@booking.confirmed?
# => false
@booking.canceled?
# => true
@booking.booking_reference # => 123ABC456XYZ
# another way to ask for the status of a booking:
@booking = PrioTicket::Booking.get_status(
identifier: @booking.identifier,
distributor_id: DIST_ID,
booking_reference: "123ABC456XYZ",
distributor_reference: "ABC123456
)
@booking.status # => "Cancelled"
```
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/henkm/prioticket.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). No rights can be derrived from using this library.
This gem is made with love by the smart people at [Eskes Media B.V.](https://www.eskesmedia.nl) and [DagjeWeg.NL Tickets](https://www.dagjewegtickets.nl)
PrioTicket is not involved with this project and has no affiliation with Eskes Media B.V.