Saltar al contenido principal

Recursos

Aunque para algunos servicios como una videollamada online con un psicólogo simplemente necesitamos que un profesional esté disponible a cierta hora, existen otros escenarios más complejos en los que son necesarios una serie de recuros para organizar una reserva.

Algunos ejemplos de servicios complejos son:

  • Una clase de tenis necesita al profesor y por lo general necesita una pista de tenis disponible.
  • Una sesión de fisioterapia necesita el fisioterapeuta y una camilla.
  • Una cita con el mecánico donde necesitaremos un hueco en el parking y una grúa y un medidor de emisiones

En en lenguaje de TimeTime esto se puede modelar diciendo que "Este servicio necesita X recursos para poder ser reservado". Para ello tenemos que asociar el event-type a un grupo de recursos concreto utilizando la propiedad resourceRules del event-type.

En el siguiente ejemplo tenemos un event-type que representa una clase de guitarra. Supongamos que además de las otras reglas para dar una clase de guitarra es necesario tener una guitarra para el alumno y dos amplificadores. Esto se modela mediante la propiedad resourceRules de la siguiente forma:

{
// ... otras propiedades del event-type
resourceRules: {
// Este atributo indica que recursos tienen que que estar disponibles para poder hacer una reserva
availableInGroups: [
// Al menos dos unidades del grupo "amplificadores"
{
group: { id: 'amplificadores' }
min: 2,
},
// Al menos una unidad del grupo "amplificadores"
{
group: { id: 'guitarras' }
min: 1,
}
]
}
}

Antes de crear el event type tendremos que crear primero los grupos de recursos y a continuación crear recursos en ellos.

Grupos de recursos

En muchas ocasiones para realizar una reserva los recursos son intercambiables. Por ejemplo para efectuar una reserva en un restaurante es necesario tener disponible una mesa para un determinado número de personas, pero la mesa concreta es irrelevante para el cliente.

Por ello, todas las mesas del restaurante se crean como recursos por separado pero se agrupan en el grupo de recursos mesas.

Siguiendo con nuestro ejemplo anterior tendremos que crear dos grupos de recursos: guitarras y amplificadores.

// Creamos el grupo de recursos guitarras
fetch("https://api.timetime.in/v1/resource-groups/guitarras", {
method: "PUT",
body: JSON.stringify({
resources: [],
name: "Guitarras",
}),
});

// Creamos el grupo de recursos amplificadores
fetch("https://api.timetime.in/v1/resource-groups/guitarras", {
method: "PUT",
body: JSON.stringify({
resources: [],
name: "Amplificadores",
}),
});

Obsérvese que los únicos campos obligatorios son el nombre (name) y el array de recursos individuales (resources). Como de momento no hemos creado los recursos, podemos enviar un array vacío y asociar recursos más tarde.

Recursos individuales

Los recursos individuales representan cada uno de los objetos concretos que vamos a tener asociados a un determinado grupo de recursos. Por ejemplo nuestra escuela de música ha comprado 2 guitarras y 4 amplificadores.

Para crear un recurso hay que utilizar el endpoint correspondiente de la API REST de TimeTime de la siguiente forma:

// Creamos el grupo de recursos amplificadores
fetch("https://api.timetime.in/v1/resources/guitarra-1", {
method: "PUT",
body: JSON.stringify({
name: "Fender Stratocaster",
}),
});

Obsérvese que los únicos campos obligatorios son el ID, incluido en la URL y el nombre. Este mismo proceso lo realizaremos por cada una de nuestras guitarras y amplificadores.

info

Un recurso tiene a su vez un objeto booking rules que permite crear toda una serie de reglas de disponibilidad personalizadas por cada recurso individual.

Por poner un ejemplo, podríamos llegar a tener una guitarra que sólo pueda reservarse los martes de 8 a 3 con dos dias de antelación si hace sol en Barcelona.

Asociando recursos a grupos de recursos.

Uno de los principios de diseño de las APIS de TimeTime es la simplicidad y la idempotencia. Esto quiere decir que para tanto para crear un grupo de recursos como para modificarlo tenemos que realizar la misma petición.

En nuestro caso podemos asociar la guitarra creada en el apartado anterior al grupo de recursos guitarras de la siguiente forma:

fetch("https://api.timetime.in/v1/resource-groups/guitarras", {
method: "PUT",
body: JSON.stringify({
resources: [{ id: "guitarra-1" }],
name: "Guitarras",
}),
});

Otras operaciones sobre recursos.

La especificación de la API sobre como crear, leer borrar y editar recursos y grupos de recursos está disponible en:

https://timetime.readme.io/reference/getresource