Skip to content

Commit 013c529

Browse files
author
AI Assistant
committed
feat: add PRD documentation for Activity Booking API and AskBot CLI
1 parent 3d7cfa8 commit 013c529

File tree

2 files changed

+357
-54
lines changed

2 files changed

+357
-54
lines changed

docs/activity-bookings.PRD.md

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
---
2+
ID: 'PRACTICA_ACTIVITY-BOOKINGS'
3+
Curso: 'Copilot-CSharp'
4+
Arquetipo: 'CSharp-API'
5+
Autor: 'Alumnos'
6+
---
7+
# PRD — Activity Bookings API
8+
9+
### 1. Resumen Ejecutivo
10+
11+
API REST para gestionar reservas de actividades turísticas. El objetivo es que los alumnos implementen un **CRUD** (Crear, Leer, Actualizar, Borrar) básico, persistan los datos en archivos (JSON, CSV o XML). La solución no requerirá autenticación, servicios de terceros ni el uso de una base de datos.
12+
13+
#### 1.1 Objetivos y Métricas
14+
15+
* Desarrollar una API REST funcional con todos los **endpoints** operativos de forma local.
16+
* Lograr que la aplicación sea ejecutable con el comando `dotnet run`.
17+
* Implementar **tests unitarios** y de integración para validar el comportamiento de la API.
18+
19+
#### 1.2 Audiencia
20+
21+
* **Alumnos:** Para adquirir experiencia práctica.
22+
* **Instructores:** Para utilizar como guía y validar el aprendizaje.
23+
24+
### 2. Alcance
25+
26+
* **Incluido:** API REST con un CRUD básico sobre archivos JSON, CSV o XML.
27+
* **Excluido:** Autenticación, pagos, notificaciones, bases de datos.
28+
29+
#### 2.1 Historias de Usuario
30+
31+
* Como usuario, quiero listar todas las actividades ofertadas.
32+
* Como usuario, quiero ver detalles de una actividad específica.
33+
* Como usuario, quiero crear una nueva reserva para una actividad.
34+
* Como usuario, quiero ver todas mis reservas.
35+
* Como usuario, quiero cancelar una reserva existente.
36+
37+
#### 2.2 Requisitos Funcionales
38+
39+
1. **RF-1:** `GET /activities` - Lista todas las actividades disponibles.
40+
2. **RF-2:** `GET /activities/{id}` - Muestra detalles de una actividad específica.
41+
3. **RF-3:** `POST /bookings` - Crea una nueva reserva.
42+
4. **RF-4:** `GET /bookings` - Lista todas las reservas existentes.
43+
5. **RF-5:** `DELETE /bookings/{id}` - Cancela una reserva.
44+
45+
#### 2.3 Requisitos Funcionales Adicionales
46+
47+
6. **RF-6:** `GET /activities/{id}/bookings` - Lista todas las reservas de una actividad específica.
48+
7. **RF-7:** `PUT /bookings/{id}` - Actualiza una reserva existente.
49+
8. **RF-8:** `GET /activities?status={status}` - Filtra las actividades por estado (ej. `disponible`, `finalizada`).
50+
51+
#### 2.4 Requisitos No Funcionales
52+
53+
* **Simplicidad:** Priorizar la claridad y la simplicidad en la implementación.
54+
* **Diseño:** La API debe seguir un diseño RESTful con rutas claras y consistentes.
55+
* **Rendimiento:** Las respuestas de la API deben ser rápidas, preferiblemente en menos de 1 segundo.
56+
* **Persistencia:** Utilizar ficheros JSON, CSV o XML para almacenar los datos.
57+
* **Tecnologías:** Utilizar Dotnet 9+ y librerías NuGet mínimas.
58+
59+
-----
60+
61+
### 3. Modelo de Datos y Reglas de Negocio
62+
63+
#### 3.1 Esquema de Datos
64+
65+
* **Actividad:**
66+
67+
* `id` (int)
68+
* `nombre` (string)
69+
* `precio` (float)
70+
* `fecha` (datetime)
71+
* `estado` (string: `disponible`, `finalizada`, `cancelada`, `completo`)
72+
* `capacidad` (opcional, int): número máximo de reservas.
73+
* `quorum` (opcional, int): número mínimo de reservas para que la actividad se realice.
74+
75+
* **Reserva:**
76+
77+
* `id` (int)
78+
* `actividadId` (int)
79+
* `nombreCliente` (string)
80+
* `fechaReserva` (datetime)
81+
* `estado` (string: `confirmada`, `cancelada`)
82+
83+
#### 3.2 Relaciones
84+
85+
* Una **Actividad** puede tener múltiples **Reservas**.
86+
* Una **Reserva** está asociada a una única **Actividad**.
87+
88+
#### 3.3 Reglas de Negocio
89+
90+
* No se pueden reservar actividades con estado `finalizada` o `completo`.
91+
* Una reserva no puede ser cancelada si faltan menos de 48 horas para el inicio de la actividad.
92+
* Si se alcanza la `capacidad` máxima de una actividad, su estado debe cambiar a `completo`.
93+
* Si no se alcanza el `quorum` 48 horas antes de la actividad, esta debe cancelarse automáticamente y notificar a los usuarios (simulado con un log).
94+
95+
### 4. Criterios de Aceptación y Riesgos
96+
97+
#### 4.1 Criterios de Aceptación
98+
99+
* Cada endpoint devuelve datos legibles en formato JSON.
100+
* La API puede ser ejecutada con `dotnet run` sin errores.
101+
* Los tests unitarios y de integración pasan correctamente.
102+
* Se manejan adecuadamente los errores de I/O (lectura/escritura de archivos).
103+
104+
#### 4.2 Riesgos
105+
106+
* Errores en la manipulación de ficheros (lectura/escritura) que pueden corromper los datos.
107+
108+
109+
### 5. Datos de Ejemplo (Seed Data)
110+
111+
#### 5.1 Actividades
112+
113+
```json
114+
[
115+
{"id":1, "nombre":"Tour por la ciudad", "precio":50.0, "fecha":"2026-07-15T10:00:00", "estado":"disponible", "capacidad": 10},
116+
{"id":2, "nombre":"Excursión a la montaña", "precio":80.0, "fecha":"2026-07-20T08:00:00", "estado":"disponible", "quorum": 5},
117+
{"id":3, "nombre":"Visita al museo", "precio":30.0, "fecha":"2024-07-18T14:00:00", "estado":"finalizada"}
118+
]
119+
```
120+
121+
```csv
122+
id,nombre,precio,fecha,estado,capacidad,quorum
123+
1,Tour por la ciudad,50.0,2026-07-15T10:00:00,disponible,10,
124+
2,Excursión a la montaña,80.0,2026-07-20T08:00:00,disponible,,5
125+
3,Visita al museo,30.0,2024-07-18T14:00:00,finalizada,,
126+
```
127+
128+
```xml
129+
<actividades>
130+
<actividad>
131+
<id>1</id>
132+
<nombre>Tour por la ciudad</nombre>
133+
<precio>50.0</precio>
134+
<fecha>2026-07-15T10:00:00</fecha>
135+
<estado>disponible</estado>
136+
<capacidad>10</capacidad>
137+
</actividad>
138+
<actividad>
139+
<id>2</id>
140+
<nombre>Excursión a la montaña</nombre>
141+
<precio>80.0</precio>
142+
<fecha>2026-07-20T08:00:00</fecha>
143+
<estado>disponible</estado>
144+
<quorum>5</quorum>
145+
</actividad>
146+
<actividad>
147+
<id>3</id>
148+
<nombre>Visita al museo</nombre>
149+
<precio>30.0</precio>
150+
<fecha>2024-07-18T14:00:00</fecha>
151+
<estado>finalizada</estado>
152+
</actividad>
153+
</actividades>
154+
```
155+
156+
#### 5.2 Reservas
157+
158+
```json
159+
[
160+
{"id":1, "actividadId":1, "nombreCliente":"Juan Pérez", "fechaReserva":"2025-06-01T12:00:00", "estado":"confirmada"},
161+
{"id":2, "actividadId":2, "nombreCliente":"María Gómez", "fechaReserva":"2025-06-02T15:30:00", "estado":"confirmada"},
162+
{"id":3, "actividadId":1, "nombreCliente":"Luis Martínez", "fechaReserva":"2025-06-03T09:45:00", "estado":"cancelada"}
163+
]
164+
```
165+
166+
```csv
167+
id,actividadId,nombreCliente,fechaReserva,estado
168+
1,1,Juan Pérez,2025-06-01T12:00:00,confirmada
169+
2,2,María Gómez,2025-06-02T15:30:00,confirmada
170+
3,1,Luis Martínez,2025-06-03T09:45:00,cancelada
171+
```
172+
173+
```xml
174+
<reservas>
175+
<reserva>
176+
<id>1</id>
177+
<actividadId>1</actividadId>
178+
<nombreCliente>Juan Pérez</nombreCliente>
179+
<fechaReserva>2025-06-01T12:00:00</fechaReserva>
180+
<estado>confirmada</estado>
181+
</reserva>
182+
<reserva>
183+
<id>2</id>
184+
<actividadId>2</actividadId>
185+
<nombreCliente>María Gómez</nombreCliente>
186+
<fechaReserva>2025-06-02T15:30:00</fechaReserva>
187+
<estado>confirmada</estado>
188+
</reserva>
189+
<reserva>
190+
<id>3</id>
191+
<actividadId>1</actividadId>
192+
<nombreCliente>Luis Martínez</nombreCliente>
193+
<fechaReserva>2025-06-03T09:45:00</fechaReserva>
194+
<estado>cancelada</estado>
195+
</reserva>
196+
</reservas>
197+
```

0 commit comments

Comments
 (0)