spr migrated books, and tester
This commit is contained in:
114
atlas/book/gherkin-samples/CLAUDE.md
Normal file
114
atlas/book/gherkin-samples/CLAUDE.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# Gherkin Sample Book
|
||||
|
||||
## Purpose
|
||||
**SAMPLE DATA** - Example BDD/Gherkin `.feature` files for demonstration and testing purposes. These show realistic examples of how feature files will look when actual ops templates are defined.
|
||||
|
||||
Use these to:
|
||||
- Understand Gherkin structure and patterns
|
||||
- Compare Spanish vs English keywords
|
||||
- Test tooling (behave, pytest-bdd, playwright-bdd)
|
||||
- Demo the feature-flow pipeline
|
||||
|
||||
Real feature files will be derived from validated ops templates.
|
||||
|
||||
## Structure
|
||||
|
||||
```
|
||||
gherkin-sample/
|
||||
├── es/ # Spanish keywords (Dado/Cuando/Entonces)
|
||||
│ ├── pet-owner/
|
||||
│ ├── veterinarian/
|
||||
│ └── backoffice/
|
||||
└── en/ # English keywords (Given/When/Then)
|
||||
├── pet-owner/
|
||||
├── veterinarian/
|
||||
└── backoffice/
|
||||
```
|
||||
|
||||
## Language Versions
|
||||
|
||||
**Spanish Keywords (`es/`)**
|
||||
- Uses `# language: es` directive
|
||||
- Keywords: Característica, Escenario, Dado, Cuando, Entonces, Y, Pero
|
||||
- Keywords: Esquema del escenario, Ejemplos, Antecedentes, Regla
|
||||
- For teams preferring Spanish BDD syntax
|
||||
|
||||
**English Keywords (`en/`)**
|
||||
- Standard Gherkin syntax
|
||||
- Keywords: Feature, Scenario, Given, When, Then, And, But
|
||||
- Keywords: Scenario Outline, Examples, Background, Rule
|
||||
- Same Spanish content, different keywords
|
||||
|
||||
## Feature Files
|
||||
|
||||
### Pet Owner (5 files)
|
||||
| File | Description |
|
||||
|------|-------------|
|
||||
| 01-registro.feature | User registration flow |
|
||||
| 02-reservar-turno.feature | Book appointment (turnero) |
|
||||
| 03-gestion-mascotas.feature | Pet management |
|
||||
| 04-pago-turno.feature | Payment flow |
|
||||
| 05-historial-medico.feature | Medical history |
|
||||
|
||||
### Veterinarian (5 files)
|
||||
| File | Description |
|
||||
|------|-------------|
|
||||
| 01-aceptar-solicitud.feature | Accept/reject requests |
|
||||
| 02-gestion-agenda.feature | Schedule management |
|
||||
| 03-realizar-visita.feature | Conduct visit & report |
|
||||
| 04-zonas-cobertura.feature | Coverage area management |
|
||||
| 05-historial-pacientes.feature | Patient history |
|
||||
|
||||
### Backoffice (5 files)
|
||||
| File | Description |
|
||||
|------|-------------|
|
||||
| 01-gestion-solicitudes.feature | Request management |
|
||||
| 02-gestion-usuarios.feature | User management |
|
||||
| 03-gestion-servicios.feature | Services & pricing |
|
||||
| 04-reembolsos.feature | Refund process |
|
||||
| 05-reportes.feature | Reports & dashboard |
|
||||
|
||||
## Gherkin Patterns Used
|
||||
|
||||
### Basic
|
||||
- Feature, Scenario, Given/When/Then
|
||||
|
||||
### Intermediate
|
||||
- **Background**: Shared setup for all scenarios
|
||||
- **Scenario Outline + Examples**: Test variations without duplication
|
||||
- **Data Tables**: Multiple items in one step
|
||||
|
||||
### Advanced
|
||||
- **Rule**: Group related scenarios
|
||||
- **Doc Strings**: Large text blocks (diagnoses, reports)
|
||||
- **Tags**: For filtering (@smoke, @critical, @wip)
|
||||
|
||||
## Comment Headers
|
||||
|
||||
Each file includes metadata comments:
|
||||
```gherkin
|
||||
# Fuente: album/book/ops-templates/...
|
||||
# Drive: [Google Drive reference]
|
||||
# Tests Backend: pytest tests/contracts/...
|
||||
# Tests Frontend: npx playwright test ...
|
||||
```
|
||||
|
||||
## Tools
|
||||
|
||||
To run/validate these files:
|
||||
|
||||
**Python**
|
||||
- behave
|
||||
- pytest-bdd
|
||||
|
||||
**JavaScript/TypeScript**
|
||||
- playwright-bdd
|
||||
- jest-cucumber
|
||||
|
||||
**IDE Support**
|
||||
- VS Code: Cucumber (Gherkin) Full Support extension
|
||||
- JetBrains: Built-in Gherkin plugin
|
||||
|
||||
## Source Templates
|
||||
|
||||
Sample ops templates at: `album/book/ops-templates-sample/`
|
||||
161
atlas/book/gherkin-samples/detail.html
Normal file
161
atlas/book/gherkin-samples/detail.html
Normal file
@@ -0,0 +1,161 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ filename }} - Gherkin</title>
|
||||
<link rel="stylesheet" href="/static/prism/prism-tomorrow.min.css">
|
||||
<link rel="stylesheet" href="/static/prism/prism-line-numbers.min.css">
|
||||
<style>
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body {
|
||||
font-family: system-ui, -apple-system, sans-serif;
|
||||
background: #0f172a;
|
||||
color: #e2e8f0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.container { max-width: 900px; margin: 0 auto; padding: 2rem 1rem; }
|
||||
header { margin-bottom: 2rem; }
|
||||
.breadcrumb { font-size: 0.9rem; color: #64748b; margin-bottom: 0.5rem; }
|
||||
.breadcrumb a { color: #818cf8; text-decoration: none; }
|
||||
.breadcrumb a:hover { text-decoration: underline; }
|
||||
h1 { font-size: 1.5rem; color: #e2e8f0; }
|
||||
.meta {
|
||||
display: flex;
|
||||
gap: 0.75rem;
|
||||
margin-top: 0.75rem;
|
||||
font-size: 0.85rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.meta span {
|
||||
background: #1e293b;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border-radius: 4px;
|
||||
color: #94a3b8;
|
||||
}
|
||||
.meta .lang-es { border-left: 3px solid #f59e0b; }
|
||||
.meta .lang-en { border-left: 3px solid #3b82f6; }
|
||||
.meta .sample { background: #422006; color: #fbbf24; }
|
||||
.content {
|
||||
background: #1e293b;
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.content-header {
|
||||
background: #334155;
|
||||
padding: 0.75rem 1.5rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
.content-header .filename { color: #94a3b8; }
|
||||
.content-header .copy-btn {
|
||||
background: #475569;
|
||||
border: none;
|
||||
color: #e2e8f0;
|
||||
padding: 0.35rem 0.75rem;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
.content-header .copy-btn:hover { background: #64748b; }
|
||||
pre[class*="language-"] {
|
||||
margin: 0;
|
||||
border-radius: 0;
|
||||
font-size: 0.85rem;
|
||||
line-height: 1.7;
|
||||
}
|
||||
code[class*="language-"] {
|
||||
font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
|
||||
}
|
||||
.sidebar {
|
||||
margin-top: 2rem;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 1rem;
|
||||
}
|
||||
.sidebar-box {
|
||||
background: #1e293b;
|
||||
border-radius: 8px;
|
||||
padding: 1rem;
|
||||
}
|
||||
.sidebar-box h3 { font-size: 0.8rem; color: #64748b; text-transform: uppercase; margin-bottom: 0.75rem; }
|
||||
.sidebar-box a {
|
||||
display: block;
|
||||
color: #818cf8;
|
||||
text-decoration: none;
|
||||
padding: 0.35rem 0;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.sidebar-box a:hover { text-decoration: underline; }
|
||||
footer {
|
||||
margin-top: 2rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid #334155;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
footer a { color: #818cf8; text-decoration: none; }
|
||||
footer a:hover { text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
<div class="breadcrumb">
|
||||
<a href="/">Album</a> / <a href="/book/gherkin/">Gherkin</a> / {{ lang }} / {{ user_type }}
|
||||
</div>
|
||||
<h1>{{ filename.replace('.feature', '').replace('-', ' ').title() }}</h1>
|
||||
<div class="meta">
|
||||
<span class="lang-{{ lang }}">{{ 'Espanol' if lang == 'es' else 'English' }}</span>
|
||||
<span>{{ user_type }}</span>
|
||||
<span class="sample">Sample</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
<div class="content-header">
|
||||
<span class="filename">{{ filename }}</span>
|
||||
<button class="copy-btn" onclick="copyContent()">Copy</button>
|
||||
</div>
|
||||
<pre class="line-numbers"><code id="gherkin-content" class="language-gherkin">{{ content }}</code></pre>
|
||||
</div>
|
||||
|
||||
<div class="sidebar">
|
||||
<div class="sidebar-box">
|
||||
<h3>Source</h3>
|
||||
<a href="/book/ops-templates/{{ user_type }}/{{ filename.replace('.feature', '.md') }}">Ops Template</a>
|
||||
</div>
|
||||
<div class="sidebar-box">
|
||||
<h3>Other Language</h3>
|
||||
{% if lang == 'es' %}
|
||||
<a href="/book/gherkin/en/{{ user_type }}/{{ filename }}">English Version</a>
|
||||
{% else %}
|
||||
<a href="/book/gherkin/es/{{ user_type }}/{{ filename }}">Spanish Version</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="sidebar-box">
|
||||
<h3>Pipeline</h3>
|
||||
<a href="/book/feature-flow/">Feature Flow</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<a href="/book/gherkin/">← All Gherkin Files</a>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="/static/prism/prism.min.js"></script>
|
||||
<script src="/static/prism/prism-gherkin.min.js"></script>
|
||||
<script src="/static/prism/prism-line-numbers.min.js"></script>
|
||||
<script>
|
||||
function copyContent() {
|
||||
const content = document.getElementById('gherkin-content').textContent;
|
||||
navigator.clipboard.writeText(content);
|
||||
const btn = document.querySelector('.copy-btn');
|
||||
btn.textContent = 'Copied!';
|
||||
setTimeout(() => btn.textContent = 'Copy', 2000);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,104 @@
|
||||
# Fuente: album/book/ops-templates/backoffice/01-gestion-solicitudes.md
|
||||
# Drive: 05. ATC - Operaciones/Procedimientos
|
||||
# Tests Backend: pytest tests/contracts/solicitudes/test_service_requests.py
|
||||
# Tests Frontend: npx playwright test admin-requests.spec.ts
|
||||
|
||||
Feature: Gestion de solicitudes de servicio
|
||||
|
||||
Como administrador del backoffice
|
||||
Quiero gestionar todas las solicitudes del sistema
|
||||
Para asegurar que se atiendan correctamente
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como administrador
|
||||
And estoy en la seccion "Solicitudes" del backoffice
|
||||
|
||||
# ============================================
|
||||
# VER Y FILTRAR SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver listado de todas las solicitudes
|
||||
When cargo la pagina de solicitudes
|
||||
Then deberia ver un listado paginado
|
||||
And cada solicitud deberia mostrar:
|
||||
| campo |
|
||||
| ID |
|
||||
| Dueno |
|
||||
| Mascota |
|
||||
| Servicios |
|
||||
| Estado |
|
||||
| Fecha |
|
||||
|
||||
Scenario Outline: Filtrar solicitudes por estado
|
||||
When filtro por estado "<estado>"
|
||||
Then solo deberia ver solicitudes con estado "<estado>"
|
||||
|
||||
Examples:
|
||||
| estado |
|
||||
| Pendiente |
|
||||
| Coordinado |
|
||||
| Pagado |
|
||||
| Completado |
|
||||
| Cancelado |
|
||||
|
||||
# ============================================
|
||||
# ASIGNAR VETERINARIO MANUALMENTE
|
||||
# ============================================
|
||||
|
||||
Scenario: Asignar veterinario a solicitud pendiente
|
||||
Given que hay una solicitud pendiente en "Palermo"
|
||||
And no fue aceptada por ningun veterinario
|
||||
When abro el detalle de la solicitud
|
||||
And hago click en "Asignar veterinario"
|
||||
Then deberia ver lista de veterinarios con cobertura en Palermo
|
||||
|
||||
When selecciono "Dra. Garcia"
|
||||
And selecciono fecha "15 de enero" hora "10:00"
|
||||
And confirmo la asignacion
|
||||
Then la solicitud deberia pasar a estado "Coordinado"
|
||||
And deberia estar asignada a Dra. Garcia
|
||||
And el dueno deberia recibir notificacion
|
||||
And el veterinario deberia recibir notificacion
|
||||
|
||||
# ============================================
|
||||
# CAMBIAR ESTADO MANUALMENTE
|
||||
# ============================================
|
||||
|
||||
Scenario: Cambiar estado de solicitud
|
||||
Given que hay una solicitud en estado "Coordinado"
|
||||
And el pago se proceso pero el webhook fallo
|
||||
When abro la solicitud
|
||||
And hago click en "Cambiar estado"
|
||||
And selecciono "Pagado"
|
||||
And ingreso motivo "Pago confirmado manualmente - ID MP: 12345"
|
||||
And confirmo el cambio
|
||||
Then la solicitud deberia pasar a "Pagado"
|
||||
And el cambio deberia registrarse en el historial
|
||||
|
||||
Rule: Solo ciertos cambios de estado son validos
|
||||
|
||||
Scenario: No puedo volver a estado anterior
|
||||
Given que hay una solicitud en estado "Completado"
|
||||
When intento cambiar el estado a "Pagado"
|
||||
Then deberia ver error "No se puede volver a un estado anterior"
|
||||
|
||||
Scenario: Puedo cancelar desde cualquier estado
|
||||
Given que hay una solicitud en estado "Coordinado"
|
||||
When cambio el estado a "Cancelado"
|
||||
And ingreso motivo de cancelacion
|
||||
Then la solicitud deberia cancelarse
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Reasignar veterinario
|
||||
Given que hay una solicitud asignada a "Dr. Lopez"
|
||||
And Dr. Lopez no puede asistir
|
||||
When abro la solicitud
|
||||
And hago click en "Reasignar"
|
||||
And selecciono otro veterinario
|
||||
And confirmo
|
||||
Then Dr. Lopez deberia ser notificado de la desasignacion
|
||||
And el nuevo vet deberia ser notificado
|
||||
And el dueno deberia ser notificado del cambio
|
||||
@@ -0,0 +1,88 @@
|
||||
# Fuente: album/book/ops-templates/backoffice/02-gestion-usuarios.md
|
||||
# Drive: 05. ATC - Operaciones/Procedimientos
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_pet_owners.py
|
||||
# Tests Frontend: npx playwright test admin-users.spec.ts
|
||||
|
||||
Feature: Gestion de usuarios
|
||||
|
||||
Como administrador del backoffice
|
||||
Quiero gestionar duenos y veterinarios
|
||||
Para mantener la base de usuarios actualizada
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como administrador
|
||||
And estoy en el backoffice
|
||||
|
||||
# ============================================
|
||||
# GESTION DE DUENOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Buscar dueno de mascota
|
||||
Given que estoy en la seccion "Duenos"
|
||||
When busco "maria@ejemplo.com"
|
||||
Then deberia ver a Maria Garcia en los resultados
|
||||
And deberia ver sus mascotas listadas
|
||||
|
||||
Scenario: Ver perfil completo de dueno
|
||||
Given que encontre a "Maria Garcia"
|
||||
When hago click en su perfil
|
||||
Then deberia ver:
|
||||
| seccion | contenido |
|
||||
| Datos personales | Nombre, email, telefono |
|
||||
| Direcciones | Direcciones registradas |
|
||||
| Mascotas | Lista de mascotas |
|
||||
| Historial | Solicitudes anteriores |
|
||||
|
||||
Scenario: Editar datos de dueno
|
||||
Given que estoy viendo el perfil de un dueno
|
||||
When hago click en "Editar"
|
||||
And cambio el telefono a "1155559999"
|
||||
And guardo los cambios
|
||||
Then el telefono deberia actualizarse
|
||||
|
||||
# ============================================
|
||||
# GESTION DE VETERINARIOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Agregar nuevo veterinario
|
||||
Given que estoy en la seccion "Veterinarios"
|
||||
When hago click en "Agregar veterinario"
|
||||
And completo los datos:
|
||||
| campo | valor |
|
||||
| Nombre | Dr. Juan Perez |
|
||||
| Matricula | MV-12345 |
|
||||
| Email | jperez@ejemplo.com |
|
||||
| Telefono | 1155551234 |
|
||||
And selecciono zonas de cobertura:
|
||||
| zona |
|
||||
| Palermo |
|
||||
| Recoleta |
|
||||
And genero credenciales de acceso
|
||||
And guardo
|
||||
Then deberia crearse el veterinario
|
||||
And deberia poder loguearse con sus credenciales
|
||||
|
||||
Scenario: Intentar desactivar veterinario con citas pendientes
|
||||
Given que el veterinario "Dra. Garcia" tiene 3 citas pendientes
|
||||
When intento desactivarla
|
||||
Then deberia ver advertencia "Tiene 3 citas pendientes"
|
||||
And deberia ver opciones:
|
||||
| opcion |
|
||||
| Reasignar citas y desactivar |
|
||||
| Cancelar |
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Fusionar cuentas duplicadas
|
||||
Given que hay dos cuentas para el mismo dueno:
|
||||
| cuenta | email | mascotas |
|
||||
| Cuenta1 | maria@gmail.com | Luna |
|
||||
| Cuenta2 | maria@hotmail.com | Rocky |
|
||||
When selecciono ambas cuentas
|
||||
And hago click en "Fusionar"
|
||||
And elijo Cuenta1 como principal
|
||||
And confirmo
|
||||
Then deberia existir solo Cuenta1
|
||||
And deberia tener ambas mascotas
|
||||
@@ -0,0 +1,91 @@
|
||||
# Fuente: album/book/ops-templates/backoffice/03-gestion-servicios.md
|
||||
# Drive: 08. IT y Producto/Catalogo Servicios
|
||||
# Tests Backend: pytest tests/contracts/productos/test_services.py
|
||||
# Tests Frontend: npx playwright test admin-services.spec.ts
|
||||
|
||||
Feature: Gestion de servicios y precios
|
||||
|
||||
Como administrador
|
||||
Quiero gestionar el catalogo de servicios
|
||||
Para mantener la oferta actualizada
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como administrador
|
||||
And estoy en la seccion "Servicios"
|
||||
|
||||
# ============================================
|
||||
# VER CATALOGO DE SERVICIOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver listado de servicios
|
||||
When cargo la pagina de servicios
|
||||
Then deberia ver todos los servicios organizados por categoria
|
||||
And cada servicio deberia mostrar:
|
||||
| campo |
|
||||
| Nombre |
|
||||
| Categoria |
|
||||
| Tipo mascota |
|
||||
| Precio actual |
|
||||
| Estado |
|
||||
|
||||
# ============================================
|
||||
# CREAR Y EDITAR SERVICIOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Agregar nuevo servicio
|
||||
When hago click en "Agregar servicio"
|
||||
And completo los datos:
|
||||
| campo | valor |
|
||||
| Nombre | Vacuna Quintuple Felina |
|
||||
| Descripcion | Protege contra 5 enfermedades |
|
||||
| Categoria | Vacunacion |
|
||||
| Tipo mascota | Gato |
|
||||
| Precio | 15000 |
|
||||
And guardo el servicio
|
||||
Then el servicio deberia crearse
|
||||
And deberia aparecer en el turnero para gatos
|
||||
|
||||
Scenario: Desactivar servicio
|
||||
Given que existe el servicio "Servicio Antiguo"
|
||||
When abro el servicio
|
||||
And hago click en "Desactivar"
|
||||
And confirmo
|
||||
Then el servicio no deberia aparecer en el turnero
|
||||
|
||||
# ============================================
|
||||
# GESTION DE PRECIOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Actualizar precio de servicio
|
||||
Given que "Consulta clinica" tiene precio actual de 10000
|
||||
When abro el servicio
|
||||
And voy a la seccion "Precios"
|
||||
And hago click en "Agregar precio"
|
||||
And ingreso nuevo precio 12000
|
||||
And selecciono fecha de vigencia "01/02/2024"
|
||||
And guardo
|
||||
Then deberia crearse el nuevo precio
|
||||
And el precio anterior deberia quedar en historial
|
||||
|
||||
Rule: El precio se congela al crear la solicitud
|
||||
|
||||
Scenario: Cambio de precio no afecta solicitudes existentes
|
||||
Given que hay una solicitud pendiente con "Consulta clinica" a 10000
|
||||
When cambio el precio de "Consulta clinica" a 12000
|
||||
Then la solicitud deberia mantener el precio de 10000
|
||||
|
||||
# ============================================
|
||||
# CONFIGURAR COMBOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Crear combo de servicios
|
||||
When voy a "Combos"
|
||||
And hago click en "Agregar combo"
|
||||
And configuro:
|
||||
| campo | valor |
|
||||
| Nombre | Plan Preventivo Felino |
|
||||
| Servicios | Vacunacion, Desparasitacion |
|
||||
| Precio combo | 25000 |
|
||||
And guardo
|
||||
Then el combo deberia crearse
|
||||
And deberia aplicarse automaticamente en el turnero
|
||||
@@ -0,0 +1,86 @@
|
||||
# Fuente: album/book/ops-templates/backoffice/04-reembolsos.md
|
||||
# Drive: 07. Finanzas y contabilidad/Reembolsos
|
||||
# Tests Backend: pytest tests/contracts/payments/test_refunds.py
|
||||
# Tests Frontend: npx playwright test admin-refunds.spec.ts
|
||||
|
||||
Feature: Proceso de reembolso
|
||||
|
||||
Como administrador
|
||||
Quiero procesar reembolsos de pagos
|
||||
Para resolver cancelaciones y problemas
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como administrador
|
||||
And estoy en el backoffice
|
||||
|
||||
# ============================================
|
||||
# PROCESAR REEMBOLSO
|
||||
# ============================================
|
||||
|
||||
Scenario: Reembolso total exitoso
|
||||
Given que hay una solicitud pagada por 15000
|
||||
And la visita fue cancelada
|
||||
When abro la solicitud
|
||||
And hago click en "Procesar reembolso"
|
||||
And selecciono "Reembolso total"
|
||||
And ingreso motivo "Cancelacion por indisponibilidad del veterinario"
|
||||
And confirmo el reembolso
|
||||
Then deberia enviarse la solicitud de reembolso a Mercado Pago
|
||||
And deberia ver mensaje "Reembolso en proceso"
|
||||
And el dueno deberia recibir email de confirmacion
|
||||
|
||||
Scenario: Reembolso parcial
|
||||
Given que hay una solicitud pagada por 20000
|
||||
And solo se realizo parte del servicio
|
||||
When proceso reembolso parcial por 10000
|
||||
And ingreso motivo "Servicio parcialmente completado"
|
||||
And confirmo
|
||||
Then deberia procesarse reembolso por 10000
|
||||
And deberia quedar registro del monto reembolsado
|
||||
|
||||
# ============================================
|
||||
# TIEMPOS DE ACREDITACION
|
||||
# ============================================
|
||||
|
||||
Scenario Outline: Informar tiempo de acreditacion segun metodo
|
||||
Given que el pago original fue con "<metodo>"
|
||||
When proceso el reembolso
|
||||
Then deberia informar al usuario:
|
||||
"""
|
||||
El reembolso se acreditara en <tiempo>
|
||||
"""
|
||||
|
||||
Examples:
|
||||
| metodo | tiempo |
|
||||
| Tarjeta credito | 1-2 resumenes de cuenta |
|
||||
| Tarjeta debito | 5-10 dias habiles |
|
||||
| Dinero en cuenta MP | forma inmediata |
|
||||
|
||||
# ============================================
|
||||
# VALIDACIONES
|
||||
# ============================================
|
||||
|
||||
Scenario: No puedo reembolsar mas del monto pagado
|
||||
Given que hay una solicitud pagada por 15000
|
||||
When intento reembolsar 20000
|
||||
Then deberia ver error "El monto supera el pago original"
|
||||
|
||||
Scenario: Reembolso duplicado
|
||||
Given que ya procese un reembolso total para una solicitud
|
||||
When intento procesar otro reembolso
|
||||
Then deberia ver error "Esta solicitud ya fue reembolsada"
|
||||
|
||||
Scenario: Pago fuera de plazo de reembolso
|
||||
Given que hay un pago de hace 200 dias
|
||||
When intento reembolsar
|
||||
Then deberia ver advertencia "Fuera de plazo de reembolso de MP (180 dias)"
|
||||
|
||||
# ============================================
|
||||
# SEGUIMIENTO
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver estado del reembolso
|
||||
Given que procese un reembolso hace 2 dias
|
||||
When veo el detalle del reembolso
|
||||
Then deberia ver el estado actual en Mercado Pago
|
||||
And deberia ver historial de estados
|
||||
97
atlas/book/gherkin-samples/en/backoffice/05-reportes.feature
Normal file
97
atlas/book/gherkin-samples/en/backoffice/05-reportes.feature
Normal file
@@ -0,0 +1,97 @@
|
||||
# Fuente: album/book/ops-templates/backoffice/05-reportes.md
|
||||
# Drive: 07. Finanzas y contabilidad/Reportes
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_stats.py
|
||||
# Tests Frontend: npx playwright test admin-reports.spec.ts
|
||||
|
||||
Feature: Reportes y dashboard
|
||||
|
||||
Como administrador o gerente
|
||||
Quiero ver metricas y generar reportes
|
||||
Para tomar decisiones informadas
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como administrador
|
||||
And estoy en el backoffice
|
||||
|
||||
# ============================================
|
||||
# DASHBOARD
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver dashboard principal
|
||||
When accedo al dashboard
|
||||
Then deberia ver metricas resumidas:
|
||||
| metrica | periodo |
|
||||
| Solicitudes nuevas | Hoy |
|
||||
| Visitas completadas | Semana |
|
||||
| Ingresos | Mes |
|
||||
| Veterinarios activos | Actual |
|
||||
| Tasa de conversion | Mes |
|
||||
|
||||
Scenario: Ver grafico de tendencia
|
||||
When veo el grafico de solicitudes
|
||||
Then deberia ver la evolucion de los ultimos 30 dias
|
||||
And deberia poder comparar con periodo anterior
|
||||
|
||||
# ============================================
|
||||
# REPORTE DE SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Scenario: Generar reporte de solicitudes
|
||||
When voy a "Reportes" -> "Solicitudes"
|
||||
And selecciono periodo "Enero 2024"
|
||||
And hago click en "Generar"
|
||||
Then deberia ver tabla con solicitudes del periodo
|
||||
And deberia ver totales por estado
|
||||
|
||||
Scenario: Filtrar reporte por multiples criterios
|
||||
When genero reporte con filtros:
|
||||
| filtro | valor |
|
||||
| Periodo | Enero 2024 |
|
||||
| Zona | Palermo |
|
||||
| Veterinario | Dra. Garcia |
|
||||
Then deberia ver solo solicitudes que cumplan todos los criterios
|
||||
|
||||
# ============================================
|
||||
# REPORTE DE INGRESOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver ingresos por periodo
|
||||
When voy a "Reportes" -> "Ingresos"
|
||||
And selecciono "Ultimo trimestre"
|
||||
Then deberia ver:
|
||||
| dato |
|
||||
| Ingresos totales |
|
||||
| Cantidad de pagos |
|
||||
| Ticket promedio |
|
||||
| Reembolsos realizados |
|
||||
| Ingreso neto |
|
||||
|
||||
Scenario: Ingresos agrupados por veterinario
|
||||
When agrupo el reporte por "Veterinario"
|
||||
Then deberia ver para cada vet:
|
||||
| dato |
|
||||
| Visitas completadas |
|
||||
| Ingresos generados |
|
||||
| Porcentaje del total |
|
||||
|
||||
# ============================================
|
||||
# EXPORTACION
|
||||
# ============================================
|
||||
|
||||
Scenario Outline: Exportar reporte en diferentes formatos
|
||||
Given que tengo un reporte generado
|
||||
When hago click en "Exportar"
|
||||
And selecciono formato "<formato>"
|
||||
Then deberia descargarse el archivo en formato <formato>
|
||||
|
||||
Examples:
|
||||
| formato |
|
||||
| CSV |
|
||||
| Excel |
|
||||
| PDF |
|
||||
|
||||
Scenario: Exportar reporte grande de forma asincrona
|
||||
Given que genere un reporte con mas de 10000 registros
|
||||
When hago click en "Exportar"
|
||||
Then deberia ver mensaje "Generando exportacion..."
|
||||
And deberia recibir notificacion cuando este listo
|
||||
91
atlas/book/gherkin-samples/en/pet-owner/01-registro.feature
Normal file
91
atlas/book/gherkin-samples/en/pet-owner/01-registro.feature
Normal file
@@ -0,0 +1,91 @@
|
||||
# Fuente: album/book/ops-templates/pet-owner/01-registro.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/common/test_users.py
|
||||
# Tests Frontend: npx playwright test auth.spec.ts
|
||||
|
||||
Feature: Registro de usuario
|
||||
|
||||
Como visitante de la plataforma
|
||||
Quiero poder crear una cuenta
|
||||
Para gestionar mis mascotas y reservar turnos
|
||||
|
||||
# ============================================
|
||||
# CAMINO FELIZ
|
||||
# ============================================
|
||||
|
||||
Scenario: Registro exitoso con datos validos
|
||||
Given que estoy en la pagina de registro
|
||||
When ingreso email "nuevo@ejemplo.com"
|
||||
And ingreso contraseña "Password123"
|
||||
And confirmo contraseña "Password123"
|
||||
And acepto los terminos y condiciones
|
||||
And hago click en "Crear cuenta"
|
||||
Then deberia ver mensaje "Te enviamos un email de verificacion"
|
||||
And deberia recibir email de verificacion
|
||||
|
||||
Scenario: Verificar email y activar cuenta
|
||||
Given que me registre con email "nuevo@ejemplo.com"
|
||||
And recibi el email de verificacion
|
||||
When hago click en el link de verificacion
|
||||
Then mi cuenta deberia estar activa
|
||||
And deberia ser redirigido al dashboard
|
||||
|
||||
# ============================================
|
||||
# VALIDACIONES
|
||||
# ============================================
|
||||
|
||||
Scenario Outline: Registro con datos invalidos
|
||||
Given que estoy en la pagina de registro
|
||||
When ingreso email "<email>"
|
||||
And ingreso contraseña "<password>"
|
||||
And confirmo contraseña "<confirmacion>"
|
||||
And hago click en "Crear cuenta"
|
||||
Then deberia ver error "<mensaje_error>"
|
||||
|
||||
Examples:
|
||||
| email | password | confirmacion | mensaje_error |
|
||||
| invalido | Password123 | Password123 | Email invalido |
|
||||
| test@test.com | 123 | 123 | Contraseña muy corta |
|
||||
| test@test.com | password | password | Debe contener al menos un numero |
|
||||
| test@test.com | Password123 | Diferente123 | Las contraseñas no coinciden |
|
||||
|
||||
Scenario: Registro con email ya existente
|
||||
Given que existe un usuario con email "existente@ejemplo.com"
|
||||
And estoy en la pagina de registro
|
||||
When ingreso email "existente@ejemplo.com"
|
||||
And completo el resto del formulario correctamente
|
||||
And hago click en "Crear cuenta"
|
||||
Then deberia ver error "Este email ya esta registrado"
|
||||
And deberia ver link "Recuperar contraseña"
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Registro linkea con cuenta invitado existente
|
||||
# Usuario que reservo turno como invitado y ahora quiere registrarse
|
||||
Given que existe un usuario invitado con email "invitado@ejemplo.com"
|
||||
And ese usuario tiene una mascota "Luna" registrada
|
||||
And estoy en la pagina de registro
|
||||
When me registro con email "invitado@ejemplo.com"
|
||||
And verifico mi cuenta
|
||||
Then deberia ver mi mascota "Luna" en el dashboard
|
||||
And deberia ver mis turnos anteriores
|
||||
|
||||
Scenario: Registro desde flujo de turnero
|
||||
# Usuario empezo a reservar turno y decide crear cuenta
|
||||
Given que estoy en el paso final del turnero
|
||||
And ingrese mis datos de contacto
|
||||
When hago click en "Crear cuenta para guardar mis datos"
|
||||
Then deberia ver formulario simplificado
|
||||
And mi email ya deberia estar pre-llenado
|
||||
And solo deberia ingresar contraseña
|
||||
|
||||
Scenario: Reenviar email de verificacion
|
||||
Given que me registre pero no verifique mi cuenta
|
||||
And estoy en la pagina de login
|
||||
When intento iniciar sesion
|
||||
Then deberia ver "Tu cuenta no esta verificada"
|
||||
And deberia ver boton "Reenviar email"
|
||||
When hago click en "Reenviar email"
|
||||
Then deberia recibir nuevo email de verificacion
|
||||
@@ -0,0 +1,140 @@
|
||||
# Fuente: album/book/ops-templates/pet-owner/02-reservar-turno.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/workflows/test_turnero_general.py
|
||||
# Tests Frontend: npx playwright test turnero.spec.ts
|
||||
# Relacionado: def/work_plan/10-flow-turnero.md
|
||||
|
||||
Feature: Reservar turno veterinario (Turnero)
|
||||
|
||||
Como dueno de mascota
|
||||
Quiero reservar un turno veterinario a domicilio
|
||||
Para que atiendan a mi mascota sin salir de casa
|
||||
|
||||
Background:
|
||||
Given que estoy en la pagina del turnero
|
||||
|
||||
# ============================================
|
||||
# VERIFICACION DE COBERTURA
|
||||
# ============================================
|
||||
|
||||
Scenario: Verificar cobertura en zona disponible
|
||||
When ingreso direccion "Av Santa Fe 1234, CABA"
|
||||
Then deberia ver mensaje "Tenemos cobertura en tu zona"
|
||||
And deberia poder continuar al siguiente paso
|
||||
|
||||
Scenario: Zona sin cobertura
|
||||
When ingreso direccion "Calle Principal 100, Ushuaia"
|
||||
Then deberia ver mensaje "Aun no tenemos cobertura en tu zona"
|
||||
And deberia ver formulario "Avisame cuando lleguen"
|
||||
|
||||
# ============================================
|
||||
# FLUJO COMPLETO POR TIPO DE USUARIO
|
||||
# ============================================
|
||||
|
||||
Scenario Outline: Reservar turno como <tipo_usuario>
|
||||
Given que soy un usuario <tipo_usuario>
|
||||
And tengo cobertura en mi zona
|
||||
When completo los datos de mi mascota:
|
||||
| campo | valor |
|
||||
| nombre | Luna |
|
||||
| tipo | Gato |
|
||||
| edad | 2 años |
|
||||
| castrada | Si |
|
||||
And selecciono servicios:
|
||||
| servicio |
|
||||
| Vacunacion |
|
||||
And selecciono fechas preferidas:
|
||||
| fecha | franja |
|
||||
| 2024-01-15 | Mañana |
|
||||
| 2024-01-16 | Tarde |
|
||||
And completo datos de contacto con email "<email>"
|
||||
And envio la solicitud
|
||||
Then deberia crearse una solicitud en estado "Pendiente"
|
||||
And el dueno deberia ser <estado_dueno>
|
||||
And deberia recibir email de confirmacion
|
||||
|
||||
Examples:
|
||||
| tipo_usuario | email | estado_dueno |
|
||||
| invitado | nuevo@test.com | creado como invitado |
|
||||
| registrado | user@test.com | mi cuenta existente |
|
||||
| recurrente | conocido@test.com | identificado por email |
|
||||
|
||||
# ============================================
|
||||
# SELECCION DE SERVICIOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Servicios filtrados por tipo de mascota
|
||||
Given que agregue una mascota tipo "Gato"
|
||||
When veo los servicios disponibles
|
||||
Then deberia ver "Vacuna triple felina"
|
||||
And deberia ver "Vacuna antirabica"
|
||||
But no deberia ver "Vacuna sextuple canina"
|
||||
|
||||
Scenario: Consulta clinica se agrega automaticamente con vacunacion
|
||||
Given que estoy seleccionando servicios
|
||||
When selecciono "Vacunacion"
|
||||
Then "Consulta clinica" deberia agregarse automaticamente
|
||||
And deberia ver nota "Incluye revision general"
|
||||
And no deberia poder quitar "Consulta clinica"
|
||||
|
||||
Scenario: Servicios combo con descuento
|
||||
Given que estoy seleccionando servicios
|
||||
When agrego los siguientes servicios:
|
||||
| servicio |
|
||||
| Vacunacion |
|
||||
| Desparasitacion |
|
||||
| Antipulgas |
|
||||
Then deberia ver "Plan preventivo completo"
|
||||
And el total deberia incluir descuento de combo
|
||||
|
||||
Scenario: Castracion no disponible para mascota castrada
|
||||
Given que mi mascota esta marcada como castrada
|
||||
When veo los servicios disponibles
|
||||
Then no deberia ver "Castracion"
|
||||
|
||||
# ============================================
|
||||
# DATOS DE CONTACTO Y CUENTA
|
||||
# ============================================
|
||||
|
||||
Scenario: Pre-llenado de datos para usuario logueado
|
||||
Given que estoy logueado como "maria@ejemplo.com"
|
||||
And tengo registrada mascota "Firulais"
|
||||
When inicio el flujo de turnero
|
||||
Then mi direccion deberia estar pre-llenada
|
||||
And deberia poder seleccionar "Firulais" de mis mascotas
|
||||
And mis datos de contacto ya deberian estar completos
|
||||
|
||||
Scenario: Detectar usuario existente por email
|
||||
Given que soy usuario invitado
|
||||
And existe una cuenta con email "existente@ejemplo.com"
|
||||
When ingreso email "existente@ejemplo.com" en datos de contacto
|
||||
Then deberia ver "Ya tenes cuenta con este email"
|
||||
And deberia ver opciones:
|
||||
| opcion |
|
||||
| Iniciar sesion |
|
||||
| Continuar como invitado |
|
||||
|
||||
# ============================================
|
||||
# EDGE CASES
|
||||
# ============================================
|
||||
|
||||
Scenario: Usuario abandona flujo a mitad
|
||||
Given que complete los datos de mascota
|
||||
And cerre el navegador sin enviar
|
||||
When vuelvo a la pagina del turnero
|
||||
Then deberia poder recuperar mi progreso
|
||||
# Nota: datos guardados en localStorage o session
|
||||
|
||||
Scenario: Multiples mascotas en una solicitud
|
||||
Given que quiero atender a 2 mascotas
|
||||
When agrego mascota "Luna" tipo "Gato"
|
||||
And agrego mascota "Rocky" tipo "Perro"
|
||||
And selecciono servicios para cada una
|
||||
Then deberia crearse una solicitud con 2 mascotas
|
||||
And el precio deberia reflejar ambas
|
||||
|
||||
Scenario: Franja horaria especifica
|
||||
Given que solo puedo por la mañana
|
||||
When selecciono franja "Mañana (9-12hs)"
|
||||
Then la solicitud deberia registrar esa preferencia
|
||||
# Nota: Es preferencia, no garantia
|
||||
@@ -0,0 +1,153 @@
|
||||
# Fuente: album/book/ops-templates/pet-owner/03-gestion-mascotas.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_pets.py
|
||||
# Tests Frontend: npx playwright test pets.spec.ts
|
||||
|
||||
Feature: Gestion de mascotas
|
||||
|
||||
Como dueno de mascota registrado
|
||||
Quiero gestionar la informacion de mis mascotas
|
||||
Para tenerla actualizada y acceder a su historial medico
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como dueno de mascota
|
||||
And estoy en la seccion "Mis mascotas"
|
||||
|
||||
# ============================================
|
||||
# AGREGAR MASCOTA
|
||||
# ============================================
|
||||
|
||||
Scenario: Agregar mascota con datos minimos
|
||||
When hago click en "Agregar mascota"
|
||||
And completo el formulario:
|
||||
| campo | valor |
|
||||
| nombre | Luna |
|
||||
| tipo | Gato |
|
||||
And hago click en "Guardar"
|
||||
Then deberia ver "Luna" en mi lista de mascotas
|
||||
And Luna deberia aparecer disponible en el turnero
|
||||
|
||||
Scenario: Agregar mascota con datos completos
|
||||
When hago click en "Agregar mascota"
|
||||
And completo el formulario:
|
||||
| campo | valor |
|
||||
| nombre | Rocky |
|
||||
| tipo | Perro |
|
||||
| raza | Labrador |
|
||||
| fecha_nacimiento | 2020-03-15 |
|
||||
| peso | 25 |
|
||||
| sexo | Macho |
|
||||
| castrado | Si |
|
||||
And subo una foto de Rocky
|
||||
And hago click en "Guardar"
|
||||
Then deberia ver "Rocky" con su foto en mi lista
|
||||
And deberia ver badge "Castrado"
|
||||
|
||||
Scenario Outline: Validacion de datos de mascota
|
||||
When intento agregar mascota con <campo> igual a "<valor>"
|
||||
Then deberia ver error "<mensaje>"
|
||||
|
||||
Examples:
|
||||
| campo | valor | mensaje |
|
||||
| nombre | | El nombre es obligatorio |
|
||||
| nombre | A | Nombre muy corto |
|
||||
| tipo | | Selecciona el tipo |
|
||||
| peso | -5 | El peso debe ser positivo |
|
||||
| peso | 500 | Peso fuera de rango |
|
||||
|
||||
# ============================================
|
||||
# EDITAR MASCOTA
|
||||
# ============================================
|
||||
|
||||
Scenario: Editar peso de mascota
|
||||
Given que tengo una mascota "Luna" con peso 4kg
|
||||
When edito a Luna
|
||||
And cambio el peso a 5kg
|
||||
And guardo los cambios
|
||||
Then Luna deberia mostrar peso "5 kg"
|
||||
|
||||
Scenario: Marcar mascota como castrada
|
||||
Given que tengo una mascota "Rocky" no castrado
|
||||
When edito a Rocky
|
||||
And marco "Esta castrado"
|
||||
And guardo los cambios
|
||||
Then Rocky deberia mostrar badge "Castrado"
|
||||
And el servicio "Castracion" no deberia aparecer para Rocky en el turnero
|
||||
|
||||
Scenario: Actualizar foto de mascota
|
||||
Given que tengo una mascota "Luna" sin foto
|
||||
When edito a Luna
|
||||
And subo una nueva foto
|
||||
And guardo los cambios
|
||||
Then deberia ver la foto de Luna en su tarjeta
|
||||
|
||||
# ============================================
|
||||
# ELIMINAR MASCOTA
|
||||
# ============================================
|
||||
|
||||
Scenario: Eliminar mascota sin historial
|
||||
Given que tengo una mascota "Nuevo" sin visitas
|
||||
When hago click en "Eliminar" para Nuevo
|
||||
And confirmo la eliminacion
|
||||
Then Nuevo no deberia aparecer en mi lista
|
||||
# Nota: Es soft delete
|
||||
|
||||
Scenario: Eliminar mascota con historial medico
|
||||
Given que tengo una mascota "Luna" con visitas anteriores
|
||||
When hago click en "Eliminar" para Luna
|
||||
Then deberia ver advertencia "Luna tiene historial medico"
|
||||
And deberia ver "El historial se conservara pero no podras verlo"
|
||||
When confirmo la eliminacion
|
||||
Then Luna no deberia aparecer en mi lista
|
||||
|
||||
Scenario: No puedo eliminar mascota con turno pendiente
|
||||
Given que tengo una mascota "Rocky" con turno pendiente
|
||||
When intento eliminar a Rocky
|
||||
Then deberia ver error "Rocky tiene turnos pendientes"
|
||||
And deberia ver sugerencia "Cancela los turnos primero"
|
||||
|
||||
# ============================================
|
||||
# VER HISTORIAL MEDICO
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver historial de visitas de mascota
|
||||
Given que tengo una mascota "Luna" con 3 visitas completadas
|
||||
When hago click en Luna
|
||||
And voy a la seccion "Historial"
|
||||
Then deberia ver 3 visitas listadas
|
||||
And deberian estar ordenadas por fecha descendente
|
||||
|
||||
Scenario: Ver detalle de visita
|
||||
Given que tengo una mascota "Luna" con visitas
|
||||
When veo el historial de Luna
|
||||
And hago click en la primera visita
|
||||
Then deberia ver:
|
||||
| campo |
|
||||
| Fecha |
|
||||
| Veterinario |
|
||||
| Diagnostico |
|
||||
| Tratamiento |
|
||||
| Medicamentos |
|
||||
|
||||
Scenario: Mascota sin historial
|
||||
Given que tengo una mascota "Nuevo" recien agregada
|
||||
When veo el perfil de Nuevo
|
||||
Then la seccion "Historial" deberia estar vacia
|
||||
And deberia ver mensaje "Aun no hay visitas registradas"
|
||||
And deberia ver boton "Reservar primer turno"
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Mascota heredada de cuenta invitado
|
||||
Given que me registre con email "juan@test.com"
|
||||
And previamente reserve turno como invitado para "Firulais"
|
||||
When voy a "Mis mascotas"
|
||||
Then deberia ver "Firulais" en mi lista
|
||||
And deberia ver su historial de visitas previas
|
||||
|
||||
Scenario: Razas filtradas por tipo
|
||||
When agrego una mascota tipo "Gato"
|
||||
Then las razas disponibles deberian ser razas de gato
|
||||
And no deberia ver razas de perro como "Labrador"
|
||||
140
atlas/book/gherkin-samples/en/pet-owner/04-pago-turno.feature
Normal file
140
atlas/book/gherkin-samples/en/pet-owner/04-pago-turno.feature
Normal file
@@ -0,0 +1,140 @@
|
||||
# Fuente: album/book/ops-templates/pet-owner/04-pago-turno.md
|
||||
# Drive: 07. Finanzas y contabilidad/Mercado Pago
|
||||
# Tests Backend: pytest tests/contracts/payments/test_mercadopago.py
|
||||
# Tests Frontend: npx playwright test payment.spec.ts
|
||||
|
||||
Feature: Pago de turno
|
||||
|
||||
Como dueno de mascota con turno coordinado
|
||||
Quiero pagar mi turno online
|
||||
Para confirmar la visita del veterinario
|
||||
|
||||
Background:
|
||||
Given que tengo un turno en estado "Coordinado"
|
||||
And el turno tiene asignado veterinario "Dra. Garcia"
|
||||
And la fecha asignada es "15 de enero a las 10:00"
|
||||
|
||||
# ============================================
|
||||
# FLUJO DE PAGO EXITOSO
|
||||
# ============================================
|
||||
|
||||
Scenario: Pagar turno con tarjeta de credito
|
||||
Given que estoy en el detalle de mi turno coordinado
|
||||
When hago click en "Pagar"
|
||||
Then deberia ser redirigido a Mercado Pago
|
||||
And deberia ver el monto correcto
|
||||
|
||||
When selecciono "Tarjeta de credito"
|
||||
And completo los datos de la tarjeta
|
||||
And confirmo el pago
|
||||
Then deberia volver a la plataforma
|
||||
And deberia ver "Pago exitoso"
|
||||
And el turno deberia estar en estado "Pagado"
|
||||
|
||||
Scenario: Recibir confirmacion de pago
|
||||
Given que complete el pago exitosamente
|
||||
Then deberia recibir email de confirmacion
|
||||
And el email deberia contener:
|
||||
| campo |
|
||||
| Fecha del turno |
|
||||
| Direccion |
|
||||
| Veterinario asignado |
|
||||
| Monto pagado |
|
||||
| Numero de operacion |
|
||||
|
||||
# ============================================
|
||||
# METODOS DE PAGO
|
||||
# ============================================
|
||||
|
||||
Scenario Outline: Pagar con diferentes metodos
|
||||
Given que estoy en Mercado Pago
|
||||
When selecciono metodo "<metodo>"
|
||||
And completo el pago
|
||||
Then el pago deberia ser <resultado>
|
||||
And el estado de acreditacion deberia ser "<acreditacion>"
|
||||
|
||||
Examples:
|
||||
| metodo | resultado | acreditacion |
|
||||
| Tarjeta credito | exitoso | inmediata |
|
||||
| Tarjeta debito | exitoso | inmediata |
|
||||
| Dinero en cuenta | exitoso | inmediata |
|
||||
| Transferencia | pendiente | 1-2 dias |
|
||||
| Rapipago | pendiente | hasta 24hs |
|
||||
|
||||
# ============================================
|
||||
# MANEJO DE ERRORES
|
||||
# ============================================
|
||||
|
||||
Scenario: Pago rechazado por fondos insuficientes
|
||||
Given que estoy en Mercado Pago
|
||||
When intento pagar con tarjeta sin fondos
|
||||
Then deberia ver error "Fondos insuficientes"
|
||||
And deberia poder reintentar con otra tarjeta
|
||||
And el turno deberia seguir en estado "Coordinado"
|
||||
|
||||
Scenario: Usuario cancela el pago
|
||||
Given que estoy en Mercado Pago
|
||||
When hago click en "Volver al sitio"
|
||||
Then deberia volver a la plataforma
|
||||
And deberia ver mensaje "El pago fue cancelado"
|
||||
And deberia ver boton "Reintentar pago"
|
||||
And el turno deberia seguir en estado "Coordinado"
|
||||
|
||||
Scenario: Cierre de browser durante pago
|
||||
Given que estoy en Mercado Pago
|
||||
And cierro el navegador accidentalmente
|
||||
When vuelvo a la plataforma
|
||||
And voy a "Mis turnos"
|
||||
Then deberia poder ver el estado real del pago
|
||||
# Si se proceso: Pagado. Si no: Coordinado con opcion de pagar
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Link de pago expirado
|
||||
Given que recibi el link de pago hace mas de 24 horas
|
||||
When hago click en el link
|
||||
Then deberia ver "Este link ha expirado"
|
||||
And deberia ver "Contacta a soporte para generar uno nuevo"
|
||||
|
||||
Scenario: Intento pagar turno ya pagado
|
||||
Given que mi turno ya esta en estado "Pagado"
|
||||
When accedo al link de pago
|
||||
Then deberia ver "Este turno ya fue pagado"
|
||||
And deberia ver boton "Ver detalle del turno"
|
||||
|
||||
Scenario: Precio cambio desde la coordinacion
|
||||
# Caso muy raro pero posible
|
||||
Given que el precio del servicio aumento desde que se coordino
|
||||
When voy a pagar
|
||||
Then deberia ver el precio original acordado
|
||||
# El precio se congela al momento de coordinacion
|
||||
|
||||
# ============================================
|
||||
# INTEGRACION CON WEBHOOK
|
||||
# ============================================
|
||||
|
||||
Rule: El estado del turno se actualiza via webhook de Mercado Pago
|
||||
|
||||
Scenario: Webhook confirma pago aprobado
|
||||
Given que el usuario completo el pago en Mercado Pago
|
||||
When Mercado Pago envia webhook con status "approved"
|
||||
Then el turno deberia cambiar a estado "Pagado"
|
||||
And el veterinario deberia recibir notificacion
|
||||
And el usuario deberia recibir email de confirmacion
|
||||
|
||||
Scenario: Webhook informa pago pendiente
|
||||
Given que el usuario pago con transferencia bancaria
|
||||
When Mercado Pago envia webhook con status "pending"
|
||||
Then el turno deberia quedarse en "Coordinado"
|
||||
And deberia registrarse el pago pendiente
|
||||
And el usuario deberia recibir email "Esperando acreditacion"
|
||||
|
||||
Scenario: Webhook falla pero pago se proceso
|
||||
# Caso de error que requiere intervencion manual
|
||||
Given que el usuario pago exitosamente
|
||||
But el webhook fallo por error de red
|
||||
Then el turno seguira en "Coordinado"
|
||||
And el equipo de ops deberia recibir alerta
|
||||
And deberian poder actualizar manualmente
|
||||
@@ -0,0 +1,147 @@
|
||||
# Fuente: album/book/ops-templates/pet-owner/05-historial-medico.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_visits.py
|
||||
# Tests Frontend: npx playwright test medical-history.spec.ts
|
||||
|
||||
Feature: Ver historial medico
|
||||
|
||||
Como dueno de mascota
|
||||
Quiero ver el historial medico de mis mascotas
|
||||
Para tener registro de sus visitas y tratamientos
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como dueno de mascota
|
||||
And tengo una mascota "Luna" con visitas completadas
|
||||
|
||||
# ============================================
|
||||
# ACCESO AL HISTORIAL
|
||||
# ============================================
|
||||
|
||||
Scenario: Acceder al historial desde mascotas
|
||||
Given que estoy en "Mis mascotas"
|
||||
When hago click en "Luna"
|
||||
And voy a la seccion "Historial de visitas"
|
||||
Then deberia ver lista de visitas de Luna
|
||||
|
||||
Scenario: Acceder al historial desde turnos
|
||||
Given que estoy en "Mis turnos"
|
||||
And filtro por "Completados"
|
||||
When hago click en un turno de Luna
|
||||
And hago click en "Ver informe medico"
|
||||
Then deberia ver el informe de esa visita
|
||||
|
||||
# ============================================
|
||||
# VISUALIZACION DE VISITAS
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver lista de visitas ordenadas
|
||||
Given que Luna tiene visitas en las siguientes fechas:
|
||||
| fecha |
|
||||
| 2024-01-15 |
|
||||
| 2023-11-20 |
|
||||
| 2023-06-10 |
|
||||
When veo el historial de Luna
|
||||
Then deberia ver las visitas ordenadas de mas reciente a mas antigua
|
||||
And la primera deberia ser del "15 de enero 2024"
|
||||
|
||||
Scenario: Ver detalle completo de informe
|
||||
When hago click en una visita completada
|
||||
Then deberia ver los siguientes datos:
|
||||
| seccion | contenido |
|
||||
| Informacion | Fecha, veterinario, servicios |
|
||||
| Examen fisico | Peso, temperatura, FC, obs |
|
||||
| Diagnostico | Descripcion del diagnostico |
|
||||
| Tratamiento | Plan de tratamiento |
|
||||
| Medicamentos | Lista con dosis y frecuencia |
|
||||
| Estudios | Estudios solicitados y estado |
|
||||
| Seguimiento | Recomendaciones, proximo control |
|
||||
|
||||
Scenario: Ver informe con medicamentos recetados
|
||||
Given que la visita incluye medicamentos:
|
||||
"""
|
||||
1. Amoxicilina 250mg - 1 comprimido cada 12hs por 7 dias
|
||||
2. Meloxicam 1.5mg - 1 comprimido por dia por 3 dias
|
||||
"""
|
||||
When veo el informe
|
||||
Then deberia ver la lista de medicamentos
|
||||
And cada medicamento deberia mostrar:
|
||||
| campo |
|
||||
| Nombre |
|
||||
| Dosis |
|
||||
| Frecuencia |
|
||||
| Duracion |
|
||||
|
||||
# ============================================
|
||||
# DESCARGA Y COMPARTIR
|
||||
# ============================================
|
||||
|
||||
Scenario: Descargar informe como PDF
|
||||
Given que estoy viendo un informe medico
|
||||
When hago click en "Descargar PDF"
|
||||
Then deberia descargarse un archivo PDF
|
||||
And el PDF deberia contener toda la informacion del informe
|
||||
And deberia tener el logo de Amar Mascotas
|
||||
|
||||
Scenario: Imprimir informe
|
||||
Given que estoy viendo un informe medico
|
||||
When hago click en "Imprimir"
|
||||
Then deberia abrirse el dialogo de impresion
|
||||
And el formato deberia ser optimizado para impresion
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Visita completada sin informe cargado
|
||||
# El vet no cargo el informe todavia
|
||||
Given que Luna tiene una visita marcada como "Completada"
|
||||
But el veterinario no cargo el informe aun
|
||||
When intento ver el informe
|
||||
Then deberia ver mensaje "Informe pendiente"
|
||||
And deberia ver "El veterinario esta completando el informe"
|
||||
|
||||
Scenario: Informe con estudios pendientes
|
||||
Given que el informe solicita estudios de laboratorio
|
||||
And los resultados aun no estan disponibles
|
||||
When veo el informe
|
||||
Then deberia ver seccion "Estudios solicitados"
|
||||
And deberia ver estado "Pendiente de resultados"
|
||||
And deberia ver nota "Se notificara cuando esten listos"
|
||||
|
||||
Scenario: Mascota con multiples visitas el mismo dia
|
||||
# Raro pero posible: consulta de urgencia + seguimiento
|
||||
Given que Luna tuvo 2 visitas el 15 de enero
|
||||
When veo el historial
|
||||
Then deberia ver ambas visitas listadas
|
||||
And deberian estar diferenciadas por hora
|
||||
|
||||
# ============================================
|
||||
# PERMISOS Y PRIVACIDAD
|
||||
# ============================================
|
||||
|
||||
Rule: Solo el dueno puede ver el historial de su mascota
|
||||
|
||||
Scenario: Dueno ve historial de su mascota
|
||||
Given que soy dueno de Luna
|
||||
When accedo al historial de Luna
|
||||
Then deberia poder verlo completo
|
||||
|
||||
Scenario: No puedo ver historial de mascota ajena
|
||||
Given que existe mascota "Rocky" de otro dueno
|
||||
When intento acceder al historial de Rocky
|
||||
Then deberia ver error "No tienes acceso"
|
||||
# 403 Forbidden
|
||||
|
||||
# ============================================
|
||||
# BUSQUEDA Y FILTROS
|
||||
# ============================================
|
||||
|
||||
Scenario: Filtrar historial por tipo de servicio
|
||||
Given que Luna tiene visitas de vacunacion y consulta
|
||||
When filtro por "Vacunacion"
|
||||
Then solo deberia ver visitas de vacunacion
|
||||
|
||||
Scenario: Buscar en historial por fecha
|
||||
When busco visitas del "2023"
|
||||
Then solo deberia ver visitas del 2023
|
||||
And no deberia ver visitas del 2024
|
||||
@@ -0,0 +1,109 @@
|
||||
# Fuente: album/book/ops-templates/veterinarian/01-aceptar-solicitud.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/solicitudes/test_service_requests.py
|
||||
# Tests Frontend: npx playwright test vet-requests.spec.ts
|
||||
|
||||
Feature: Aceptar o rechazar solicitudes de servicio
|
||||
|
||||
Como veterinario de la plataforma
|
||||
Quiero revisar y responder a solicitudes en mi zona
|
||||
Para gestionar mi agenda de visitas a domicilio
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como veterinario
|
||||
And tengo cobertura en los barrios "Palermo" y "Recoleta"
|
||||
And estoy en el dashboard de veterinario
|
||||
|
||||
# ============================================
|
||||
# VER SOLICITUDES PENDIENTES
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver lista de solicitudes en mi zona
|
||||
When veo la seccion "Solicitudes pendientes"
|
||||
Then deberia ver solo solicitudes de "Palermo" y "Recoleta"
|
||||
And no deberia ver solicitudes de otros barrios
|
||||
|
||||
Scenario: Ver detalle de solicitud
|
||||
Given que hay una solicitud pendiente
|
||||
When hago click en la solicitud
|
||||
Then deberia ver:
|
||||
| seccion | contenido |
|
||||
| Dueno | Nombre, telefono, direccion |
|
||||
| Mascota | Nombre, tipo, edad, foto |
|
||||
| Servicios | Lista de servicios solicitados |
|
||||
| Fechas | Fechas preferidas por el dueno |
|
||||
| Historial | Visitas anteriores si las hay |
|
||||
|
||||
# ============================================
|
||||
# ACEPTAR SOLICITUD
|
||||
# ============================================
|
||||
|
||||
Scenario: Aceptar solicitud con fecha disponible
|
||||
Given que hay una solicitud para el barrio "Palermo"
|
||||
And el dueno prefiere fechas:
|
||||
| fecha | franja |
|
||||
| 2024-01-15 | Mañana |
|
||||
| 2024-01-16 | Tarde |
|
||||
And tengo disponibilidad el 15 de enero a las 10:00
|
||||
When hago click en "Aceptar"
|
||||
And selecciono fecha "15 de enero" hora "10:00"
|
||||
And confirmo la aceptacion
|
||||
Then la solicitud deberia pasar a estado "Coordinado"
|
||||
And deberia quedar asignada a mi
|
||||
And el dueno deberia recibir notificacion con mis datos
|
||||
And la visita deberia aparecer en mi agenda
|
||||
|
||||
Scenario: Aceptar solicitud con datos de mascota que ya atendi
|
||||
Given que hay una solicitud para mascota "Luna"
|
||||
And yo atendi a "Luna" anteriormente
|
||||
When veo el detalle de la solicitud
|
||||
Then deberia ver badge "Paciente recurrente"
|
||||
And deberia ver el historial de mis visitas anteriores a Luna
|
||||
|
||||
# ============================================
|
||||
# RECHAZAR SOLICITUD
|
||||
# ============================================
|
||||
|
||||
Scenario Outline: Rechazar solicitud con motivo
|
||||
Given que hay una solicitud pendiente
|
||||
When hago click en "Rechazar"
|
||||
And selecciono motivo "<motivo>"
|
||||
And confirmo el rechazo
|
||||
Then la solicitud deberia desaparecer de mi lista
|
||||
And deberia seguir visible para otros veterinarios
|
||||
|
||||
Examples:
|
||||
| motivo |
|
||||
| No tengo disponibilidad |
|
||||
| Fuera de mi zona |
|
||||
| No realizo este servicio |
|
||||
| Otro |
|
||||
|
||||
# ============================================
|
||||
# RACE CONDITIONS
|
||||
# ============================================
|
||||
|
||||
Rule: Solo un veterinario puede aceptar cada solicitud
|
||||
|
||||
Scenario: Otro vet acepta mientras estoy viendo
|
||||
Given que estoy viendo el detalle de una solicitud
|
||||
And otro veterinario acepta la misma solicitud
|
||||
When intento aceptarla
|
||||
Then deberia ver error "Esta solicitud ya fue aceptada"
|
||||
And deberia ser redirigido al listado
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Solicitud urgente destacada
|
||||
Given que hay una solicitud marcada como "Urgente"
|
||||
When veo el listado de solicitudes
|
||||
Then deberia ver la solicitud con indicador de urgencia
|
||||
And deberia aparecer primero en la lista
|
||||
|
||||
Scenario: No puedo aceptar con agenda completa
|
||||
Given que tengo mi agenda completa para las fechas de la solicitud
|
||||
When intento aceptar la solicitud
|
||||
Then deberia ver advertencia "No tienes disponibilidad en las fechas preferidas"
|
||||
And deberia poder proponer una fecha alternativa
|
||||
@@ -0,0 +1,99 @@
|
||||
# Fuente: album/book/ops-templates/veterinarian/02-gestion-agenda.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_availability.py
|
||||
# Tests Frontend: npx playwright test vet-schedule.spec.ts
|
||||
|
||||
Feature: Gestion de agenda veterinaria
|
||||
|
||||
Como veterinario
|
||||
Quiero gestionar mi calendario y disponibilidad
|
||||
Para organizar mis visitas a domicilio eficientemente
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como veterinario
|
||||
And estoy en la seccion "Mi agenda"
|
||||
|
||||
# ============================================
|
||||
# VER AGENDA
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver calendario semanal
|
||||
When veo mi agenda en vista semanal
|
||||
Then deberia ver los 7 dias de la semana
|
||||
And deberia ver mis visitas programadas
|
||||
And cada visita deberia mostrar hora y nombre del paciente
|
||||
|
||||
Scenario: Ver visitas con codigo de color por estado
|
||||
Given que tengo visitas en diferentes estados
|
||||
When veo mi agenda
|
||||
Then las visitas deberian mostrarse con colores:
|
||||
| estado | color |
|
||||
| Coordinado | amarillo |
|
||||
| Pagado | verde |
|
||||
| En progreso | azul |
|
||||
| Completado | gris |
|
||||
|
||||
# ============================================
|
||||
# CONFIGURAR DISPONIBILIDAD SEMANAL
|
||||
# ============================================
|
||||
|
||||
Scenario: Configurar horario laboral
|
||||
When voy a "Configuracion" -> "Mi disponibilidad"
|
||||
And configuro mi horario:
|
||||
| dia | trabajo | desde | hasta | pausa_desde | pausa_hasta |
|
||||
| Lunes | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Martes | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Miercoles | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Jueves | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Viernes | Si | 09:00 | 15:00 | | |
|
||||
| Sabado | No | | | | |
|
||||
| Domingo | No | | | | |
|
||||
And guardo la configuracion
|
||||
Then mi disponibilidad deberia actualizarse
|
||||
And no deberia recibir solicitudes fuera de ese horario
|
||||
|
||||
# ============================================
|
||||
# BLOQUEAR DIAS ESPECIFICOS
|
||||
# ============================================
|
||||
|
||||
Scenario: Marcar dia como no disponible
|
||||
Given que necesito el 20 de enero libre
|
||||
When hago click en el dia 20 de enero en el calendario
|
||||
And selecciono "Marcar como no disponible"
|
||||
And ingreso motivo "Vacaciones"
|
||||
And confirmo
|
||||
Then el dia 20 deberia mostrarse como bloqueado
|
||||
And no deberia poder aceptar solicitudes para ese dia
|
||||
|
||||
Scenario: Bloquear rango de fechas
|
||||
Given que tomo vacaciones del 15 al 22 de enero
|
||||
When voy a "Agregar indisponibilidad"
|
||||
And selecciono fecha inicio "15 de enero"
|
||||
And selecciono fecha fin "22 de enero"
|
||||
And ingreso motivo "Vacaciones"
|
||||
And confirmo
|
||||
Then todos esos dias deberian mostrarse como bloqueados
|
||||
|
||||
# ============================================
|
||||
# IMPACTO EN SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Rule: Los bloqueos no afectan visitas ya aceptadas
|
||||
|
||||
Scenario: Bloquear dia con visita ya aceptada
|
||||
Given que tengo una visita aceptada para el 15 de enero
|
||||
When intento bloquear el 15 de enero
|
||||
Then deberia ver advertencia "Tienes una visita programada ese dia"
|
||||
And deberia poder elegir:
|
||||
| opcion |
|
||||
| Cancelar el bloqueo |
|
||||
| Bloquear y contactar al dueno |
|
||||
|
||||
Rule: Cambios de disponibilidad solo afectan solicitudes futuras
|
||||
|
||||
Scenario: Cambiar horario no afecta visitas existentes
|
||||
Given que tengo una visita a las 17:00 el lunes
|
||||
When cambio mi horario del lunes para terminar a las 16:00
|
||||
And guardo los cambios
|
||||
Then la visita de las 17:00 deberia mantenerse
|
||||
And deberia ver advertencia sobre la inconsistencia
|
||||
@@ -0,0 +1,127 @@
|
||||
# Fuente: album/book/ops-templates/veterinarian/03-realizar-visita.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_visits.py
|
||||
# Tests Frontend: npx playwright test vet-visit.spec.ts
|
||||
|
||||
Feature: Realizar visita y crear informe medico
|
||||
|
||||
Como veterinario
|
||||
Quiero registrar la atencion medica de mis visitas
|
||||
Para mantener el historial clinico del paciente
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como veterinario
|
||||
And tengo una visita programada para hoy con mascota "Luna"
|
||||
And la visita esta en estado "Pagado"
|
||||
|
||||
# ============================================
|
||||
# INICIAR VISITA
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver informacion antes de la visita
|
||||
When accedo al detalle de la visita
|
||||
Then deberia ver la direccion para llegar
|
||||
And deberia ver el telefono del dueno para confirmar
|
||||
And deberia ver los servicios a realizar
|
||||
And deberia ver el historial previo de Luna
|
||||
|
||||
Scenario: Iniciar visita al llegar
|
||||
Given que llegue al domicilio
|
||||
When hago click en "Iniciar visita"
|
||||
Then el estado deberia cambiar a "En progreso"
|
||||
And deberia registrarse la hora de inicio
|
||||
And deberia habilitarse el boton "Crear informe"
|
||||
|
||||
# ============================================
|
||||
# CREAR INFORME MEDICO
|
||||
# ============================================
|
||||
|
||||
Scenario: Completar informe con examen fisico
|
||||
Given que la visita esta en progreso
|
||||
When voy a "Crear informe"
|
||||
And completo el examen fisico:
|
||||
| campo | valor |
|
||||
| Peso | 4.5 kg |
|
||||
| Temperatura | 38.5 °C |
|
||||
| Frecuencia cardiaca | 120 lpm |
|
||||
| Frecuencia resp | 25 rpm |
|
||||
| Mucosas | Rosadas |
|
||||
| Hidratacion | Normal |
|
||||
And guardo el informe
|
||||
Then el examen fisico deberia guardarse
|
||||
|
||||
Scenario: Agregar diagnostico y tratamiento
|
||||
Given que complete el examen fisico
|
||||
When agrego el diagnostico:
|
||||
"""
|
||||
Otitis externa bilateral leve.
|
||||
Paciente presenta prurito y secrecion ceruminosa.
|
||||
Sin signos de infeccion secundaria.
|
||||
"""
|
||||
And agrego el tratamiento:
|
||||
"""
|
||||
Limpieza de oidos con solucion fisiologica.
|
||||
Aplicacion de gotas oticas antibioticas.
|
||||
Control en 7 dias.
|
||||
"""
|
||||
And guardo el informe
|
||||
Then el diagnostico y tratamiento deberian guardarse
|
||||
|
||||
Scenario: Recetar medicamentos
|
||||
Given que estoy creando el informe
|
||||
When agrego medicamentos:
|
||||
| nombre | dosis | frecuencia | duracion |
|
||||
| Otomax gotas | 5 gotas | cada 12 horas | 7 dias |
|
||||
| Meloxicam 1.5mg | 1 comp | cada 24 horas | 3 dias |
|
||||
And guardo el informe
|
||||
Then los medicamentos deberian aparecer en el informe
|
||||
And el dueno podra verlos desde su cuenta
|
||||
|
||||
# ============================================
|
||||
# COMPLETAR VISITA
|
||||
# ============================================
|
||||
|
||||
Scenario: Completar visita con informe
|
||||
Given que el informe esta completo
|
||||
When hago click en "Completar visita"
|
||||
And confirmo la finalizacion
|
||||
Then la visita deberia pasar a estado "Completado"
|
||||
And deberia generarse factura electronica (AFIP)
|
||||
And el dueno deberia recibir notificacion
|
||||
And el informe deberia ser visible para el dueno
|
||||
|
||||
Scenario: No puedo completar sin informe
|
||||
Given que la visita esta en progreso
|
||||
But no cree ningun informe
|
||||
When intento completar la visita
|
||||
Then deberia ver error "Debes crear el informe antes de completar"
|
||||
|
||||
# ============================================
|
||||
# GUARDADO AUTOMATICO
|
||||
# ============================================
|
||||
|
||||
Rule: El informe se guarda automaticamente
|
||||
|
||||
Scenario: Guardado automatico cada 30 segundos
|
||||
Given que estoy escribiendo el informe
|
||||
When pasan 30 segundos
|
||||
Then deberia ver indicador "Guardado automaticamente"
|
||||
|
||||
Scenario: Recuperar informe despues de desconexion
|
||||
Given que estaba escribiendo el informe
|
||||
And perdi conexion a internet
|
||||
When recupero la conexion
|
||||
Then deberia recuperar mi progreso
|
||||
And no deberia perder lo que escribi
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Cancelar visita in situ
|
||||
Given que llegue al domicilio
|
||||
But el dueno no esta
|
||||
When marco la visita como "Cancelada in situ"
|
||||
And selecciono motivo "Dueno ausente"
|
||||
Then la visita deberia marcarse como cancelada
|
||||
And deberia generarse cargo por visita fallida
|
||||
@@ -0,0 +1,83 @@
|
||||
# Fuente: album/book/ops-templates/veterinarian/04-zonas-cobertura.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_veterinarians.py
|
||||
# Tests Frontend: npx playwright test vet-coverage.spec.ts
|
||||
|
||||
Feature: Gestionar zonas de cobertura
|
||||
|
||||
Como veterinario
|
||||
Quiero definir en que zonas atiendo
|
||||
Para recibir solo solicitudes que puedo cubrir
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como veterinario
|
||||
And estoy en la seccion "Mi cobertura"
|
||||
|
||||
# ============================================
|
||||
# VER ZONAS ACTUALES
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver mapa con mis zonas de cobertura
|
||||
When cargo la pagina de cobertura
|
||||
Then deberia ver un mapa de la ciudad
|
||||
And mis zonas cubiertas deberian estar resaltadas
|
||||
And deberia ver un listado de barrios seleccionados
|
||||
|
||||
Scenario: Ver estadisticas por zona
|
||||
Given que tengo cobertura en "Palermo" y "Recoleta"
|
||||
When veo el detalle de mis zonas
|
||||
Then deberia ver para cada zona:
|
||||
| metrica |
|
||||
| Solicitudes este mes |
|
||||
| Visitas completadas |
|
||||
| Otros vets en la zona |
|
||||
|
||||
# ============================================
|
||||
# AGREGAR ZONAS
|
||||
# ============================================
|
||||
|
||||
Scenario: Agregar barrio desde el mapa
|
||||
Given que no tengo cobertura en "Belgrano"
|
||||
When hago click en "Belgrano" en el mapa
|
||||
And confirmo agregar la zona
|
||||
Then "Belgrano" deberia aparecer en mi lista de zonas
|
||||
And deberia empezar a ver solicitudes de Belgrano
|
||||
|
||||
Scenario: Agregar multiples zonas a la vez
|
||||
When selecciono los barrios:
|
||||
| barrio |
|
||||
| Colegiales |
|
||||
| Chacarita |
|
||||
| Villa Crespo |
|
||||
And hago click en "Agregar seleccionados"
|
||||
Then los 3 barrios deberian agregarse a mi cobertura
|
||||
|
||||
# ============================================
|
||||
# QUITAR ZONAS
|
||||
# ============================================
|
||||
|
||||
Scenario: Quitar zona de cobertura
|
||||
Given que tengo cobertura en "Recoleta"
|
||||
When hago click en "X" junto a "Recoleta"
|
||||
And confirmo quitar la zona
|
||||
Then "Recoleta" no deberia estar en mi lista
|
||||
And no deberia ver nuevas solicitudes de Recoleta
|
||||
|
||||
# ============================================
|
||||
# IMPACTO EN SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Rule: Los cambios de zona afectan solo solicitudes nuevas
|
||||
|
||||
Scenario: Agregar zona muestra solicitudes existentes
|
||||
Given que no tengo cobertura en "Belgrano"
|
||||
And hay 3 solicitudes pendientes en Belgrano
|
||||
When agrego "Belgrano" a mi cobertura
|
||||
Then deberia ver las 3 solicitudes pendientes de Belgrano
|
||||
|
||||
Scenario: Quitar zona no afecta visitas aceptadas
|
||||
Given que tengo cobertura en "Recoleta"
|
||||
And tengo una visita aceptada en Recoleta para mañana
|
||||
When quito "Recoleta" de mi cobertura
|
||||
Then la visita de mañana deberia mantenerse
|
||||
But no deberia ver nuevas solicitudes de Recoleta
|
||||
@@ -0,0 +1,100 @@
|
||||
# Fuente: album/book/ops-templates/veterinarian/05-historial-pacientes.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_visits.py
|
||||
# Tests Frontend: npx playwright test vet-history.spec.ts
|
||||
|
||||
Feature: Ver historial de pacientes
|
||||
|
||||
Como veterinario
|
||||
Quiero acceder al historial medico de pacientes
|
||||
Para tener contexto clinico en mis atenciones
|
||||
|
||||
Background:
|
||||
Given que estoy logueado como veterinario
|
||||
And estoy en la seccion "Historia clinica"
|
||||
|
||||
# ============================================
|
||||
# BUSCAR PACIENTES
|
||||
# ============================================
|
||||
|
||||
Scenario Outline: Buscar paciente por diferentes criterios
|
||||
When busco por <criterio> con valor "<valor>"
|
||||
Then deberia ver resultados que coincidan
|
||||
|
||||
Examples:
|
||||
| criterio | valor |
|
||||
| nombre dueno | Maria Garcia |
|
||||
| nombre mascota | Luna |
|
||||
| telefono | 1155551234 |
|
||||
| email | maria@ejemplo.com |
|
||||
|
||||
Scenario: Busqueda sin resultados
|
||||
When busco "ZZZZZ paciente inexistente"
|
||||
Then deberia ver mensaje "No se encontraron resultados"
|
||||
And deberia ver sugerencia "Verifica la ortografia"
|
||||
|
||||
# ============================================
|
||||
# VER FICHA DE MASCOTA
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver ficha completa de mascota
|
||||
Given que encontre a la mascota "Luna"
|
||||
When hago click en Luna
|
||||
Then deberia ver la ficha con:
|
||||
| seccion | contenido |
|
||||
| Datos basicos | Nombre, tipo, raza, edad, peso |
|
||||
| Foto | Foto de la mascota |
|
||||
| Dueno | Nombre y contacto del dueno |
|
||||
| Vacunacion | Estado de vacunas |
|
||||
| Historial | Lista de visitas |
|
||||
|
||||
# ============================================
|
||||
# VER HISTORIAL DE VISITAS
|
||||
# ============================================
|
||||
|
||||
Scenario: Ver listado de visitas
|
||||
Given que estoy viendo la ficha de "Luna"
|
||||
And Luna tiene 5 visitas completadas
|
||||
When veo la seccion "Historial de visitas"
|
||||
Then deberia ver las 5 visitas listadas
|
||||
And deberian estar ordenadas de mas reciente a mas antigua
|
||||
|
||||
Scenario: Ver informe de visita de otro veterinario
|
||||
Given que Luna fue atendida por "Dra. Rodriguez"
|
||||
And yo no la atendi en esa visita
|
||||
When hago click en esa visita
|
||||
Then deberia poder ver el informe completo
|
||||
# Para continuidad de atencion
|
||||
|
||||
# ============================================
|
||||
# FILTROS Y NAVEGACION
|
||||
# ============================================
|
||||
|
||||
Scenario: Filtrar historial por tipo de servicio
|
||||
Given que estoy viendo el historial de "Luna"
|
||||
When filtro por servicio "Vacunacion"
|
||||
Then solo deberia ver visitas de vacunacion
|
||||
|
||||
Scenario: Filtrar por mis atenciones
|
||||
Given que estoy viendo el historial de "Luna"
|
||||
And Luna fue atendida por varios veterinarios
|
||||
When marco "Solo mis atenciones"
|
||||
Then solo deberia ver las visitas que yo realice
|
||||
|
||||
# ============================================
|
||||
# PERMISOS
|
||||
# ============================================
|
||||
|
||||
Rule: Veterinarios pueden ver historial de pacientes que atendieron
|
||||
|
||||
Scenario: Puedo ver historial de paciente que atendi
|
||||
Given que yo atendi a "Luna" al menos una vez
|
||||
When busco a Luna
|
||||
Then deberia poder ver su historial completo
|
||||
|
||||
Scenario: Puedo ver historial de paciente con solicitud pendiente
|
||||
Given que hay una solicitud pendiente para "Rocky"
|
||||
And la solicitud esta en mi zona
|
||||
When busco a Rocky
|
||||
Then deberia poder ver su historial
|
||||
# Para evaluar si acepto la solicitud
|
||||
@@ -0,0 +1,158 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/backoffice/01-gestion-solicitudes.md
|
||||
# Drive: 05. ATC - Operaciones/Procedimientos
|
||||
# Tests Backend: pytest tests/contracts/solicitudes/test_service_requests.py
|
||||
# Tests Frontend: npx playwright test admin-requests.spec.ts
|
||||
|
||||
Característica: Gestion de solicitudes de servicio
|
||||
|
||||
Como administrador del backoffice
|
||||
Quiero gestionar todas las solicitudes del sistema
|
||||
Para asegurar que se atiendan correctamente
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como administrador
|
||||
Y estoy en la seccion "Solicitudes" del backoffice
|
||||
|
||||
# ============================================
|
||||
# VER Y FILTRAR SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver listado de todas las solicitudes
|
||||
Cuando cargo la pagina de solicitudes
|
||||
Entonces deberia ver un listado paginado
|
||||
Y cada solicitud deberia mostrar:
|
||||
| campo |
|
||||
| ID |
|
||||
| Dueno |
|
||||
| Mascota |
|
||||
| Servicios |
|
||||
| Estado |
|
||||
| Fecha |
|
||||
|
||||
Esquema del escenario: Filtrar solicitudes por estado
|
||||
Cuando filtro por estado "<estado>"
|
||||
Entonces solo deberia ver solicitudes con estado "<estado>"
|
||||
|
||||
Ejemplos:
|
||||
| estado |
|
||||
| Pendiente |
|
||||
| Coordinado |
|
||||
| Pagado |
|
||||
| Completado |
|
||||
| Cancelado |
|
||||
|
||||
Escenario: Buscar solicitud especifica
|
||||
Cuando busco por email "maria@ejemplo.com"
|
||||
Entonces deberia ver solo solicitudes de ese dueno
|
||||
|
||||
Escenario: Filtrar por rango de fechas
|
||||
Cuando filtro desde "01/01/2024" hasta "31/01/2024"
|
||||
Entonces solo deberia ver solicitudes de enero 2024
|
||||
|
||||
# ============================================
|
||||
# ASIGNAR VETERINARIO MANUALMENTE
|
||||
# ============================================
|
||||
|
||||
Escenario: Asignar veterinario a solicitud pendiente
|
||||
Dado que hay una solicitud pendiente en "Palermo"
|
||||
Y no fue aceptada por ningun veterinario
|
||||
Cuando abro el detalle de la solicitud
|
||||
Y hago click en "Asignar veterinario"
|
||||
Entonces deberia ver lista de veterinarios con cobertura en Palermo
|
||||
|
||||
Cuando selecciono "Dra. Garcia"
|
||||
Y selecciono fecha "15 de enero" hora "10:00"
|
||||
Y confirmo la asignacion
|
||||
Entonces la solicitud deberia pasar a estado "Coordinado"
|
||||
Y deberia estar asignada a Dra. Garcia
|
||||
Y el dueno deberia recibir notificacion
|
||||
Y el veterinario deberia recibir notificacion
|
||||
|
||||
Escenario: Ver disponibilidad de veterinarios antes de asignar
|
||||
Dado que estoy asignando un veterinario
|
||||
Cuando veo la lista de veterinarios disponibles
|
||||
Entonces deberia ver para cada uno:
|
||||
| informacion |
|
||||
| Nombre |
|
||||
| Disponibilidad |
|
||||
| Visitas del dia |
|
||||
| Distancia a destino |
|
||||
|
||||
# ============================================
|
||||
# CAMBIAR ESTADO MANUALMENTE
|
||||
# ============================================
|
||||
|
||||
Escenario: Cambiar estado de solicitud
|
||||
Dado que hay una solicitud en estado "Coordinado"
|
||||
Y el pago se proceso pero el webhook fallo
|
||||
Cuando abro la solicitud
|
||||
Y hago click en "Cambiar estado"
|
||||
Y selecciono "Pagado"
|
||||
Y ingreso motivo "Pago confirmado manualmente - ID MP: 12345"
|
||||
Y confirmo el cambio
|
||||
Entonces la solicitud deberia pasar a "Pagado"
|
||||
Y el cambio deberia registrarse en el historial
|
||||
Y deberia quedar mi usuario como responsable del cambio
|
||||
|
||||
Regla: Solo ciertos cambios de estado son validos
|
||||
|
||||
Escenario: No puedo volver a estado anterior
|
||||
Dado que hay una solicitud en estado "Completado"
|
||||
Cuando intento cambiar el estado a "Pagado"
|
||||
Entonces deberia ver error "No se puede volver a un estado anterior"
|
||||
|
||||
Escenario: Puedo cancelar desde cualquier estado
|
||||
Dado que hay una solicitud en estado "Coordinado"
|
||||
Cuando cambio el estado a "Cancelado"
|
||||
Y ingreso motivo de cancelacion
|
||||
Entonces la solicitud deberia cancelarse
|
||||
|
||||
# ============================================
|
||||
# VER DETALLE COMPLETO
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver historial de cambios de una solicitud
|
||||
Dado que hay una solicitud con varios cambios de estado
|
||||
Cuando abro el detalle de la solicitud
|
||||
Y voy a la pestaña "Historial"
|
||||
Entonces deberia ver todos los cambios con:
|
||||
| campo |
|
||||
| Fecha y hora |
|
||||
| Estado anterior |
|
||||
| Estado nuevo |
|
||||
| Usuario |
|
||||
| Motivo |
|
||||
|
||||
Escenario: Ver informacion de pago
|
||||
Dado que hay una solicitud pagada
|
||||
Cuando abro el detalle
|
||||
Entonces deberia ver seccion "Pago" con:
|
||||
| campo |
|
||||
| Monto |
|
||||
| Fecha de pago |
|
||||
| Metodo |
|
||||
| ID operacion MP |
|
||||
| Estado del pago |
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Reasignar veterinario
|
||||
Dado que hay una solicitud asignada a "Dr. Lopez"
|
||||
Y Dr. Lopez no puede asistir
|
||||
Cuando abro la solicitud
|
||||
Y hago click en "Reasignar"
|
||||
Y selecciono otro veterinario
|
||||
Y confirmo
|
||||
Entonces Dr. Lopez deberia ser notificado de la desasignacion
|
||||
Y el nuevo vet deberia ser notificado
|
||||
Y el dueno deberia ser notificado del cambio
|
||||
|
||||
Escenario: Solicitud sin veterinarios disponibles
|
||||
Dado que hay una solicitud pendiente en una zona remota
|
||||
Y no hay veterinarios con cobertura en esa zona
|
||||
Cuando intento asignar veterinario
|
||||
Entonces deberia ver mensaje "No hay veterinarios disponibles"
|
||||
Y deberia poder expandir la busqueda a zonas cercanas
|
||||
@@ -0,0 +1,131 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/backoffice/02-gestion-usuarios.md
|
||||
# Drive: 05. ATC - Operaciones/Procedimientos
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_pet_owners.py
|
||||
# Tests Frontend: npx playwright test admin-users.spec.ts
|
||||
|
||||
Característica: Gestion de usuarios
|
||||
|
||||
Como administrador del backoffice
|
||||
Quiero gestionar duenos y veterinarios
|
||||
Para mantener la base de usuarios actualizada
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como administrador
|
||||
Y estoy en el backoffice
|
||||
|
||||
# ============================================
|
||||
# GESTION DE DUENOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Buscar dueno de mascota
|
||||
Dado que estoy en la seccion "Duenos"
|
||||
Cuando busco "maria@ejemplo.com"
|
||||
Entonces deberia ver a Maria Garcia en los resultados
|
||||
Y deberia ver sus mascotas listadas
|
||||
Y deberia ver cantidad de turnos
|
||||
|
||||
Escenario: Ver perfil completo de dueno
|
||||
Dado que encontre a "Maria Garcia"
|
||||
Cuando hago click en su perfil
|
||||
Entonces deberia ver:
|
||||
| seccion | contenido |
|
||||
| Datos personales | Nombre, email, telefono |
|
||||
| Direcciones | Direcciones registradas |
|
||||
| Mascotas | Lista de mascotas |
|
||||
| Historial | Solicitudes anteriores |
|
||||
| Pagos | Historial de pagos |
|
||||
|
||||
Escenario: Editar datos de dueno
|
||||
Dado que estoy viendo el perfil de un dueno
|
||||
Cuando hago click en "Editar"
|
||||
Y cambio el telefono a "1155559999"
|
||||
Y guardo los cambios
|
||||
Entonces el telefono deberia actualizarse
|
||||
Y deberia registrarse quien hizo el cambio
|
||||
|
||||
Esquema del escenario: Filtrar duenos por tipo
|
||||
Dado que estoy en la lista de duenos
|
||||
Cuando filtro por tipo "<tipo>"
|
||||
Entonces solo deberia ver usuarios <tipo>
|
||||
|
||||
Ejemplos:
|
||||
| tipo |
|
||||
| Registrados |
|
||||
| Invitados |
|
||||
|
||||
# ============================================
|
||||
# GESTION DE VETERINARIOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver lista de veterinarios
|
||||
Cuando voy a la seccion "Veterinarios"
|
||||
Entonces deberia ver listado de todos los vets
|
||||
Y cada vet deberia mostrar:
|
||||
| campo |
|
||||
| Nombre |
|
||||
| Matricula |
|
||||
| Zonas |
|
||||
| Estado |
|
||||
| Visitas mes |
|
||||
|
||||
Escenario: Agregar nuevo veterinario
|
||||
Dado que estoy en la seccion "Veterinarios"
|
||||
Cuando hago click en "Agregar veterinario"
|
||||
Y completo los datos:
|
||||
| campo | valor |
|
||||
| Nombre | Dr. Juan Perez |
|
||||
| Matricula | MV-12345 |
|
||||
| Email | jperez@ejemplo.com |
|
||||
| Telefono | 1155551234 |
|
||||
| Especialidades | Clinica general |
|
||||
Y selecciono zonas de cobertura:
|
||||
| zona |
|
||||
| Palermo |
|
||||
| Recoleta |
|
||||
Y genero credenciales de acceso
|
||||
Y guardo
|
||||
Entonces deberia crearse el veterinario
|
||||
Y deberia poder loguearse con sus credenciales
|
||||
|
||||
Escenario: Desactivar veterinario sin citas pendientes
|
||||
Dado que el veterinario "Dr. Lopez" no tiene citas pendientes
|
||||
Cuando abro su perfil
|
||||
Y hago click en "Desactivar"
|
||||
Y confirmo la desactivacion
|
||||
Entonces Dr. Lopez deberia estar inactivo
|
||||
Y no deberia recibir nuevas solicitudes
|
||||
Y no deberia poder loguearse
|
||||
|
||||
Escenario: Intentar desactivar veterinario con citas pendientes
|
||||
Dado que el veterinario "Dra. Garcia" tiene 3 citas pendientes
|
||||
Cuando intento desactivarla
|
||||
Entonces deberia ver advertencia "Tiene 3 citas pendientes"
|
||||
Y deberia ver opciones:
|
||||
| opcion |
|
||||
| Reasignar citas y desactivar |
|
||||
| Cancelar |
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Fusionar cuentas duplicadas
|
||||
Dado que hay dos cuentas para el mismo dueno:
|
||||
| cuenta | email | mascotas |
|
||||
| Cuenta1 | maria@gmail.com | Luna |
|
||||
| Cuenta2 | maria@hotmail.com | Rocky |
|
||||
Cuando selecciono ambas cuentas
|
||||
Y hago click en "Fusionar"
|
||||
Y elijo Cuenta1 como principal
|
||||
Y confirmo
|
||||
Entonces deberia existir solo Cuenta1
|
||||
Y deberia tener ambas mascotas
|
||||
Y el historial deberia combinarse
|
||||
|
||||
Escenario: Convertir invitado a registrado
|
||||
Dado que hay un usuario invitado con email "invitado@test.com"
|
||||
Cuando abro su perfil
|
||||
Y hago click en "Enviar invitacion a registrarse"
|
||||
Entonces deberia enviarse email con link de registro
|
||||
Y el usuario podra crear contraseña y activar cuenta
|
||||
@@ -0,0 +1,131 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/backoffice/03-gestion-servicios.md
|
||||
# Drive: 08. IT y Producto/Catalogo Servicios
|
||||
# Tests Backend: pytest tests/contracts/productos/test_services.py
|
||||
# Tests Frontend: npx playwright test admin-services.spec.ts
|
||||
|
||||
Característica: Gestion de servicios y precios
|
||||
|
||||
Como administrador
|
||||
Quiero gestionar el catalogo de servicios
|
||||
Para mantener la oferta actualizada
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como administrador
|
||||
Y estoy en la seccion "Servicios"
|
||||
|
||||
# ============================================
|
||||
# VER CATALOGO DE SERVICIOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver listado de servicios
|
||||
Cuando cargo la pagina de servicios
|
||||
Entonces deberia ver todos los servicios organizados por categoria
|
||||
Y cada servicio deberia mostrar:
|
||||
| campo |
|
||||
| Nombre |
|
||||
| Categoria |
|
||||
| Tipo mascota |
|
||||
| Precio actual |
|
||||
| Estado |
|
||||
|
||||
Esquema del escenario: Filtrar servicios
|
||||
Cuando filtro por <filtro> "<valor>"
|
||||
Entonces solo deberia ver servicios que coincidan
|
||||
|
||||
Ejemplos:
|
||||
| filtro | valor |
|
||||
| categoria | Vacunacion |
|
||||
| tipo_mascota | Gato |
|
||||
| estado | Activo |
|
||||
|
||||
# ============================================
|
||||
# CREAR Y EDITAR SERVICIOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Agregar nuevo servicio
|
||||
Cuando hago click en "Agregar servicio"
|
||||
Y completo los datos:
|
||||
| campo | valor |
|
||||
| Nombre | Vacuna Quintuple Felina |
|
||||
| Descripcion | Protege contra 5 enfermedades |
|
||||
| Categoria | Vacunacion |
|
||||
| Tipo mascota | Gato |
|
||||
| Precio | 15000 |
|
||||
| Duracion | 30 minutos |
|
||||
Y guardo el servicio
|
||||
Entonces el servicio deberia crearse
|
||||
Y deberia aparecer en el turnero para gatos
|
||||
|
||||
Escenario: Editar servicio existente
|
||||
Dado que existe el servicio "Consulta clinica"
|
||||
Cuando abro el servicio
|
||||
Y cambio la descripcion
|
||||
Y guardo
|
||||
Entonces la descripcion deberia actualizarse
|
||||
Y las solicitudes existentes no deberian afectarse
|
||||
|
||||
Escenario: Desactivar servicio
|
||||
Dado que existe el servicio "Servicio Antiguo"
|
||||
Cuando abro el servicio
|
||||
Y hago click en "Desactivar"
|
||||
Y confirmo
|
||||
Entonces el servicio no deberia aparecer en el turnero
|
||||
Y las solicitudes existentes deberian mantenerse
|
||||
|
||||
# ============================================
|
||||
# GESTION DE PRECIOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Actualizar precio de servicio
|
||||
Dado que "Consulta clinica" tiene precio actual de 10000
|
||||
Cuando abro el servicio
|
||||
Y voy a la seccion "Precios"
|
||||
Y hago click en "Agregar precio"
|
||||
Y ingreso nuevo precio 12000
|
||||
Y selecciono fecha de vigencia "01/02/2024"
|
||||
Y guardo
|
||||
Entonces deberia crearse el nuevo precio
|
||||
Y el precio anterior deberia quedar en historial
|
||||
Y el nuevo precio deberia aplicar desde la fecha indicada
|
||||
|
||||
Escenario: Ver historial de precios
|
||||
Dado que un servicio tuvo varios cambios de precio
|
||||
Cuando veo la seccion "Precios"
|
||||
Entonces deberia ver historial con:
|
||||
| campo |
|
||||
| Precio |
|
||||
| Fecha desde |
|
||||
| Fecha hasta |
|
||||
| Usuario |
|
||||
|
||||
Regla: El precio se congela al crear la solicitud
|
||||
|
||||
Escenario: Cambio de precio no afecta solicitudes existentes
|
||||
Dado que hay una solicitud pendiente con "Consulta clinica" a 10000
|
||||
Cuando cambio el precio de "Consulta clinica" a 12000
|
||||
Entonces la solicitud deberia mantener el precio de 10000
|
||||
|
||||
# ============================================
|
||||
# CONFIGURAR COMBOS Y DEPENDENCIAS
|
||||
# ============================================
|
||||
|
||||
Escenario: Crear combo de servicios
|
||||
Cuando voy a "Combos"
|
||||
Y hago click en "Agregar combo"
|
||||
Y configuro:
|
||||
| campo | valor |
|
||||
| Nombre | Plan Preventivo Felino |
|
||||
| Servicios | Vacunacion, Desparasitacion, Antipulgas |
|
||||
| Precio combo | 25000 |
|
||||
| Descuento | 20% |
|
||||
Y guardo
|
||||
Entonces el combo deberia crearse
|
||||
Y deberia aplicarse automaticamente cuando se seleccionen esos servicios
|
||||
|
||||
Escenario: Configurar servicio dependiente
|
||||
Dado que "Vacunacion" requiere "Consulta clinica"
|
||||
Cuando configuro la dependencia
|
||||
Entonces al seleccionar "Vacunacion" en el turnero
|
||||
Y "Consulta clinica" deberia agregarse automaticamente
|
||||
Y no deberia poder quitarse
|
||||
141
atlas/book/gherkin-samples/es/backoffice/04-reembolsos.feature
Normal file
141
atlas/book/gherkin-samples/es/backoffice/04-reembolsos.feature
Normal file
@@ -0,0 +1,141 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/backoffice/04-reembolsos.md
|
||||
# Drive: 07. Finanzas y contabilidad/Reembolsos
|
||||
# Tests Backend: pytest tests/contracts/payments/test_refunds.py
|
||||
# Tests Frontend: npx playwright test admin-refunds.spec.ts
|
||||
|
||||
Característica: Proceso de reembolso
|
||||
|
||||
Como administrador
|
||||
Quiero procesar reembolsos de pagos
|
||||
Para resolver cancelaciones y problemas
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como administrador
|
||||
Y estoy en el backoffice
|
||||
|
||||
# ============================================
|
||||
# IDENTIFICAR PAGO A REEMBOLSAR
|
||||
# ============================================
|
||||
|
||||
Escenario: Buscar solicitud pagada por ID de operacion
|
||||
Cuando busco por ID de Mercado Pago "12345678"
|
||||
Entonces deberia encontrar la solicitud asociada
|
||||
Y deberia ver los detalles del pago
|
||||
|
||||
Escenario: Ver detalles de pago
|
||||
Dado que encontre una solicitud pagada
|
||||
Cuando veo la seccion de pago
|
||||
Entonces deberia ver:
|
||||
| campo |
|
||||
| Monto pagado |
|
||||
| Fecha de pago |
|
||||
| Metodo de pago |
|
||||
| ID operacion MP |
|
||||
| Estado en MP |
|
||||
|
||||
# ============================================
|
||||
# PROCESAR REEMBOLSO
|
||||
# ============================================
|
||||
|
||||
Escenario: Reembolso total exitoso
|
||||
Dado que hay una solicitud pagada por 15000
|
||||
Y la visita fue cancelada
|
||||
Cuando abro la solicitud
|
||||
Y hago click en "Procesar reembolso"
|
||||
Y selecciono "Reembolso total"
|
||||
Y ingreso motivo "Cancelacion por indisponibilidad del veterinario"
|
||||
Y confirmo el reembolso
|
||||
Entonces deberia enviarse la solicitud de reembolso a Mercado Pago
|
||||
Y deberia ver mensaje "Reembolso en proceso"
|
||||
Y la solicitud deberia registrar el reembolso
|
||||
Y el dueno deberia recibir email de confirmacion
|
||||
|
||||
Escenario: Reembolso parcial
|
||||
Dado que hay una solicitud pagada por 20000
|
||||
Y solo se realizo parte del servicio
|
||||
Cuando proceso reembolso parcial por 10000
|
||||
Y ingreso motivo "Servicio parcialmente completado"
|
||||
Y confirmo
|
||||
Entonces deberia procesarse reembolso por 10000
|
||||
Y deberia quedar registro del monto reembolsado
|
||||
Y deberia quedar registro del monto retenido
|
||||
|
||||
# ============================================
|
||||
# TIEMPOS DE ACREDITACION
|
||||
# ============================================
|
||||
|
||||
Esquema del escenario: Informar tiempo de acreditacion segun metodo
|
||||
Dado que el pago original fue con "<metodo>"
|
||||
Cuando proceso el reembolso
|
||||
Entonces deberia informar al usuario:
|
||||
"""
|
||||
El reembolso se acreditara en <tiempo>
|
||||
"""
|
||||
|
||||
Ejemplos:
|
||||
| metodo | tiempo |
|
||||
| Tarjeta credito | 1-2 resumenes de cuenta |
|
||||
| Tarjeta debito | 5-10 dias habiles |
|
||||
| Dinero en cuenta MP | forma inmediata |
|
||||
| Transferencia | 5-10 dias habiles |
|
||||
|
||||
# ============================================
|
||||
# VALIDACIONES Y ERRORES
|
||||
# ============================================
|
||||
|
||||
Escenario: No puedo reembolsar mas del monto pagado
|
||||
Dado que hay una solicitud pagada por 15000
|
||||
Cuando intento reembolsar 20000
|
||||
Entonces deberia ver error "El monto supera el pago original"
|
||||
|
||||
Escenario: Reembolso duplicado
|
||||
Dado que ya procese un reembolso total para una solicitud
|
||||
Cuando intento procesar otro reembolso
|
||||
Entonces deberia ver error "Esta solicitud ya fue reembolsada"
|
||||
|
||||
Escenario: Pago fuera de plazo de reembolso
|
||||
Dado que hay un pago de hace 200 dias
|
||||
Cuando intento reembolsar
|
||||
Entonces deberia ver advertencia "Fuera de plazo de reembolso de MP (180 dias)"
|
||||
Y deberia sugerir "Contactar al dueno para solucion alternativa"
|
||||
|
||||
# ============================================
|
||||
# SEGUIMIENTO
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver estado del reembolso
|
||||
Dado que procese un reembolso hace 2 dias
|
||||
Cuando veo el detalle del reembolso
|
||||
Entonces deberia ver el estado actual en Mercado Pago
|
||||
Y deberia ver historial de estados:
|
||||
| estado | fecha |
|
||||
| Solicitado | 01/01/2024 |
|
||||
| En proceso | 01/01/2024 |
|
||||
| Completado | 03/01/2024 |
|
||||
|
||||
Escenario: Reembolso rechazado por MP
|
||||
Dado que Mercado Pago rechazo el reembolso
|
||||
Cuando veo el estado
|
||||
Entonces deberia ver "Reembolso rechazado"
|
||||
Y deberia ver el motivo del rechazo
|
||||
Y deberia poder contactar al dueno con alternativas
|
||||
|
||||
# ============================================
|
||||
# REGISTRO Y AUDITORIA
|
||||
# ============================================
|
||||
|
||||
Regla: Todos los reembolsos quedan registrados
|
||||
|
||||
Escenario: Ver historial de reembolsos
|
||||
Cuando voy a "Reportes" -> "Reembolsos"
|
||||
Entonces deberia ver lista de todos los reembolsos
|
||||
Y cada uno deberia mostrar:
|
||||
| campo |
|
||||
| Solicitud |
|
||||
| Monto original |
|
||||
| Monto reembolso |
|
||||
| Motivo |
|
||||
| Procesado por |
|
||||
| Fecha |
|
||||
| Estado |
|
||||
155
atlas/book/gherkin-samples/es/backoffice/05-reportes.feature
Normal file
155
atlas/book/gherkin-samples/es/backoffice/05-reportes.feature
Normal file
@@ -0,0 +1,155 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/backoffice/05-reportes.md
|
||||
# Drive: 07. Finanzas y contabilidad/Reportes
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_stats.py
|
||||
# Tests Frontend: npx playwright test admin-reports.spec.ts
|
||||
|
||||
Característica: Reportes y dashboard
|
||||
|
||||
Como administrador o gerente
|
||||
Quiero ver metricas y generar reportes
|
||||
Para tomar decisiones informadas
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como administrador
|
||||
Y estoy en el backoffice
|
||||
|
||||
# ============================================
|
||||
# DASHBOARD
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver dashboard principal
|
||||
Cuando accedo al dashboard
|
||||
Entonces deberia ver metricas resumidas:
|
||||
| metrica | periodo |
|
||||
| Solicitudes nuevas | Hoy |
|
||||
| Visitas completadas | Semana |
|
||||
| Ingresos | Mes |
|
||||
| Veterinarios activos | Actual |
|
||||
| Tasa de conversion | Mes |
|
||||
|
||||
Escenario: Dashboard actualiza periodicamente
|
||||
Dado que estoy en el dashboard
|
||||
Cuando pasan 5 minutos
|
||||
Entonces los datos deberian actualizarse
|
||||
Y deberia ver indicador de ultima actualizacion
|
||||
|
||||
Escenario: Ver grafico de tendencia
|
||||
Cuando veo el grafico de solicitudes
|
||||
Entonces deberia ver la evolucion de los ultimos 30 dias
|
||||
Y deberia poder comparar con periodo anterior
|
||||
|
||||
# ============================================
|
||||
# REPORTE DE SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Escenario: Generar reporte de solicitudes
|
||||
Cuando voy a "Reportes" -> "Solicitudes"
|
||||
Y selecciono periodo "Enero 2024"
|
||||
Y hago click en "Generar"
|
||||
Entonces deberia ver tabla con solicitudes del periodo
|
||||
Y deberia ver totales por estado:
|
||||
| estado | cantidad |
|
||||
| Pendiente | X |
|
||||
| Coordinado | X |
|
||||
| Pagado | X |
|
||||
| Completado | X |
|
||||
| Cancelado | X |
|
||||
|
||||
Escenario: Filtrar reporte por multiples criterios
|
||||
Cuando genero reporte con filtros:
|
||||
| filtro | valor |
|
||||
| Periodo | Enero 2024 |
|
||||
| Zona | Palermo |
|
||||
| Veterinario | Dra. Garcia |
|
||||
| Estado | Completado |
|
||||
Entonces deberia ver solo solicitudes que cumplan todos los criterios
|
||||
|
||||
# ============================================
|
||||
# REPORTE DE INGRESOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver ingresos por periodo
|
||||
Cuando voy a "Reportes" -> "Ingresos"
|
||||
Y selecciono "Ultimo trimestre"
|
||||
Entonces deberia ver:
|
||||
| dato |
|
||||
| Ingresos totales |
|
||||
| Cantidad de pagos |
|
||||
| Ticket promedio |
|
||||
| Reembolsos realizados |
|
||||
| Ingreso neto |
|
||||
|
||||
Escenario: Ingresos agrupados por veterinario
|
||||
Cuando agrupo el reporte por "Veterinario"
|
||||
Entonces deberia ver para cada vet:
|
||||
| dato |
|
||||
| Visitas completadas |
|
||||
| Ingresos generados |
|
||||
| Porcentaje del total |
|
||||
Y deberian estar ordenados de mayor a menor
|
||||
|
||||
Escenario: Ingresos agrupados por servicio
|
||||
Cuando agrupo el reporte por "Servicio"
|
||||
Entonces deberia ver los servicios mas vendidos
|
||||
Y deberia ver el ingreso de cada uno
|
||||
Y deberia ver la cantidad de veces realizado
|
||||
|
||||
# ============================================
|
||||
# REPORTE DE VETERINARIOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver performance de veterinarios
|
||||
Cuando voy a "Reportes" -> "Veterinarios"
|
||||
Entonces deberia ver para cada veterinario:
|
||||
| metrica |
|
||||
| Visitas completadas |
|
||||
| Calificacion promedio |
|
||||
| Tasa de aceptacion |
|
||||
| Tasa de cancelacion |
|
||||
| Ingresos generados |
|
||||
|
||||
Escenario: Identificar veterinarios con problemas
|
||||
Dado que el reporte muestra la tasa de cancelacion
|
||||
Cuando ordeno por "Tasa de cancelacion" descendente
|
||||
Entonces deberia ver primero los vets con mas cancelaciones
|
||||
Y deberia poder investigar los motivos
|
||||
|
||||
# ============================================
|
||||
# EXPORTACION
|
||||
# ============================================
|
||||
|
||||
Esquema del escenario: Exportar reporte en diferentes formatos
|
||||
Dado que tengo un reporte generado
|
||||
Cuando hago click en "Exportar"
|
||||
Y selecciono formato "<formato>"
|
||||
Entonces deberia descargarse el archivo en formato <formato>
|
||||
|
||||
Ejemplos:
|
||||
| formato |
|
||||
| CSV |
|
||||
| Excel |
|
||||
| PDF |
|
||||
|
||||
Escenario: Exportar reporte grande de forma asincrona
|
||||
Dado que genere un reporte con mas de 10000 registros
|
||||
Cuando hago click en "Exportar"
|
||||
Entonces deberia ver mensaje "Generando exportacion..."
|
||||
Y deberia recibir notificacion cuando este listo
|
||||
Y deberia poder descargar desde el centro de notificaciones
|
||||
|
||||
# ============================================
|
||||
# REPORTES PROGRAMADOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Programar reporte semanal
|
||||
Cuando voy a "Reportes" -> "Programados"
|
||||
Y creo nuevo reporte programado:
|
||||
| campo | valor |
|
||||
| Tipo | Ingresos |
|
||||
| Frecuencia | Semanal |
|
||||
| Dia | Lunes |
|
||||
| Destinatarios | gerencia@ejemplo.com |
|
||||
Y guardo
|
||||
Entonces deberia enviarse el reporte cada lunes
|
||||
Y los destinatarios deberian recibirlo por email
|
||||
92
atlas/book/gherkin-samples/es/pet-owner/01-registro.feature
Normal file
92
atlas/book/gherkin-samples/es/pet-owner/01-registro.feature
Normal file
@@ -0,0 +1,92 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/pet-owner/01-registro.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/common/test_users.py
|
||||
# Tests Frontend: npx playwright test auth.spec.ts
|
||||
|
||||
Característica: Registro de usuario
|
||||
|
||||
Como visitante de la plataforma
|
||||
Quiero poder crear una cuenta
|
||||
Para gestionar mis mascotas y reservar turnos
|
||||
|
||||
# ============================================
|
||||
# CAMINO FELIZ
|
||||
# ============================================
|
||||
|
||||
Escenario: Registro exitoso con datos validos
|
||||
Dado que estoy en la pagina de registro
|
||||
Cuando ingreso email "nuevo@ejemplo.com"
|
||||
Y ingreso contraseña "Password123"
|
||||
Y confirmo contraseña "Password123"
|
||||
Y acepto los terminos y condiciones
|
||||
Y hago click en "Crear cuenta"
|
||||
Entonces deberia ver mensaje "Te enviamos un email de verificacion"
|
||||
Y deberia recibir email de verificacion
|
||||
|
||||
Escenario: Verificar email y activar cuenta
|
||||
Dado que me registre con email "nuevo@ejemplo.com"
|
||||
Y recibi el email de verificacion
|
||||
Cuando hago click en el link de verificacion
|
||||
Entonces mi cuenta deberia estar activa
|
||||
Y deberia ser redirigido al dashboard
|
||||
|
||||
# ============================================
|
||||
# VALIDACIONES
|
||||
# ============================================
|
||||
|
||||
Esquema del escenario: Registro con datos invalidos
|
||||
Dado que estoy en la pagina de registro
|
||||
Cuando ingreso email "<email>"
|
||||
Y ingreso contraseña "<password>"
|
||||
Y confirmo contraseña "<confirmacion>"
|
||||
Y hago click en "Crear cuenta"
|
||||
Entonces deberia ver error "<mensaje_error>"
|
||||
|
||||
Ejemplos:
|
||||
| email | password | confirmacion | mensaje_error |
|
||||
| invalido | Password123 | Password123 | Email invalido |
|
||||
| test@test.com | 123 | 123 | Contraseña muy corta |
|
||||
| test@test.com | password | password | Debe contener al menos un numero |
|
||||
| test@test.com | Password123 | Diferente123 | Las contraseñas no coinciden |
|
||||
|
||||
Escenario: Registro con email ya existente
|
||||
Dado que existe un usuario con email "existente@ejemplo.com"
|
||||
Y estoy en la pagina de registro
|
||||
Cuando ingreso email "existente@ejemplo.com"
|
||||
Y completo el resto del formulario correctamente
|
||||
Y hago click en "Crear cuenta"
|
||||
Entonces deberia ver error "Este email ya esta registrado"
|
||||
Y deberia ver link "Recuperar contraseña"
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Registro linkea con cuenta invitado existente
|
||||
# Usuario que reservo turno como invitado y ahora quiere registrarse
|
||||
Dado que existe un usuario invitado con email "invitado@ejemplo.com"
|
||||
Y ese usuario tiene una mascota "Luna" registrada
|
||||
Y estoy en la pagina de registro
|
||||
Cuando me registro con email "invitado@ejemplo.com"
|
||||
Y verifico mi cuenta
|
||||
Entonces deberia ver mi mascota "Luna" en el dashboard
|
||||
Y deberia ver mis turnos anteriores
|
||||
|
||||
Escenario: Registro desde flujo de turnero
|
||||
# Usuario empezo a reservar turno y decide crear cuenta
|
||||
Dado que estoy en el paso final del turnero
|
||||
Y ingrese mis datos de contacto
|
||||
Cuando hago click en "Crear cuenta para guardar mis datos"
|
||||
Entonces deberia ver formulario simplificado
|
||||
Y mi email ya deberia estar pre-llenado
|
||||
Y solo deberia ingresar contraseña
|
||||
|
||||
Escenario: Reenviar email de verificacion
|
||||
Dado que me registre pero no verifique mi cuenta
|
||||
Y estoy en la pagina de login
|
||||
Cuando intento iniciar sesion
|
||||
Entonces deberia ver "Tu cuenta no esta verificada"
|
||||
Y deberia ver boton "Reenviar email"
|
||||
Cuando hago click en "Reenviar email"
|
||||
Entonces deberia recibir nuevo email de verificacion
|
||||
@@ -0,0 +1,141 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/pet-owner/02-reservar-turno.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/workflows/test_turnero_general.py
|
||||
# Tests Frontend: npx playwright test turnero.spec.ts
|
||||
# Relacionado: def/work_plan/10-flow-turnero.md
|
||||
|
||||
Característica: Reservar turno veterinario (Turnero)
|
||||
|
||||
Como dueno de mascota
|
||||
Quiero reservar un turno veterinario a domicilio
|
||||
Para que atiendan a mi mascota sin salir de casa
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy en la pagina del turnero
|
||||
|
||||
# ============================================
|
||||
# VERIFICACION DE COBERTURA
|
||||
# ============================================
|
||||
|
||||
Escenario: Verificar cobertura en zona disponible
|
||||
Cuando ingreso direccion "Av Santa Fe 1234, CABA"
|
||||
Entonces deberia ver mensaje "Tenemos cobertura en tu zona"
|
||||
Y deberia poder continuar al siguiente paso
|
||||
|
||||
Escenario: Zona sin cobertura
|
||||
Cuando ingreso direccion "Calle Principal 100, Ushuaia"
|
||||
Entonces deberia ver mensaje "Aun no tenemos cobertura en tu zona"
|
||||
Y deberia ver formulario "Avisame cuando lleguen"
|
||||
|
||||
# ============================================
|
||||
# FLUJO COMPLETO POR TIPO DE USUARIO
|
||||
# ============================================
|
||||
|
||||
Esquema del escenario: Reservar turno como <tipo_usuario>
|
||||
Dado que soy un usuario <tipo_usuario>
|
||||
Y tengo cobertura en mi zona
|
||||
Cuando completo los datos de mi mascota:
|
||||
| campo | valor |
|
||||
| nombre | Luna |
|
||||
| tipo | Gato |
|
||||
| edad | 2 años |
|
||||
| castrada | Si |
|
||||
Y selecciono servicios:
|
||||
| servicio |
|
||||
| Vacunacion |
|
||||
Y selecciono fechas preferidas:
|
||||
| fecha | franja |
|
||||
| 2024-01-15 | Mañana |
|
||||
| 2024-01-16 | Tarde |
|
||||
Y completo datos de contacto con email "<email>"
|
||||
Y envio la solicitud
|
||||
Entonces deberia crearse una solicitud en estado "Pendiente"
|
||||
Y el dueno deberia ser <estado_dueno>
|
||||
Y deberia recibir email de confirmacion
|
||||
|
||||
Ejemplos:
|
||||
| tipo_usuario | email | estado_dueno |
|
||||
| invitado | nuevo@test.com | creado como invitado |
|
||||
| registrado | user@test.com | mi cuenta existente |
|
||||
| recurrente | conocido@test.com | identificado por email |
|
||||
|
||||
# ============================================
|
||||
# SELECCION DE SERVICIOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Servicios filtrados por tipo de mascota
|
||||
Dado que agregue una mascota tipo "Gato"
|
||||
Cuando veo los servicios disponibles
|
||||
Entonces deberia ver "Vacuna triple felina"
|
||||
Y deberia ver "Vacuna antirabica"
|
||||
Pero no deberia ver "Vacuna sextuple canina"
|
||||
|
||||
Escenario: Consulta clinica se agrega automaticamente con vacunacion
|
||||
Dado que estoy seleccionando servicios
|
||||
Cuando selecciono "Vacunacion"
|
||||
Entonces "Consulta clinica" deberia agregarse automaticamente
|
||||
Y deberia ver nota "Incluye revision general"
|
||||
Y no deberia poder quitar "Consulta clinica"
|
||||
|
||||
Escenario: Servicios combo con descuento
|
||||
Dado que estoy seleccionando servicios
|
||||
Cuando agrego los siguientes servicios:
|
||||
| servicio |
|
||||
| Vacunacion |
|
||||
| Desparasitacion |
|
||||
| Antipulgas |
|
||||
Entonces deberia ver "Plan preventivo completo"
|
||||
Y el total deberia incluir descuento de combo
|
||||
|
||||
Escenario: Castracion no disponible para mascota castrada
|
||||
Dado que mi mascota esta marcada como castrada
|
||||
Cuando veo los servicios disponibles
|
||||
Entonces no deberia ver "Castracion"
|
||||
|
||||
# ============================================
|
||||
# DATOS DE CONTACTO Y CUENTA
|
||||
# ============================================
|
||||
|
||||
Escenario: Pre-llenado de datos para usuario logueado
|
||||
Dado que estoy logueado como "maria@ejemplo.com"
|
||||
Y tengo registrada mascota "Firulais"
|
||||
Cuando inicio el flujo de turnero
|
||||
Entonces mi direccion deberia estar pre-llenada
|
||||
Y deberia poder seleccionar "Firulais" de mis mascotas
|
||||
Y mis datos de contacto ya deberian estar completos
|
||||
|
||||
Escenario: Detectar usuario existente por email
|
||||
Dado que soy usuario invitado
|
||||
Y existe una cuenta con email "existente@ejemplo.com"
|
||||
Cuando ingreso email "existente@ejemplo.com" en datos de contacto
|
||||
Entonces deberia ver "Ya tenes cuenta con este email"
|
||||
Y deberia ver opciones:
|
||||
| opcion |
|
||||
| Iniciar sesion |
|
||||
| Continuar como invitado |
|
||||
|
||||
# ============================================
|
||||
# EDGE CASES
|
||||
# ============================================
|
||||
|
||||
Escenario: Usuario abandona flujo a mitad
|
||||
Dado que complete los datos de mascota
|
||||
Y cerre el navegador sin enviar
|
||||
Cuando vuelvo a la pagina del turnero
|
||||
Entonces deberia poder recuperar mi progreso
|
||||
# Nota: datos guardados en localStorage o session
|
||||
|
||||
Escenario: Multiples mascotas en una solicitud
|
||||
Dado que quiero atender a 2 mascotas
|
||||
Cuando agrego mascota "Luna" tipo "Gato"
|
||||
Y agrego mascota "Rocky" tipo "Perro"
|
||||
Y selecciono servicios para cada una
|
||||
Entonces deberia crearse una solicitud con 2 mascotas
|
||||
Y el precio deberia reflejar ambas
|
||||
|
||||
Escenario: Franja horaria especifica
|
||||
Dado que solo puedo por la mañana
|
||||
Cuando selecciono franja "Mañana (9-12hs)"
|
||||
Entonces la solicitud deberia registrar esa preferencia
|
||||
# Nota: Es preferencia, no garantia
|
||||
@@ -0,0 +1,154 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/pet-owner/03-gestion-mascotas.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_pets.py
|
||||
# Tests Frontend: npx playwright test pets.spec.ts
|
||||
|
||||
Característica: Gestion de mascotas
|
||||
|
||||
Como dueno de mascota registrado
|
||||
Quiero gestionar la informacion de mis mascotas
|
||||
Para tenerla actualizada y acceder a su historial medico
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como dueno de mascota
|
||||
Y estoy en la seccion "Mis mascotas"
|
||||
|
||||
# ============================================
|
||||
# AGREGAR MASCOTA
|
||||
# ============================================
|
||||
|
||||
Escenario: Agregar mascota con datos minimos
|
||||
Cuando hago click en "Agregar mascota"
|
||||
Y completo el formulario:
|
||||
| campo | valor |
|
||||
| nombre | Luna |
|
||||
| tipo | Gato |
|
||||
Y hago click en "Guardar"
|
||||
Entonces deberia ver "Luna" en mi lista de mascotas
|
||||
Y Luna deberia aparecer disponible en el turnero
|
||||
|
||||
Escenario: Agregar mascota con datos completos
|
||||
Cuando hago click en "Agregar mascota"
|
||||
Y completo el formulario:
|
||||
| campo | valor |
|
||||
| nombre | Rocky |
|
||||
| tipo | Perro |
|
||||
| raza | Labrador |
|
||||
| fecha_nacimiento | 2020-03-15 |
|
||||
| peso | 25 |
|
||||
| sexo | Macho |
|
||||
| castrado | Si |
|
||||
Y subo una foto de Rocky
|
||||
Y hago click en "Guardar"
|
||||
Entonces deberia ver "Rocky" con su foto en mi lista
|
||||
Y deberia ver badge "Castrado"
|
||||
|
||||
Esquema del escenario: Validacion de datos de mascota
|
||||
Cuando intento agregar mascota con <campo> igual a "<valor>"
|
||||
Entonces deberia ver error "<mensaje>"
|
||||
|
||||
Ejemplos:
|
||||
| campo | valor | mensaje |
|
||||
| nombre | | El nombre es obligatorio |
|
||||
| nombre | A | Nombre muy corto |
|
||||
| tipo | | Selecciona el tipo |
|
||||
| peso | -5 | El peso debe ser positivo |
|
||||
| peso | 500 | Peso fuera de rango |
|
||||
|
||||
# ============================================
|
||||
# EDITAR MASCOTA
|
||||
# ============================================
|
||||
|
||||
Escenario: Editar peso de mascota
|
||||
Dado que tengo una mascota "Luna" con peso 4kg
|
||||
Cuando edito a Luna
|
||||
Y cambio el peso a 5kg
|
||||
Y guardo los cambios
|
||||
Entonces Luna deberia mostrar peso "5 kg"
|
||||
|
||||
Escenario: Marcar mascota como castrada
|
||||
Dado que tengo una mascota "Rocky" no castrado
|
||||
Cuando edito a Rocky
|
||||
Y marco "Esta castrado"
|
||||
Y guardo los cambios
|
||||
Entonces Rocky deberia mostrar badge "Castrado"
|
||||
Y el servicio "Castracion" no deberia aparecer para Rocky en el turnero
|
||||
|
||||
Escenario: Actualizar foto de mascota
|
||||
Dado que tengo una mascota "Luna" sin foto
|
||||
Cuando edito a Luna
|
||||
Y subo una nueva foto
|
||||
Y guardo los cambios
|
||||
Entonces deberia ver la foto de Luna en su tarjeta
|
||||
|
||||
# ============================================
|
||||
# ELIMINAR MASCOTA
|
||||
# ============================================
|
||||
|
||||
Escenario: Eliminar mascota sin historial
|
||||
Dado que tengo una mascota "Nuevo" sin visitas
|
||||
Cuando hago click en "Eliminar" para Nuevo
|
||||
Y confirmo la eliminacion
|
||||
Entonces Nuevo no deberia aparecer en mi lista
|
||||
# Nota: Es soft delete
|
||||
|
||||
Escenario: Eliminar mascota con historial medico
|
||||
Dado que tengo una mascota "Luna" con visitas anteriores
|
||||
Cuando hago click en "Eliminar" para Luna
|
||||
Entonces deberia ver advertencia "Luna tiene historial medico"
|
||||
Y deberia ver "El historial se conservara pero no podras verlo"
|
||||
Cuando confirmo la eliminacion
|
||||
Entonces Luna no deberia aparecer en mi lista
|
||||
|
||||
Escenario: No puedo eliminar mascota con turno pendiente
|
||||
Dado que tengo una mascota "Rocky" con turno pendiente
|
||||
Cuando intento eliminar a Rocky
|
||||
Entonces deberia ver error "Rocky tiene turnos pendientes"
|
||||
Y deberia ver sugerencia "Cancela los turnos primero"
|
||||
|
||||
# ============================================
|
||||
# VER HISTORIAL MEDICO
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver historial de visitas de mascota
|
||||
Dado que tengo una mascota "Luna" con 3 visitas completadas
|
||||
Cuando hago click en Luna
|
||||
Y voy a la seccion "Historial"
|
||||
Entonces deberia ver 3 visitas listadas
|
||||
Y deberian estar ordenadas por fecha descendente
|
||||
|
||||
Escenario: Ver detalle de visita
|
||||
Dado que tengo una mascota "Luna" con visitas
|
||||
Cuando veo el historial de Luna
|
||||
Y hago click en la primera visita
|
||||
Entonces deberia ver:
|
||||
| campo |
|
||||
| Fecha |
|
||||
| Veterinario |
|
||||
| Diagnostico |
|
||||
| Tratamiento |
|
||||
| Medicamentos |
|
||||
|
||||
Escenario: Mascota sin historial
|
||||
Dado que tengo una mascota "Nuevo" recien agregada
|
||||
Cuando veo el perfil de Nuevo
|
||||
Entonces la seccion "Historial" deberia estar vacia
|
||||
Y deberia ver mensaje "Aun no hay visitas registradas"
|
||||
Y deberia ver boton "Reservar primer turno"
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Mascota heredada de cuenta invitado
|
||||
Dado que me registre con email "juan@test.com"
|
||||
Y previamente reserve turno como invitado para "Firulais"
|
||||
Cuando voy a "Mis mascotas"
|
||||
Entonces deberia ver "Firulais" en mi lista
|
||||
Y deberia ver su historial de visitas previas
|
||||
|
||||
Escenario: Razas filtradas por tipo
|
||||
Cuando agrego una mascota tipo "Gato"
|
||||
Entonces las razas disponibles deberian ser razas de gato
|
||||
Y no deberia ver razas de perro como "Labrador"
|
||||
141
atlas/book/gherkin-samples/es/pet-owner/04-pago-turno.feature
Normal file
141
atlas/book/gherkin-samples/es/pet-owner/04-pago-turno.feature
Normal file
@@ -0,0 +1,141 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/pet-owner/04-pago-turno.md
|
||||
# Drive: 07. Finanzas y contabilidad/Mercado Pago
|
||||
# Tests Backend: pytest tests/contracts/payments/test_mercadopago.py
|
||||
# Tests Frontend: npx playwright test payment.spec.ts
|
||||
|
||||
Característica: Pago de turno
|
||||
|
||||
Como dueno de mascota con turno coordinado
|
||||
Quiero pagar mi turno online
|
||||
Para confirmar la visita del veterinario
|
||||
|
||||
Antecedentes:
|
||||
Dado que tengo un turno en estado "Coordinado"
|
||||
Y el turno tiene asignado veterinario "Dra. Garcia"
|
||||
Y la fecha asignada es "15 de enero a las 10:00"
|
||||
|
||||
# ============================================
|
||||
# FLUJO DE PAGO EXITOSO
|
||||
# ============================================
|
||||
|
||||
Escenario: Pagar turno con tarjeta de credito
|
||||
Dado que estoy en el detalle de mi turno coordinado
|
||||
Cuando hago click en "Pagar"
|
||||
Entonces deberia ser redirigido a Mercado Pago
|
||||
Y deberia ver el monto correcto
|
||||
|
||||
Cuando selecciono "Tarjeta de credito"
|
||||
Y completo los datos de la tarjeta
|
||||
Y confirmo el pago
|
||||
Entonces deberia volver a la plataforma
|
||||
Y deberia ver "Pago exitoso"
|
||||
Y el turno deberia estar en estado "Pagado"
|
||||
|
||||
Escenario: Recibir confirmacion de pago
|
||||
Dado que complete el pago exitosamente
|
||||
Entonces deberia recibir email de confirmacion
|
||||
Y el email deberia contener:
|
||||
| campo |
|
||||
| Fecha del turno |
|
||||
| Direccion |
|
||||
| Veterinario asignado |
|
||||
| Monto pagado |
|
||||
| Numero de operacion |
|
||||
|
||||
# ============================================
|
||||
# METODOS DE PAGO
|
||||
# ============================================
|
||||
|
||||
Esquema del escenario: Pagar con diferentes metodos
|
||||
Dado que estoy en Mercado Pago
|
||||
Cuando selecciono metodo "<metodo>"
|
||||
Y completo el pago
|
||||
Entonces el pago deberia ser <resultado>
|
||||
Y el estado de acreditacion deberia ser "<acreditacion>"
|
||||
|
||||
Ejemplos:
|
||||
| metodo | resultado | acreditacion |
|
||||
| Tarjeta credito | exitoso | inmediata |
|
||||
| Tarjeta debito | exitoso | inmediata |
|
||||
| Dinero en cuenta | exitoso | inmediata |
|
||||
| Transferencia | pendiente | 1-2 dias |
|
||||
| Rapipago | pendiente | hasta 24hs |
|
||||
|
||||
# ============================================
|
||||
# MANEJO DE ERRORES
|
||||
# ============================================
|
||||
|
||||
Escenario: Pago rechazado por fondos insuficientes
|
||||
Dado que estoy en Mercado Pago
|
||||
Cuando intento pagar con tarjeta sin fondos
|
||||
Entonces deberia ver error "Fondos insuficientes"
|
||||
Y deberia poder reintentar con otra tarjeta
|
||||
Y el turno deberia seguir en estado "Coordinado"
|
||||
|
||||
Escenario: Usuario cancela el pago
|
||||
Dado que estoy en Mercado Pago
|
||||
Cuando hago click en "Volver al sitio"
|
||||
Entonces deberia volver a la plataforma
|
||||
Y deberia ver mensaje "El pago fue cancelado"
|
||||
Y deberia ver boton "Reintentar pago"
|
||||
Y el turno deberia seguir en estado "Coordinado"
|
||||
|
||||
Escenario: Cierre de browser durante pago
|
||||
Dado que estoy en Mercado Pago
|
||||
Y cierro el navegador accidentalmente
|
||||
Cuando vuelvo a la plataforma
|
||||
Y voy a "Mis turnos"
|
||||
Entonces deberia poder ver el estado real del pago
|
||||
# Si se proceso: Pagado. Si no: Coordinado con opcion de pagar
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Link de pago expirado
|
||||
Dado que recibi el link de pago hace mas de 24 horas
|
||||
Cuando hago click en el link
|
||||
Entonces deberia ver "Este link ha expirado"
|
||||
Y deberia ver "Contacta a soporte para generar uno nuevo"
|
||||
|
||||
Escenario: Intento pagar turno ya pagado
|
||||
Dado que mi turno ya esta en estado "Pagado"
|
||||
Cuando accedo al link de pago
|
||||
Entonces deberia ver "Este turno ya fue pagado"
|
||||
Y deberia ver boton "Ver detalle del turno"
|
||||
|
||||
Escenario: Precio cambio desde la coordinacion
|
||||
# Caso muy raro pero posible
|
||||
Dado que el precio del servicio aumento desde que se coordino
|
||||
Cuando voy a pagar
|
||||
Entonces deberia ver el precio original acordado
|
||||
# El precio se congela al momento de coordinacion
|
||||
|
||||
# ============================================
|
||||
# INTEGRACION CON WEBHOOK
|
||||
# ============================================
|
||||
|
||||
Regla: El estado del turno se actualiza via webhook de Mercado Pago
|
||||
|
||||
Escenario: Webhook confirma pago aprobado
|
||||
Dado que el usuario completo el pago en Mercado Pago
|
||||
Cuando Mercado Pago envia webhook con status "approved"
|
||||
Entonces el turno deberia cambiar a estado "Pagado"
|
||||
Y el veterinario deberia recibir notificacion
|
||||
Y el usuario deberia recibir email de confirmacion
|
||||
|
||||
Escenario: Webhook informa pago pendiente
|
||||
Dado que el usuario pago con transferencia bancaria
|
||||
Cuando Mercado Pago envia webhook con status "pending"
|
||||
Entonces el turno deberia quedarse en "Coordinado"
|
||||
Y deberia registrarse el pago pendiente
|
||||
Y el usuario deberia recibir email "Esperando acreditacion"
|
||||
|
||||
Escenario: Webhook falla pero pago se proceso
|
||||
# Caso de error que requiere intervencion manual
|
||||
Dado que el usuario pago exitosamente
|
||||
Pero el webhook fallo por error de red
|
||||
Entonces el turno seguira en "Coordinado"
|
||||
Y el equipo de ops deberia recibir alerta
|
||||
Y deberian poder actualizar manualmente
|
||||
@@ -0,0 +1,148 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/pet-owner/05-historial-medico.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_visits.py
|
||||
# Tests Frontend: npx playwright test medical-history.spec.ts
|
||||
|
||||
Característica: Ver historial medico
|
||||
|
||||
Como dueno de mascota
|
||||
Quiero ver el historial medico de mis mascotas
|
||||
Para tener registro de sus visitas y tratamientos
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como dueno de mascota
|
||||
Y tengo una mascota "Luna" con visitas completadas
|
||||
|
||||
# ============================================
|
||||
# ACCESO AL HISTORIAL
|
||||
# ============================================
|
||||
|
||||
Escenario: Acceder al historial desde mascotas
|
||||
Dado que estoy en "Mis mascotas"
|
||||
Cuando hago click en "Luna"
|
||||
Y voy a la seccion "Historial de visitas"
|
||||
Entonces deberia ver lista de visitas de Luna
|
||||
|
||||
Escenario: Acceder al historial desde turnos
|
||||
Dado que estoy en "Mis turnos"
|
||||
Y filtro por "Completados"
|
||||
Cuando hago click en un turno de Luna
|
||||
Y hago click en "Ver informe medico"
|
||||
Entonces deberia ver el informe de esa visita
|
||||
|
||||
# ============================================
|
||||
# VISUALIZACION DE VISITAS
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver lista de visitas ordenadas
|
||||
Dado que Luna tiene visitas en las siguientes fechas:
|
||||
| fecha |
|
||||
| 2024-01-15 |
|
||||
| 2023-11-20 |
|
||||
| 2023-06-10 |
|
||||
Cuando veo el historial de Luna
|
||||
Entonces deberia ver las visitas ordenadas de mas reciente a mas antigua
|
||||
Y la primera deberia ser del "15 de enero 2024"
|
||||
|
||||
Escenario: Ver detalle completo de informe
|
||||
Cuando hago click en una visita completada
|
||||
Entonces deberia ver los siguientes datos:
|
||||
| seccion | contenido |
|
||||
| Informacion | Fecha, veterinario, servicios |
|
||||
| Examen fisico | Peso, temperatura, FC, obs |
|
||||
| Diagnostico | Descripcion del diagnostico |
|
||||
| Tratamiento | Plan de tratamiento |
|
||||
| Medicamentos | Lista con dosis y frecuencia |
|
||||
| Estudios | Estudios solicitados y estado |
|
||||
| Seguimiento | Recomendaciones, proximo control |
|
||||
|
||||
Escenario: Ver informe con medicamentos recetados
|
||||
Dado que la visita incluye medicamentos:
|
||||
"""
|
||||
1. Amoxicilina 250mg - 1 comprimido cada 12hs por 7 dias
|
||||
2. Meloxicam 1.5mg - 1 comprimido por dia por 3 dias
|
||||
"""
|
||||
Cuando veo el informe
|
||||
Entonces deberia ver la lista de medicamentos
|
||||
Y cada medicamento deberia mostrar:
|
||||
| campo |
|
||||
| Nombre |
|
||||
| Dosis |
|
||||
| Frecuencia |
|
||||
| Duracion |
|
||||
|
||||
# ============================================
|
||||
# DESCARGA Y COMPARTIR
|
||||
# ============================================
|
||||
|
||||
Escenario: Descargar informe como PDF
|
||||
Dado que estoy viendo un informe medico
|
||||
Cuando hago click en "Descargar PDF"
|
||||
Entonces deberia descargarse un archivo PDF
|
||||
Y el PDF deberia contener toda la informacion del informe
|
||||
Y deberia tener el logo de Amar Mascotas
|
||||
|
||||
Escenario: Imprimir informe
|
||||
Dado que estoy viendo un informe medico
|
||||
Cuando hago click en "Imprimir"
|
||||
Entonces deberia abrirse el dialogo de impresion
|
||||
Y el formato deberia ser optimizado para impresion
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Visita completada sin informe cargado
|
||||
# El vet no cargo el informe todavia
|
||||
Dado que Luna tiene una visita marcada como "Completada"
|
||||
Pero el veterinario no cargo el informe aun
|
||||
Cuando intento ver el informe
|
||||
Entonces deberia ver mensaje "Informe pendiente"
|
||||
Y deberia ver "El veterinario esta completando el informe"
|
||||
|
||||
Escenario: Informe con estudios pendientes
|
||||
Dado que el informe solicita estudios de laboratorio
|
||||
Y los resultados aun no estan disponibles
|
||||
Cuando veo el informe
|
||||
Entonces deberia ver seccion "Estudios solicitados"
|
||||
Y deberia ver estado "Pendiente de resultados"
|
||||
Y deberia ver nota "Se notificara cuando esten listos"
|
||||
|
||||
Escenario: Mascota con multiples visitas el mismo dia
|
||||
# Raro pero posible: consulta de urgencia + seguimiento
|
||||
Dado que Luna tuvo 2 visitas el 15 de enero
|
||||
Cuando veo el historial
|
||||
Entonces deberia ver ambas visitas listadas
|
||||
Y deberian estar diferenciadas por hora
|
||||
|
||||
# ============================================
|
||||
# PERMISOS Y PRIVACIDAD
|
||||
# ============================================
|
||||
|
||||
Regla: Solo el dueno puede ver el historial de su mascota
|
||||
|
||||
Escenario: Dueno ve historial de su mascota
|
||||
Dado que soy dueno de Luna
|
||||
Cuando accedo al historial de Luna
|
||||
Entonces deberia poder verlo completo
|
||||
|
||||
Escenario: No puedo ver historial de mascota ajena
|
||||
Dado que existe mascota "Rocky" de otro dueno
|
||||
Cuando intento acceder al historial de Rocky
|
||||
Entonces deberia ver error "No tienes acceso"
|
||||
# 403 Forbidden
|
||||
|
||||
# ============================================
|
||||
# BUSQUEDA Y FILTROS
|
||||
# ============================================
|
||||
|
||||
Escenario: Filtrar historial por tipo de servicio
|
||||
Dado que Luna tiene visitas de vacunacion y consulta
|
||||
Cuando filtro por "Vacunacion"
|
||||
Entonces solo deberia ver visitas de vacunacion
|
||||
|
||||
Escenario: Buscar en historial por fecha
|
||||
Cuando busco visitas del "2023"
|
||||
Entonces solo deberia ver visitas del 2023
|
||||
Y no deberia ver visitas del 2024
|
||||
@@ -0,0 +1,129 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/veterinarian/01-aceptar-solicitud.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/solicitudes/test_service_requests.py
|
||||
# Tests Frontend: npx playwright test vet-requests.spec.ts
|
||||
|
||||
Característica: Aceptar o rechazar solicitudes de servicio
|
||||
|
||||
Como veterinario de la plataforma
|
||||
Quiero revisar y responder a solicitudes en mi zona
|
||||
Para gestionar mi agenda de visitas a domicilio
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como veterinario
|
||||
Y tengo cobertura en los barrios "Palermo" y "Recoleta"
|
||||
Y estoy en el dashboard de veterinario
|
||||
|
||||
# ============================================
|
||||
# VER SOLICITUDES PENDIENTES
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver lista de solicitudes en mi zona
|
||||
Cuando veo la seccion "Solicitudes pendientes"
|
||||
Entonces deberia ver solo solicitudes de "Palermo" y "Recoleta"
|
||||
Y no deberia ver solicitudes de otros barrios
|
||||
|
||||
Escenario: Ver detalle de solicitud
|
||||
Dado que hay una solicitud pendiente
|
||||
Cuando hago click en la solicitud
|
||||
Entonces deberia ver:
|
||||
| seccion | contenido |
|
||||
| Dueno | Nombre, telefono, direccion |
|
||||
| Mascota | Nombre, tipo, edad, foto |
|
||||
| Servicios | Lista de servicios solicitados |
|
||||
| Fechas | Fechas preferidas por el dueno |
|
||||
| Historial | Visitas anteriores si las hay |
|
||||
|
||||
# ============================================
|
||||
# ACEPTAR SOLICITUD
|
||||
# ============================================
|
||||
|
||||
Escenario: Aceptar solicitud con fecha disponible
|
||||
Dado que hay una solicitud para el barrio "Palermo"
|
||||
Y el dueno prefiere fechas:
|
||||
| fecha | franja |
|
||||
| 2024-01-15 | Mañana |
|
||||
| 2024-01-16 | Tarde |
|
||||
Y tengo disponibilidad el 15 de enero a las 10:00
|
||||
Cuando hago click en "Aceptar"
|
||||
Y selecciono fecha "15 de enero" hora "10:00"
|
||||
Y confirmo la aceptacion
|
||||
Entonces la solicitud deberia pasar a estado "Coordinado"
|
||||
Y deberia quedar asignada a mi
|
||||
Y el dueno deberia recibir notificacion con mis datos
|
||||
Y la visita deberia aparecer en mi agenda
|
||||
|
||||
Escenario: Aceptar solicitud con datos de mascota que ya atendi
|
||||
Dado que hay una solicitud para mascota "Luna"
|
||||
Y yo atendi a "Luna" anteriormente
|
||||
Cuando veo el detalle de la solicitud
|
||||
Entonces deberia ver badge "Paciente recurrente"
|
||||
Y deberia ver el historial de mis visitas anteriores a Luna
|
||||
|
||||
# ============================================
|
||||
# RECHAZAR SOLICITUD
|
||||
# ============================================
|
||||
|
||||
Esquema del escenario: Rechazar solicitud con motivo
|
||||
Dado que hay una solicitud pendiente
|
||||
Cuando hago click en "Rechazar"
|
||||
Y selecciono motivo "<motivo>"
|
||||
Y confirmo el rechazo
|
||||
Entonces la solicitud deberia desaparecer de mi lista
|
||||
Y deberia seguir visible para otros veterinarios
|
||||
|
||||
Ejemplos:
|
||||
| motivo |
|
||||
| No tengo disponibilidad |
|
||||
| Fuera de mi zona |
|
||||
| No realizo este servicio |
|
||||
| Otro |
|
||||
|
||||
Escenario: Rechazar sin seleccionar motivo
|
||||
Dado que hay una solicitud pendiente
|
||||
Cuando hago click en "Rechazar"
|
||||
Y confirmo sin seleccionar motivo
|
||||
Entonces deberia poder rechazar igual
|
||||
# El motivo es opcional
|
||||
|
||||
# ============================================
|
||||
# RACE CONDITIONS
|
||||
# ============================================
|
||||
|
||||
Regla: Solo un veterinario puede aceptar cada solicitud
|
||||
|
||||
Escenario: Otro vet acepta mientras estoy viendo
|
||||
Dado que estoy viendo el detalle de una solicitud
|
||||
Y otro veterinario acepta la misma solicitud
|
||||
Cuando intento aceptarla
|
||||
Entonces deberia ver error "Esta solicitud ya fue aceptada"
|
||||
Y deberia ser redirigido al listado
|
||||
|
||||
Escenario: Solicitud desaparece cuando otro la acepta
|
||||
Dado que estoy viendo el listado de solicitudes
|
||||
Y otro veterinario acepta una solicitud
|
||||
Entonces esa solicitud deberia desaparecer de mi lista
|
||||
# Idealmente en tiempo real via websocket
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Solicitud urgente destacada
|
||||
Dado que hay una solicitud marcada como "Urgente"
|
||||
Cuando veo el listado de solicitudes
|
||||
Entonces deberia ver la solicitud con indicador de urgencia
|
||||
Y deberia aparecer primero en la lista
|
||||
|
||||
Escenario: Solicitud con multiples mascotas
|
||||
Dado que hay una solicitud para 2 mascotas
|
||||
Cuando veo el detalle
|
||||
Entonces deberia ver informacion de ambas mascotas
|
||||
Y deberia ver nota sobre tiempo estimado adicional
|
||||
|
||||
Escenario: No puedo aceptar con agenda completa
|
||||
Dado que tengo mi agenda completa para las fechas de la solicitud
|
||||
Cuando intento aceptar la solicitud
|
||||
Entonces deberia ver advertencia "No tienes disponibilidad en las fechas preferidas"
|
||||
Y deberia poder proponer una fecha alternativa
|
||||
@@ -0,0 +1,134 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/veterinarian/02-gestion-agenda.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_availability.py
|
||||
# Tests Frontend: npx playwright test vet-schedule.spec.ts
|
||||
|
||||
Característica: Gestion de agenda veterinaria
|
||||
|
||||
Como veterinario
|
||||
Quiero gestionar mi calendario y disponibilidad
|
||||
Para organizar mis visitas a domicilio eficientemente
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como veterinario
|
||||
Y estoy en la seccion "Mi agenda"
|
||||
|
||||
# ============================================
|
||||
# VER AGENDA
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver calendario semanal
|
||||
Cuando veo mi agenda en vista semanal
|
||||
Entonces deberia ver los 7 dias de la semana
|
||||
Y deberia ver mis visitas programadas
|
||||
Y cada visita deberia mostrar hora y nombre del paciente
|
||||
|
||||
Escenario: Ver visitas con codigo de color por estado
|
||||
Dado que tengo visitas en diferentes estados
|
||||
Cuando veo mi agenda
|
||||
Entonces las visitas deberian mostrarse con colores:
|
||||
| estado | color |
|
||||
| Coordinado | amarillo |
|
||||
| Pagado | verde |
|
||||
| En progreso | azul |
|
||||
| Completado | gris |
|
||||
|
||||
Escenario: Ver detalle de visita desde el calendario
|
||||
Dado que tengo una visita programada para hoy
|
||||
Cuando hago click en la visita
|
||||
Entonces deberia ver popup con:
|
||||
| campo | valor |
|
||||
| Hora | 10:00 - 11:00 |
|
||||
| Dueno | Maria Garcia |
|
||||
| Direccion | Av Santa Fe 1234 |
|
||||
| Mascota | Luna (Gato, 3 años) |
|
||||
| Servicios | Vacunacion, Consulta |
|
||||
| Estado pago | Pagado |
|
||||
Y deberia ver boton "Ver detalle completo"
|
||||
|
||||
# ============================================
|
||||
# CONFIGURAR DISPONIBILIDAD SEMANAL
|
||||
# ============================================
|
||||
|
||||
Escenario: Configurar horario laboral
|
||||
Cuando voy a "Configuracion" -> "Mi disponibilidad"
|
||||
Y configuro mi horario:
|
||||
| dia | trabajo | desde | hasta | pausa_desde | pausa_hasta |
|
||||
| Lunes | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Martes | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Miercoles | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Jueves | Si | 09:00 | 18:00 | 13:00 | 14:00 |
|
||||
| Viernes | Si | 09:00 | 15:00 | | |
|
||||
| Sabado | No | | | | |
|
||||
| Domingo | No | | | | |
|
||||
Y guardo la configuracion
|
||||
Entonces mi disponibilidad deberia actualizarse
|
||||
Y no deberia recibir solicitudes fuera de ese horario
|
||||
|
||||
# ============================================
|
||||
# BLOQUEAR DIAS ESPECIFICOS
|
||||
# ============================================
|
||||
|
||||
Escenario: Marcar dia como no disponible
|
||||
Dado que necesito el 20 de enero libre
|
||||
Cuando hago click en el dia 20 de enero en el calendario
|
||||
Y selecciono "Marcar como no disponible"
|
||||
Y ingreso motivo "Vacaciones"
|
||||
Y confirmo
|
||||
Entonces el dia 20 deberia mostrarse como bloqueado
|
||||
Y no deberia poder aceptar solicitudes para ese dia
|
||||
|
||||
Escenario: Bloquear rango de fechas
|
||||
Dado que tomo vacaciones del 15 al 22 de enero
|
||||
Cuando voy a "Agregar indisponibilidad"
|
||||
Y selecciono fecha inicio "15 de enero"
|
||||
Y selecciono fecha fin "22 de enero"
|
||||
Y ingreso motivo "Vacaciones"
|
||||
Y confirmo
|
||||
Entonces todos esos dias deberian mostrarse como bloqueados
|
||||
|
||||
Escenario: Desbloquear dia
|
||||
Dado que tengo el 20 de enero bloqueado
|
||||
Y ya no necesito ese dia libre
|
||||
Cuando hago click en el dia bloqueado
|
||||
Y selecciono "Quitar bloqueo"
|
||||
Entonces el dia deberia estar disponible nuevamente
|
||||
|
||||
# ============================================
|
||||
# IMPACTO EN SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Regla: Los bloqueos no afectan visitas ya aceptadas
|
||||
|
||||
Escenario: Bloquear dia con visita ya aceptada
|
||||
Dado que tengo una visita aceptada para el 15 de enero
|
||||
Cuando intento bloquear el 15 de enero
|
||||
Entonces deberia ver advertencia "Tienes una visita programada ese dia"
|
||||
Y deberia poder elegir:
|
||||
| opcion |
|
||||
| Cancelar el bloqueo |
|
||||
| Bloquear y contactar al dueno |
|
||||
|
||||
Regla: Cambios de disponibilidad solo afectan solicitudes futuras
|
||||
|
||||
Escenario: Cambiar horario no afecta visitas existentes
|
||||
Dado que tengo una visita a las 17:00 el lunes
|
||||
Cuando cambio mi horario del lunes para terminar a las 16:00
|
||||
Y guardo los cambios
|
||||
Entonces la visita de las 17:00 deberia mantenerse
|
||||
Y deberia ver advertencia sobre la inconsistencia
|
||||
|
||||
# ============================================
|
||||
# NAVEGACION
|
||||
# ============================================
|
||||
|
||||
Escenario: Navegar entre semanas
|
||||
Cuando hago click en "Semana siguiente"
|
||||
Entonces deberia ver el calendario de la proxima semana
|
||||
Y deberia poder volver con "Semana anterior"
|
||||
|
||||
Escenario: Ir a fecha especifica
|
||||
Cuando hago click en el selector de fecha
|
||||
Y selecciono "15 de marzo"
|
||||
Entonces deberia ver la semana que contiene el 15 de marzo
|
||||
@@ -0,0 +1,159 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/veterinarian/03-realizar-visita.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_visits.py
|
||||
# Tests Frontend: npx playwright test vet-visit.spec.ts
|
||||
|
||||
Característica: Realizar visita y crear informe medico
|
||||
|
||||
Como veterinario
|
||||
Quiero registrar la atencion medica de mis visitas
|
||||
Para mantener el historial clinico del paciente
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como veterinario
|
||||
Y tengo una visita programada para hoy con mascota "Luna"
|
||||
Y la visita esta en estado "Pagado"
|
||||
|
||||
# ============================================
|
||||
# INICIAR VISITA
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver informacion antes de la visita
|
||||
Cuando accedo al detalle de la visita
|
||||
Entonces deberia ver la direccion para llegar
|
||||
Y deberia ver el telefono del dueno para confirmar
|
||||
Y deberia ver los servicios a realizar
|
||||
Y deberia ver el historial previo de Luna
|
||||
|
||||
Escenario: Iniciar visita al llegar
|
||||
Dado que llegue al domicilio
|
||||
Cuando hago click en "Iniciar visita"
|
||||
Entonces el estado deberia cambiar a "En progreso"
|
||||
Y deberia registrarse la hora de inicio
|
||||
Y deberia habilitarse el boton "Crear informe"
|
||||
|
||||
# ============================================
|
||||
# CREAR INFORME MEDICO
|
||||
# ============================================
|
||||
|
||||
Escenario: Completar informe con examen fisico
|
||||
Dado que la visita esta en progreso
|
||||
Cuando voy a "Crear informe"
|
||||
Y completo el examen fisico:
|
||||
| campo | valor |
|
||||
| Peso | 4.5 kg |
|
||||
| Temperatura | 38.5 °C |
|
||||
| Frecuencia cardiaca | 120 lpm |
|
||||
| Frecuencia resp | 25 rpm |
|
||||
| Mucosas | Rosadas |
|
||||
| Hidratacion | Normal |
|
||||
Y guardo el informe
|
||||
Entonces el examen fisico deberia guardarse
|
||||
|
||||
Escenario: Agregar diagnostico y tratamiento
|
||||
Dado que complete el examen fisico
|
||||
Cuando agrego el diagnostico:
|
||||
"""
|
||||
Otitis externa bilateral leve.
|
||||
Paciente presenta prurito y secrecion ceruminosa.
|
||||
Sin signos de infeccion secundaria.
|
||||
"""
|
||||
Y agrego el tratamiento:
|
||||
"""
|
||||
Limpieza de oidos con solucion fisiologica.
|
||||
Aplicacion de gotas oticas antibioticas.
|
||||
Control en 7 dias.
|
||||
"""
|
||||
Y guardo el informe
|
||||
Entonces el diagnostico y tratamiento deberian guardarse
|
||||
|
||||
Escenario: Recetar medicamentos
|
||||
Dado que estoy creando el informe
|
||||
Cuando agrego medicamentos:
|
||||
| nombre | dosis | frecuencia | duracion |
|
||||
| Otomax gotas | 5 gotas | cada 12 horas | 7 dias |
|
||||
| Meloxicam 1.5mg | 1 comp | cada 24 horas | 3 dias |
|
||||
Y guardo el informe
|
||||
Entonces los medicamentos deberian aparecer en el informe
|
||||
Y el dueno podra verlos desde su cuenta
|
||||
|
||||
Escenario: Solicitar estudios complementarios
|
||||
Dado que necesito estudios de laboratorio
|
||||
Cuando agrego estudio:
|
||||
| tipo | indicaciones |
|
||||
| Hemograma completo | Ayuno de 8 horas |
|
||||
| Perfil hepatico | Para control pre-quirurgico |
|
||||
Y guardo el informe
|
||||
Entonces los estudios deberian quedar registrados
|
||||
Y deberian mostrarse como "Pendientes de resultado"
|
||||
|
||||
# ============================================
|
||||
# COMPLETAR VISITA
|
||||
# ============================================
|
||||
|
||||
Escenario: Completar visita con informe
|
||||
Dado que el informe esta completo
|
||||
Cuando hago click en "Completar visita"
|
||||
Y confirmo la finalizacion
|
||||
Entonces la visita deberia pasar a estado "Completado"
|
||||
Y deberia generarse factura electronica (AFIP)
|
||||
Y el dueno deberia recibir notificacion
|
||||
Y el informe deberia ser visible para el dueno
|
||||
|
||||
Escenario: No puedo completar sin informe
|
||||
Dado que la visita esta en progreso
|
||||
Pero no cree ningun informe
|
||||
Cuando intento completar la visita
|
||||
Entonces deberia ver error "Debes crear el informe antes de completar"
|
||||
|
||||
# ============================================
|
||||
# GUARDADO AUTOMATICO
|
||||
# ============================================
|
||||
|
||||
Regla: El informe se guarda automaticamente
|
||||
|
||||
Escenario: Guardado automatico cada 30 segundos
|
||||
Dado que estoy escribiendo el informe
|
||||
Cuando pasan 30 segundos
|
||||
Entonces deberia ver indicador "Guardado automaticamente"
|
||||
|
||||
Escenario: Recuperar informe despues de desconexion
|
||||
Dado que estaba escribiendo el informe
|
||||
Y perdi conexion a internet
|
||||
Cuando recupero la conexion
|
||||
Entonces deberia recuperar mi progreso
|
||||
Y no deberia perder lo que escribi
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Visita con multiples mascotas
|
||||
Dado que la visita incluye a "Luna" y "Rocky"
|
||||
Cuando creo el informe
|
||||
Entonces deberia crear un informe separado para cada mascota
|
||||
Y ambos informes deberian estar asociados a la misma visita
|
||||
|
||||
Escenario: Cancelar visita in situ
|
||||
Dado que llegue al domicilio
|
||||
Pero el dueno no esta
|
||||
Cuando marco la visita como "Cancelada in situ"
|
||||
Y selecciono motivo "Dueno ausente"
|
||||
Entonces la visita deberia marcarse como cancelada
|
||||
Y deberia generarse cargo por visita fallida
|
||||
# Segun politicas de la empresa
|
||||
|
||||
Escenario: Emergencia durante visita rutinaria
|
||||
Dado que estoy en una consulta de vacunacion
|
||||
Y detecto una condicion que requiere atencion urgente
|
||||
Cuando agrego servicio "Consulta de urgencia"
|
||||
Entonces deberia poder documentar ambos servicios
|
||||
Y el precio deberia ajustarse
|
||||
|
||||
Escenario: Derivar a clinica
|
||||
Dado que el paciente necesita atencion en clinica
|
||||
Cuando marco "Derivacion a clinica"
|
||||
Y especifico el motivo
|
||||
Entonces deberia quedar registrada la derivacion
|
||||
Y el dueno deberia recibir instrucciones
|
||||
@@ -0,0 +1,121 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/veterinarian/04-zonas-cobertura.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_veterinarians.py
|
||||
# Tests Frontend: npx playwright test vet-coverage.spec.ts
|
||||
|
||||
Característica: Gestionar zonas de cobertura
|
||||
|
||||
Como veterinario
|
||||
Quiero definir en que zonas atiendo
|
||||
Para recibir solo solicitudes que puedo cubrir
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como veterinario
|
||||
Y estoy en la seccion "Mi cobertura"
|
||||
|
||||
# ============================================
|
||||
# VER ZONAS ACTUALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver mapa con mis zonas de cobertura
|
||||
Cuando cargo la pagina de cobertura
|
||||
Entonces deberia ver un mapa de la ciudad
|
||||
Y mis zonas cubiertas deberian estar resaltadas
|
||||
Y deberia ver un listado de barrios seleccionados
|
||||
|
||||
Escenario: Ver estadisticas por zona
|
||||
Dado que tengo cobertura en "Palermo" y "Recoleta"
|
||||
Cuando veo el detalle de mis zonas
|
||||
Entonces deberia ver para cada zona:
|
||||
| metrica |
|
||||
| Solicitudes este mes |
|
||||
| Visitas completadas |
|
||||
| Otros vets en la zona |
|
||||
|
||||
# ============================================
|
||||
# AGREGAR ZONAS
|
||||
# ============================================
|
||||
|
||||
Escenario: Agregar barrio desde el mapa
|
||||
Dado que no tengo cobertura en "Belgrano"
|
||||
Cuando hago click en "Belgrano" en el mapa
|
||||
Y confirmo agregar la zona
|
||||
Entonces "Belgrano" deberia aparecer en mi lista de zonas
|
||||
Y deberia empezar a ver solicitudes de Belgrano
|
||||
|
||||
Escenario: Agregar barrio desde el buscador
|
||||
Cuando busco "Nuñez" en el buscador de barrios
|
||||
Y selecciono "Nuñez" de los resultados
|
||||
Y confirmo agregar la zona
|
||||
Entonces "Nuñez" deberia aparecer en mi lista
|
||||
|
||||
Escenario: Agregar multiples zonas a la vez
|
||||
Cuando selecciono los barrios:
|
||||
| barrio |
|
||||
| Colegiales |
|
||||
| Chacarita |
|
||||
| Villa Crespo |
|
||||
Y hago click en "Agregar seleccionados"
|
||||
Entonces los 3 barrios deberian agregarse a mi cobertura
|
||||
|
||||
# ============================================
|
||||
# QUITAR ZONAS
|
||||
# ============================================
|
||||
|
||||
Escenario: Quitar zona de cobertura
|
||||
Dado que tengo cobertura en "Recoleta"
|
||||
Cuando hago click en "X" junto a "Recoleta"
|
||||
Y confirmo quitar la zona
|
||||
Entonces "Recoleta" no deberia estar en mi lista
|
||||
Y no deberia ver nuevas solicitudes de Recoleta
|
||||
|
||||
Escenario: Quitar zona con solicitudes pendientes
|
||||
Dado que tengo cobertura en "Palermo"
|
||||
Y hay solicitudes pendientes en Palermo que no acepte
|
||||
Cuando intento quitar "Palermo"
|
||||
Entonces deberia ver advertencia "Hay X solicitudes pendientes en esta zona"
|
||||
Y deberia poder confirmar de todas formas
|
||||
# Las solicitudes pendientes siguen disponibles para otros vets
|
||||
|
||||
# ============================================
|
||||
# IMPACTO EN SOLICITUDES
|
||||
# ============================================
|
||||
|
||||
Regla: Los cambios de zona afectan solo solicitudes nuevas
|
||||
|
||||
Escenario: Agregar zona muestra solicitudes existentes
|
||||
Dado que no tengo cobertura en "Belgrano"
|
||||
Y hay 3 solicitudes pendientes en Belgrano
|
||||
Cuando agrego "Belgrano" a mi cobertura
|
||||
Entonces deberia ver las 3 solicitudes pendientes de Belgrano
|
||||
|
||||
Escenario: Quitar zona no afecta visitas aceptadas
|
||||
Dado que tengo cobertura en "Recoleta"
|
||||
Y tengo una visita aceptada en Recoleta para mañana
|
||||
Cuando quito "Recoleta" de mi cobertura
|
||||
Entonces la visita de mañana deberia mantenerse
|
||||
Pero no deberia ver nuevas solicitudes de Recoleta
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Zona no disponible en el sistema
|
||||
Dado que quiero cubrir "Barrio Nuevo"
|
||||
Pero ese barrio no esta en el sistema
|
||||
Cuando busco "Barrio Nuevo"
|
||||
Entonces deberia ver mensaje "Zona no encontrada"
|
||||
Y deberia ver opcion "Solicitar que agreguen esta zona"
|
||||
|
||||
Escenario: Zona con baja demanda
|
||||
Dado que agrego una zona con poca actividad
|
||||
Cuando pasan 30 dias sin solicitudes
|
||||
Entonces deberia recibir sugerencia "Considera expandir tu cobertura"
|
||||
|
||||
Escenario: Zona saturada de veterinarios
|
||||
Dado que quiero agregar "Palermo"
|
||||
Y hay muchos veterinarios cubriendo Palermo
|
||||
Cuando agrego la zona
|
||||
Entonces deberia ver nota "Esta zona tiene alta cobertura de veterinarios"
|
||||
# Informativo, no bloquea
|
||||
@@ -0,0 +1,157 @@
|
||||
# language: es
|
||||
# Fuente: album/book/ops-templates/veterinarian/05-historial-pacientes.md
|
||||
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
|
||||
# Tests Backend: pytest tests/contracts/mascotas/test_vet_visits.py
|
||||
# Tests Frontend: npx playwright test vet-history.spec.ts
|
||||
|
||||
Característica: Ver historial de pacientes
|
||||
|
||||
Como veterinario
|
||||
Quiero acceder al historial medico de pacientes
|
||||
Para tener contexto clinico en mis atenciones
|
||||
|
||||
Antecedentes:
|
||||
Dado que estoy logueado como veterinario
|
||||
Y estoy en la seccion "Historia clinica"
|
||||
|
||||
# ============================================
|
||||
# BUSCAR PACIENTES
|
||||
# ============================================
|
||||
|
||||
Esquema del escenario: Buscar paciente por diferentes criterios
|
||||
Cuando busco por <criterio> con valor "<valor>"
|
||||
Entonces deberia ver resultados que coincidan
|
||||
|
||||
Ejemplos:
|
||||
| criterio | valor |
|
||||
| nombre dueno | Maria Garcia |
|
||||
| nombre mascota | Luna |
|
||||
| telefono | 1155551234 |
|
||||
| email | maria@ejemplo.com |
|
||||
|
||||
Escenario: Busqueda sin resultados
|
||||
Cuando busco "ZZZZZ paciente inexistente"
|
||||
Entonces deberia ver mensaje "No se encontraron resultados"
|
||||
Y deberia ver sugerencia "Verifica la ortografia"
|
||||
|
||||
Escenario: Busqueda con multiples resultados
|
||||
Cuando busco "Garcia"
|
||||
Y hay varios duenos con apellido Garcia
|
||||
Entonces deberia ver lista de coincidencias
|
||||
Y cada resultado deberia mostrar:
|
||||
| campo |
|
||||
| Nombre completo |
|
||||
| Email |
|
||||
| Mascotas |
|
||||
|
||||
# ============================================
|
||||
# VER FICHA DE MASCOTA
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver ficha completa de mascota
|
||||
Dado que encontre a la mascota "Luna"
|
||||
Cuando hago click en Luna
|
||||
Entonces deberia ver la ficha con:
|
||||
| seccion | contenido |
|
||||
| Datos basicos | Nombre, tipo, raza, edad, peso |
|
||||
| Foto | Foto de la mascota |
|
||||
| Dueno | Nombre y contacto del dueno |
|
||||
| Vacunacion | Estado de vacunas |
|
||||
| Historial | Lista de visitas |
|
||||
|
||||
Escenario: Ver grafico de peso historico
|
||||
Dado que estoy viendo la ficha de "Luna"
|
||||
Y Luna tuvo multiples visitas con peso registrado
|
||||
Cuando veo la seccion "Evolucion"
|
||||
Entonces deberia ver grafico de peso en el tiempo
|
||||
Y deberia poder detectar tendencias
|
||||
|
||||
# ============================================
|
||||
# VER HISTORIAL DE VISITAS
|
||||
# ============================================
|
||||
|
||||
Escenario: Ver listado de visitas
|
||||
Dado que estoy viendo la ficha de "Luna"
|
||||
Y Luna tiene 5 visitas completadas
|
||||
Cuando veo la seccion "Historial de visitas"
|
||||
Entonces deberia ver las 5 visitas listadas
|
||||
Y deberian estar ordenadas de mas reciente a mas antigua
|
||||
Y cada visita deberia mostrar:
|
||||
| campo |
|
||||
| Fecha |
|
||||
| Veterinario |
|
||||
| Servicios |
|
||||
| Diagnostico |
|
||||
|
||||
Escenario: Ver informe de visita de otro veterinario
|
||||
Dado que Luna fue atendida por "Dra. Rodriguez"
|
||||
Y yo no la atendi en esa visita
|
||||
Cuando hago click en esa visita
|
||||
Entonces deberia poder ver el informe completo
|
||||
# Para continuidad de atencion
|
||||
|
||||
Escenario: Ver informe detallado
|
||||
Cuando hago click en una visita
|
||||
Entonces deberia ver el informe con:
|
||||
| seccion | contenido |
|
||||
| Examen fisico | Peso, temperatura, signos vitales |
|
||||
| Diagnostico | Descripcion del diagnostico |
|
||||
| Tratamiento | Plan de tratamiento indicado |
|
||||
| Medicamentos | Lista con dosis y duracion |
|
||||
| Estudios | Estudios solicitados y resultados |
|
||||
| Observaciones | Notas adicionales |
|
||||
|
||||
# ============================================
|
||||
# FILTROS Y NAVEGACION
|
||||
# ============================================
|
||||
|
||||
Escenario: Filtrar historial por tipo de servicio
|
||||
Dado que estoy viendo el historial de "Luna"
|
||||
Cuando filtro por servicio "Vacunacion"
|
||||
Entonces solo deberia ver visitas de vacunacion
|
||||
|
||||
Escenario: Filtrar historial por fecha
|
||||
Dado que estoy viendo el historial de "Luna"
|
||||
Cuando filtro por año "2023"
|
||||
Entonces solo deberia ver visitas del 2023
|
||||
|
||||
Escenario: Filtrar por mis atenciones
|
||||
Dado que estoy viendo el historial de "Luna"
|
||||
Y Luna fue atendida por varios veterinarios
|
||||
Cuando marco "Solo mis atenciones"
|
||||
Entonces solo deberia ver las visitas que yo realice
|
||||
|
||||
# ============================================
|
||||
# PERMISOS
|
||||
# ============================================
|
||||
|
||||
Regla: Veterinarios pueden ver historial de pacientes que atendieron
|
||||
|
||||
Escenario: Puedo ver historial de paciente que atendi
|
||||
Dado que yo atendi a "Luna" al menos una vez
|
||||
Cuando busco a Luna
|
||||
Entonces deberia poder ver su historial completo
|
||||
|
||||
Escenario: Puedo ver historial de paciente con solicitud pendiente
|
||||
Dado que hay una solicitud pendiente para "Rocky"
|
||||
Y la solicitud esta en mi zona
|
||||
Cuando busco a Rocky
|
||||
Entonces deberia poder ver su historial
|
||||
# Para evaluar si acepto la solicitud
|
||||
|
||||
# ============================================
|
||||
# CASOS ESPECIALES
|
||||
# ============================================
|
||||
|
||||
Escenario: Paciente sin historial previo
|
||||
Dado que busco a "Nuevo" que nunca fue atendido
|
||||
Cuando veo su ficha
|
||||
Entonces el historial deberia estar vacio
|
||||
Y deberia ver mensaje "Sin visitas registradas"
|
||||
|
||||
Escenario: Dueno con multiples mascotas
|
||||
Dado que busque al dueno "Maria Garcia"
|
||||
Y Maria tiene 3 mascotas
|
||||
Cuando veo su perfil
|
||||
Entonces deberia ver las 3 mascotas listadas
|
||||
Y deberia poder navegar al historial de cada una
|
||||
248
atlas/book/gherkin-samples/index.html
Normal file
248
atlas/book/gherkin-samples/index.html
Normal file
@@ -0,0 +1,248 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Gherkin Samples - Album</title>
|
||||
<style>
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body {
|
||||
font-family: system-ui, -apple-system, sans-serif;
|
||||
background: #f8fafc;
|
||||
color: #1e293b;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.container { max-width: 1000px; margin: 0 auto; padding: 2rem 1rem; }
|
||||
header { margin-bottom: 2rem; }
|
||||
.breadcrumb { font-size: 0.9rem; color: #64748b; margin-bottom: 0.5rem; }
|
||||
.breadcrumb a { color: #6366f1; text-decoration: none; }
|
||||
.breadcrumb a:hover { text-decoration: underline; }
|
||||
h1 { font-size: 2rem; color: #6366f1; }
|
||||
.subtitle { color: #64748b; margin-top: 0.5rem; }
|
||||
.sample-badge {
|
||||
display: inline-block;
|
||||
background: #fef3c7;
|
||||
color: #92400e;
|
||||
padding: 0.25rem 0.75rem;
|
||||
border-radius: 4px;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.lang-tabs {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
.lang-tab {
|
||||
padding: 0.5rem 1rem;
|
||||
border: 2px solid #e2e8f0;
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
background: white;
|
||||
font-weight: 500;
|
||||
color: #64748b;
|
||||
}
|
||||
.lang-tab.active {
|
||||
border-color: #6366f1;
|
||||
color: #6366f1;
|
||||
background: #eef2ff;
|
||||
}
|
||||
.lang-section { display: none; }
|
||||
.lang-section.active { display: block; }
|
||||
.user-type {
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 1.5rem;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
||||
}
|
||||
.user-type h2 {
|
||||
font-size: 1.25rem;
|
||||
color: #6366f1;
|
||||
margin-bottom: 1rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
.user-type h2::before {
|
||||
content: '';
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background: #818cf8;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.features-list { list-style: none; }
|
||||
.features-list li {
|
||||
border-bottom: 1px solid #e2e8f0;
|
||||
}
|
||||
.features-list li:last-child { border-bottom: none; }
|
||||
.features-list a {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0.75rem 0;
|
||||
text-decoration: none;
|
||||
color: #1e293b;
|
||||
}
|
||||
.features-list a:hover { color: #6366f1; }
|
||||
.features-list .name { font-weight: 500; }
|
||||
.features-list .ext { color: #94a3b8; font-size: 0.85rem; }
|
||||
.features-list .arrow { color: #94a3b8; }
|
||||
.info-box {
|
||||
background: #eef2ff;
|
||||
border: 1px solid #c7d2fe;
|
||||
border-radius: 8px;
|
||||
padding: 1rem;
|
||||
margin-top: 2rem;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.info-box h3 { font-size: 0.9rem; color: #6366f1; margin-bottom: 0.5rem; }
|
||||
.keywords {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.keyword {
|
||||
background: white;
|
||||
border: 1px solid #c7d2fe;
|
||||
padding: 0.25rem 0.5rem;
|
||||
border-radius: 4px;
|
||||
font-family: monospace;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
footer {
|
||||
margin-top: 3rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid #e2e8f0;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
footer a { color: #6366f1; text-decoration: none; }
|
||||
footer a:hover { text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
<div class="breadcrumb"><a href="/">Album</a> / Gherkin Samples</div>
|
||||
<h1>Gherkin Samples</h1>
|
||||
<p class="subtitle">BDD feature files - Given/When/Then specifications derived from ops templates</p>
|
||||
<span class="sample-badge">Sample Data</span>
|
||||
</header>
|
||||
|
||||
<div class="lang-tabs">
|
||||
<button class="lang-tab active" onclick="showLang('es')">Espanol (Dado/Cuando/Entonces)</button>
|
||||
<button class="lang-tab" onclick="showLang('en')">English (Given/When/Then)</button>
|
||||
</div>
|
||||
|
||||
<!-- Spanish -->
|
||||
<div id="lang-es" class="lang-section active">
|
||||
<div class="user-type">
|
||||
<h2>Pet Owner</h2>
|
||||
<ul class="features-list">
|
||||
<li><a href="/book/gherkin/es/pet-owner/01-registro.feature"><span class="name">01. Registro de Usuario</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/pet-owner/02-reservar-turno.feature"><span class="name">02. Reservar Turno</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/pet-owner/03-gestion-mascotas.feature"><span class="name">03. Gestion de Mascotas</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/pet-owner/04-pago-turno.feature"><span class="name">04. Pago de Turno</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/pet-owner/05-historial-medico.feature"><span class="name">05. Historial Medico</span><span class="ext">.feature</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="user-type">
|
||||
<h2>Veterinarian</h2>
|
||||
<ul class="features-list">
|
||||
<li><a href="/book/gherkin/es/veterinarian/01-aceptar-solicitud.feature"><span class="name">01. Aceptar/Rechazar Solicitud</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/veterinarian/02-gestion-agenda.feature"><span class="name">02. Gestion de Agenda</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/veterinarian/03-realizar-visita.feature"><span class="name">03. Realizar Visita</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/veterinarian/04-zonas-cobertura.feature"><span class="name">04. Zonas de Cobertura</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/veterinarian/05-historial-pacientes.feature"><span class="name">05. Historial de Pacientes</span><span class="ext">.feature</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="user-type">
|
||||
<h2>Backoffice</h2>
|
||||
<ul class="features-list">
|
||||
<li><a href="/book/gherkin/es/backoffice/01-gestion-solicitudes.feature"><span class="name">01. Gestion de Solicitudes</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/backoffice/02-gestion-usuarios.feature"><span class="name">02. Gestion de Usuarios</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/backoffice/03-gestion-servicios.feature"><span class="name">03. Gestion de Servicios</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/backoffice/04-reembolsos.feature"><span class="name">04. Reembolsos</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/es/backoffice/05-reportes.feature"><span class="name">05. Reportes</span><span class="ext">.feature</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="info-box">
|
||||
<h3>Spanish Keywords</h3>
|
||||
<div class="keywords">
|
||||
<span class="keyword">Caracteristica</span>
|
||||
<span class="keyword">Escenario</span>
|
||||
<span class="keyword">Dado</span>
|
||||
<span class="keyword">Cuando</span>
|
||||
<span class="keyword">Entonces</span>
|
||||
<span class="keyword">Y</span>
|
||||
<span class="keyword">Pero</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- English -->
|
||||
<div id="lang-en" class="lang-section">
|
||||
<div class="user-type">
|
||||
<h2>Pet Owner</h2>
|
||||
<ul class="features-list">
|
||||
<li><a href="/book/gherkin/en/pet-owner/01-registro.feature"><span class="name">01. User Registration</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/pet-owner/02-reservar-turno.feature"><span class="name">02. Book Appointment</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/pet-owner/03-gestion-mascotas.feature"><span class="name">03. Pet Management</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/pet-owner/04-pago-turno.feature"><span class="name">04. Payment</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/pet-owner/05-historial-medico.feature"><span class="name">05. Medical History</span><span class="ext">.feature</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="user-type">
|
||||
<h2>Veterinarian</h2>
|
||||
<ul class="features-list">
|
||||
<li><a href="/book/gherkin/en/veterinarian/01-aceptar-solicitud.feature"><span class="name">01. Accept/Reject Request</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/veterinarian/02-gestion-agenda.feature"><span class="name">02. Schedule Management</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/veterinarian/03-realizar-visita.feature"><span class="name">03. Conduct Visit</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/veterinarian/04-zonas-cobertura.feature"><span class="name">04. Coverage Zones</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/veterinarian/05-historial-pacientes.feature"><span class="name">05. Patient History</span><span class="ext">.feature</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="user-type">
|
||||
<h2>Backoffice</h2>
|
||||
<ul class="features-list">
|
||||
<li><a href="/book/gherkin/en/backoffice/01-gestion-solicitudes.feature"><span class="name">01. Request Management</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/backoffice/02-gestion-usuarios.feature"><span class="name">02. User Management</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/backoffice/03-gestion-servicios.feature"><span class="name">03. Service Management</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/backoffice/04-reembolsos.feature"><span class="name">04. Refunds</span><span class="ext">.feature</span></a></li>
|
||||
<li><a href="/book/gherkin/en/backoffice/05-reportes.feature"><span class="name">05. Reports</span><span class="ext">.feature</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="info-box">
|
||||
<h3>English Keywords</h3>
|
||||
<div class="keywords">
|
||||
<span class="keyword">Feature</span>
|
||||
<span class="keyword">Scenario</span>
|
||||
<span class="keyword">Given</span>
|
||||
<span class="keyword">When</span>
|
||||
<span class="keyword">Then</span>
|
||||
<span class="keyword">And</span>
|
||||
<span class="keyword">But</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<a href="/">← Album</a> |
|
||||
<a href="/book/ops-templates/">Source Templates</a> |
|
||||
<a href="/book/feature-flow/">Feature Flow Pipeline</a>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function showLang(lang) {
|
||||
document.querySelectorAll('.lang-section').forEach(s => s.classList.remove('active'));
|
||||
document.querySelectorAll('.lang-tab').forEach(t => t.classList.remove('active'));
|
||||
document.getElementById('lang-' + lang).classList.add('active');
|
||||
event.target.classList.add('active');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user