Feature/reservations and purchases

## Requests válidos para reservar

### Función que requiere selección de asientos

Request: POST `/api/reservations`

Body:
```json
{"email": "test@test.com", "show_id": 5900, "seats": ["m-3"]}
```

200 OK:

```json
{"id":55,"seats":["b-3"],"share_url":"http://phoneticket.dev/reservations/55", ... }
```

#### Errores "esperados":

422 Invalid Entity (eg. el asiento está tomado):

```json
{"errors":{"seats":["no es válido"]},"id":null,"seats":["b-3"] ... }
```

#### Errores no "esperados":

400 Bad Request (un asiento que no existe)

```json
{"errors":{"seats":["Alguno de los asientos enviados no existe"]}}
```

404 Not Found (usuario o show inexistente)

```json
{"errors":{"show":"Inexistente"}}
```

```json
{"errors":{"user":"Inexistente"}}
```

### Función que *NO* requiere selección de asientos (se modifica desde el backend)

Request: POST `/api/reservations`

Body:
```json
{"email": "test@test.com", "show_id": 59, "seats_count": 2}
```

200 OK:

```json
{"id":55,"seats":["a-2","b-3"],"share_url":"http://phoneticket.dev/reservations/56", ... }
```

#### Errores "esperados":

422 Invalid Entity (eg. no quedan suficientes asientos disponibles):

```json
{"errors":{"seats_count":["No hay suficientes asientos disponibles"]},"id":null, "seats":["b-3"] ... }
```

### El listado completo de atributos que podés mandar para una reserva

* `email`: Email del usuario "logueado" (obligatorio)
* `show_id`: Función en la que querés reservar (obligatorio)
* `seats`: Array de códigos de asientos (obligatorio si la función es numerada)
* `seats_count`: Cantidad de asientos  (obligatorio si la función *no* es numerada)


## Requests válidos para comprar

### Función que requiere selección de asientos

Request: POST `/api/reservations`

Body:
```json
{"email": "test@test.com", "show_id": 5900, "seats": ["m-3"]... payment information}
```

Body:
```json
{"reservation_id": 1, ... payment information}
```

200 OK:

```json
{"id":55,"seats":["b-3"],"share_url":"http://phoneticket.dev/reservations/55", ... }
```

### El listado completo de atributos que podés mandar para una compra

* `email`: Email del usuario "logueado" (obligatorio, salvo que se envíe `reservation_id`)
* `show_id`: Función en la que querés reservar (obligatorio, salvo que se envíe `reservation_id`)
* `reservation_id`: Reserva que se quiere convertir en compra (obligatorio si se quiere convertir una reserva en compra)
* `seats`: Array de códigos de asientos (obligatorio si la función es numerada, excepto que se tenga una reserva)
* `seats_count`: Cantidad de asientos  (obligatorio si la función *no* es numerada, excepto que se tenga una reserva)
* `kids_count`: Cantidad de las reservas que corresponden a chicos (Opcional se va a usar cuando se transforme a compra para calcular el precio)
* `promotion_id`: Id de la promoción que elige el tipo
* `promotion_code`: Código ingresado por el tipo (obligatorio cuando la promoción es por código y tiene que ser igual al código de la promoción)
* `card_number`: Número de tarjeta del tipo (obligatorio para validar promociones de tipo banco, si empieza con 9 es inválida, cualquier otra cosa es válida)
* `card_verification_code`: Código para verificación de la tarjeta
* `card_owner_name`: Nombre del propietario de la tarjeta