major restructure

This commit is contained in:
buenosairesam
2026-01-20 05:31:26 -03:00
parent 27b32deba4
commit e4052374db
328 changed files with 1018 additions and 10018 deletions

View File

@@ -0,0 +1,79 @@
# Ops Templates Sample Book
## Purpose
**SAMPLE DATA** - Example filled ops/support templates for demonstration and testing purposes. These are realistic examples to work with while actual definitions are pending from ops/support team.
Use these to:
- Understand the template structure
- Test tooling and workflows
- Demo the feature-flow pipeline
Real templates will follow the same structure but with validated content.
## Structure
```
ops-templates-sample/
├── pet-owner/ # 5 flows for pet owners
│ ├── 01-registro.md
│ ├── 02-reservar-turno.md
│ ├── 03-gestion-mascotas.md
│ ├── 04-pago-turno.md
│ └── 05-historial-medico.md
├── veterinarian/ # 5 flows for vets
│ ├── 01-aceptar-solicitud.md
│ ├── 02-gestion-agenda.md
│ ├── 03-realizar-visita.md
│ ├── 04-zonas-cobertura.md
│ └── 05-historial-pacientes.md
└── backoffice/ # 5 flows for admins
├── 01-gestion-solicitudes.md
├── 02-gestion-usuarios.md
├── 03-gestion-servicios.md
├── 04-reembolsos.md
└── 05-reportes.md
```
## Template Format
Each file follows the standard ops template:
```markdown
# [Nombre del Flujo]
## Tipo de usuario
## Donde empieza
## Que quiere hacer el usuario
## Pasos
## Que deberia pasar
## Problemas comunes
## Casos especiales
## Flujos relacionados
## Notas tecnicas
```
## Corresponding Gherkin
Each template has corresponding `.feature` files in:
- `album/book/gherkin-sample/es/` - Spanish keywords (Dado/Cuando/Entonces)
- `album/book/gherkin-sample/en/` - English keywords (Given/When/Then)
## Usage
1. **Support/Ops**: Use templates to document new flows
2. **Dev**: Convert templates to Gherkin specs
3. **QA**: Use Gherkin to derive test cases
4. **Product**: Review templates for completeness
## Source Template
The base template is at: `album/template/ops-flow/plantilla-flujo.md`
## Coverage
| Area | Flows | Status |
|------|-------|--------|
| Pet Owner | 5 | Complete |
| Veterinarian | 5 | Complete |
| Backoffice | 5 | Complete |
| **Total** | **15** | |

View File

@@ -0,0 +1,335 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ filename }} - Ops Template</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: 800px; margin: 0 auto; padding: 2rem 1rem; }
header { margin-bottom: 1.5rem; }
.breadcrumb { font-size: 0.9rem; color: #64748b; margin-bottom: 0.5rem; }
.breadcrumb a { color: #15803d; text-decoration: none; }
.breadcrumb a:hover { text-decoration: underline; }
h1 { font-size: 1.5rem; color: #15803d; }
.meta {
display: flex;
gap: 0.5rem;
margin-top: 0.5rem;
font-size: 0.8rem;
}
.meta span {
background: #f1f5f9;
padding: 0.2rem 0.5rem;
border-radius: 4px;
color: #64748b;
}
.meta .sample { background: #fef3c7; color: #92400e; }
/* Form-like styling */
.form-card {
background: white;
border-radius: 12px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
overflow: hidden;
}
.form-header {
background: linear-gradient(135deg, #15803d, #22c55e);
color: white;
padding: 1rem 1.5rem;
}
.form-header h2 { font-size: 1.1rem; font-weight: 600; }
.form-body { padding: 1.5rem; }
.field {
margin-bottom: 1.25rem;
}
.field:last-child { margin-bottom: 0; }
.field-label {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #64748b;
margin-bottom: 0.35rem;
}
.field-label .edit-icon {
cursor: pointer;
opacity: 0.5;
font-size: 0.85rem;
}
.field-label .edit-icon:hover {
opacity: 1;
}
.field-value {
background: #f8fafc;
border: 1px solid #e2e8f0;
border-radius: 6px;
padding: 0.75rem;
font-size: 0.95rem;
color: #1e293b;
min-height: 2.5rem;
}
.field-value:focus-within {
border-color: #15803d;
outline: none;
box-shadow: 0 0 0 3px rgba(21, 128, 61, 0.1);
}
.field-value.multiline {
min-height: 4rem;
}
.field-value ul, .field-value ol {
margin: 0;
padding-left: 1.25rem;
}
.field-value li {
margin-bottom: 0.25rem;
}
.field-value p {
margin: 0 0 0.5rem 0;
}
.field-value p:last-child { margin-bottom: 0; }
.field-textarea {
display: none;
width: 100%;
min-height: 100px;
padding: 0.75rem;
font-size: 0.95rem;
font-family: inherit;
border: 1px solid #15803d;
border-radius: 6px;
resize: vertical;
box-shadow: 0 0 0 3px rgba(21, 128, 61, 0.1);
}
.field.editing .field-value { display: none; }
.field.editing .field-textarea { display: block; }
/* Special field styles */
.field-steps .field-value {
counter-reset: step;
padding-left: 0.5rem;
}
.field-steps ol {
list-style: none;
padding-left: 0;
}
.field-steps li {
position: relative;
padding-left: 2rem;
margin-bottom: 0.5rem;
}
.field-steps li::before {
counter-increment: step;
content: counter(step);
position: absolute;
left: 0;
width: 1.5rem;
height: 1.5rem;
background: #15803d;
color: white;
border-radius: 50%;
font-size: 0.75rem;
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
}
.field-problems .field-value {
background: #fef2f2;
border-color: #fecaca;
}
.field-problems li::before {
content: '!';
color: #dc2626;
font-weight: bold;
margin-right: 0.5rem;
}
.field-special .field-value {
background: #fffbeb;
border-color: #fde68a;
}
.field-technical .field-value {
background: #f0fdf4;
border-color: #bbf7d0;
font-family: 'JetBrains Mono', monospace;
font-size: 0.85rem;
}
.field-technical code {
background: #dcfce7;
padding: 0.1rem 0.35rem;
border-radius: 3px;
font-size: 0.85em;
}
.sidebar {
margin-top: 1.5rem;
padding: 1rem;
background: #f0fdf4;
border: 1px solid #bbf7d0;
border-radius: 8px;
}
.sidebar h3 { font-size: 0.8rem; color: #15803d; margin-bottom: 0.75rem; text-transform: uppercase; }
.sidebar a {
display: block;
color: #15803d;
text-decoration: none;
padding: 0.35rem 0;
font-size: 0.9rem;
}
.sidebar a:hover { text-decoration: underline; }
footer {
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid #e2e8f0;
font-size: 0.85rem;
}
footer a { color: #15803d; 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/ops-templates/">Ops Templates</a> / {{ user_type }}
</div>
<h1>{{ filename.replace('.md', '').replace('-', ' ').title() }}</h1>
<div class="meta">
<span>{{ user_type }}</span>
<span class="sample">Sample</span>
</div>
</header>
<div class="form-card">
<div class="form-header">
<h2>User Flow Template</h2>
</div>
<div class="form-body" id="form-content">
<!-- Content will be parsed and inserted here -->
</div>
</div>
<div class="sidebar">
<h3>Related</h3>
<a href="/book/gherkin/es/{{ user_type }}/{{ filename.replace('.md', '.feature') }}">Gherkin (Spanish)</a>
<a href="/book/gherkin/en/{{ user_type }}/{{ filename.replace('.md', '.feature') }}">Gherkin (English)</a>
<a href="/book/feature-flow/">Feature Flow Pipeline</a>
</div>
<footer>
<a href="/book/ops-templates/">&larr; All Templates</a>
</footer>
</div>
<script>
const rawContent = {{ content | tojson }};
function parseMarkdown(md) {
const sections = {};
let currentSection = null;
let currentContent = [];
const lines = md.split('\n');
for (const line of lines) {
if (line.startsWith('## ')) {
if (currentSection) {
sections[currentSection] = currentContent.join('\n').trim();
}
currentSection = line.replace('## ', '').trim();
currentContent = [];
} else if (line.startsWith('# ')) {
sections['_title'] = line.replace('# ', '').trim();
} else if (currentSection) {
currentContent.push(line);
}
}
if (currentSection) {
sections[currentSection] = currentContent.join('\n').trim();
}
return sections;
}
function formatContent(content) {
if (!content) return '';
// Convert markdown lists to HTML
let html = content
.replace(/^(\d+)\.\s+(.*)$/gm, '<li>$2</li>')
.replace(/^-\s+(.*)$/gm, '<li>$1</li>')
.replace(/`([^`]+)`/g, '<code>$1</code>');
// Wrap consecutive li elements in ul/ol
if (html.includes('<li>')) {
if (content.match(/^\d+\./m)) {
html = '<ol>' + html + '</ol>';
} else {
html = '<ul>' + html + '</ul>';
}
}
// Convert line breaks to paragraphs for non-list content
if (!html.includes('<li>')) {
html = html.split('\n').filter(l => l.trim()).map(l => '<p>' + l + '</p>').join('');
}
return html;
}
function createField(label, content, className = '') {
if (!content) return '';
return `
<div class="field ${className}">
<label class="field-label">${label} <span class="edit-icon" onclick="toggleEdit(this)" title="Edit field">&#9998;</span></label>
<div class="field-value ${content.includes('\n') ? 'multiline' : ''}">${formatContent(content)}</div>
<textarea class="field-textarea">${content}</textarea>
</div>
`;
}
function toggleEdit(icon) {
const field = icon.closest('.field');
field.classList.toggle('editing');
if (field.classList.contains('editing')) {
field.querySelector('.field-textarea').focus();
}
}
const sections = parseMarkdown(rawContent);
const container = document.getElementById('form-content');
const fieldMap = [
{ key: 'Tipo de usuario', label: 'Tipo de Usuario', class: '' },
{ key: 'Donde empieza', label: 'Punto de Entrada', class: '' },
{ key: 'Que quiere hacer el usuario', label: 'Objetivo del Usuario', class: '' },
{ key: 'Pasos', label: 'Pasos', class: 'field-steps' },
{ key: 'Que deberia pasar', label: 'Resultado Esperado', class: '' },
{ key: 'Problemas comunes', label: 'Problemas Comunes', class: 'field-problems' },
{ key: 'Casos especiales', label: 'Casos Especiales', class: 'field-special' },
{ key: 'Flujos relacionados', label: 'Flujos Relacionados', class: '' },
{ key: 'Notas tecnicas', label: 'Notas Tecnicas', class: 'field-technical' },
];
let html = '';
for (const field of fieldMap) {
if (sections[field.key]) {
html += createField(field.label, sections[field.key], field.class);
}
}
container.innerHTML = html;
</script>
</body>
</html>

View File

@@ -0,0 +1,92 @@
# Gestion de Solicitudes de Servicio
## Tipo de usuario
Administrador / Operaciones
## Donde empieza
Backoffice `/admin/` -> Dashboard o Seccion "Solicitudes"
## Que quiere hacer el usuario
Ver, filtrar y gestionar todas las solicitudes de servicio del sistema
## Pasos - Ver solicitudes
1. Acceder al backoffice
2. Ir a seccion "Solicitudes"
3. Ver listado con todas las solicitudes
4. Usar filtros para encontrar solicitudes especificas:
- Por estado (Pendiente, Coordinado, Pagado, Completado, Cancelado)
- Por fecha
- Por barrio/zona
- Por veterinario
- Por dueno
## Pasos - Ver detalle de solicitud
1. Click en una solicitud del listado
2. Ver toda la informacion:
- Datos del dueno
- Datos de la mascota
- Servicios solicitados
- Fechas preferidas
- Veterinario asignado (si hay)
- Estado de pago
- Historial de cambios de estado
## Pasos - Asignar veterinario manualmente
1. Abrir solicitud en estado "Pendiente"
2. Click en "Asignar veterinario"
3. Ver lista de vets disponibles en la zona
4. Seleccionar veterinario
5. Seleccionar fecha y hora
6. Confirmar asignacion
7. Sistema notifica al vet y al dueno
## Pasos - Cambiar estado manualmente
1. Abrir solicitud
2. Click en "Cambiar estado"
3. Seleccionar nuevo estado
4. Ingresar motivo (si aplica)
5. Confirmar
6. Se registra en el historial
## Que deberia pasar
- Vision completa de todas las solicitudes
- Capacidad de intervenir cuando algo falla
- Trazabilidad de cambios
- Notificaciones a las partes afectadas
## Problemas comunes
- Solicitud sin vet disponible en la zona
- Usuario pago pero webhook fallo
- Vet no puede asistir y hay que reasignar
- Dueno quiere cancelar pero ya pago
- Solicitudes duplicadas del mismo dueno
## Casos especiales
- Solicitud urgente sin vets disponibles
- Reasignacion a ultimo momento
- Cancelacion con reembolso
- Solicitud con datos incompletos
- Dueno no responde a confirmaciones
## Flujos relacionados
- Proceso de reembolso
- Gestion de usuarios
- Reportes
## Notas tecnicas
- APIs:
- `GET /solicitudes/api/v1/service-requests/` (listado con filtros)
- `GET /solicitudes/api/v1/service-requests/{id}/` (detalle)
- `PATCH /solicitudes/api/v1/service-requests/{id}/` (asignar vet)
- `PATCH /solicitudes/api/v1/change-service-request-state/` (cambiar estado)
- Estados validos: pending, coordinated, payed, completed, cancelled
- Permisos: solo staff puede ver todas las solicitudes

View File

@@ -0,0 +1,106 @@
# Gestion de Usuarios
## Tipo de usuario
Administrador / Operaciones
## Donde empieza
Backoffice `/admin/` -> Seccion "Usuarios" o "Duenos" / "Veterinarios"
## Que quiere hacer el usuario
Administrar duenos de mascotas y veterinarios del sistema
## Pasos - Ver/Buscar duenos
1. Ir a "Duenos de mascotas"
2. Ver listado de todos los duenos
3. Usar buscador (nombre, email, telefono)
4. Filtrar por:
- Tipo (Registrado / Invitado)
- Fecha de registro
- Con/sin turnos activos
## Pasos - Ver detalle de dueno
1. Click en un dueno
2. Ver informacion completa:
- Datos personales
- Direcciones registradas
- Mascotas
- Historial de solicitudes
- Historial de pagos
## Pasos - Editar dueno
1. En el detalle, click "Editar"
2. Modificar campos permitidos:
- Nombre
- Telefono
- Email
- Direccion
3. Guardar cambios
## Pasos - Gestionar veterinarios
1. Ir a "Veterinarios"
2. Ver listado con:
- Nombre y matricula
- Zonas de cobertura
- Estado (Activo/Inactivo)
- Turnos del mes
## Pasos - Agregar nuevo veterinario
1. Click en "Agregar veterinario"
2. Completar datos:
- Nombre completo
- Numero de matricula
- Email
- Telefono
- Especialidades
- Zonas de cobertura inicial
3. Crear credenciales de acceso
4. Guardar
## Pasos - Desactivar veterinario
1. Abrir perfil del vet
2. Click en "Desactivar"
3. Confirmar
4. Vet deja de recibir solicitudes
5. Visitas ya aceptadas se mantienen o se reasignan
## Que deberia pasar
- Gestion completa de usuarios del sistema
- Capacidad de corregir datos erroneos
- Alta/baja de veterinarios
- Vision del estado de cada usuario
## Problemas comunes
- Duenos duplicados (se registraron con email diferente)
- Vet quiere darse de baja pero tiene citas pendientes
- Email incorrecto y no reciben notificaciones
- Cuenta de invitado que quiere convertirse en registrada
## Casos especiales
- Fusionar cuentas duplicadas
- Transferir mascota a otro dueno
- Vet de vacaciones temporalmente
- Cambio de numero de matricula
## Flujos relacionados
- Gestion de solicitudes (ver historial por usuario)
- Reportes (filtrar por usuario)
## Notas tecnicas
- APIs:
- `GET /mascotas/api/v1/pet-owners/` (duenos)
- `GET /mascotas/api/v1/veterinarians/` (vets)
- `POST /mascotas/api/v1/veterinarians/` (crear vet)
- `PATCH /mascotas/api/v1/veterinarians/{id}/` (editar/desactivar)
- Permisos: solo staff puede modificar usuarios
- Soft delete para mantener historial

View File

@@ -0,0 +1,98 @@
# Gestion de Servicios y Precios
## Tipo de usuario
Administrador
## Donde empieza
Backoffice `/admin/` -> Seccion "Servicios" o Django Admin -> Productos
## Que quiere hacer el usuario
Administrar el catalogo de servicios veterinarios y sus precios
## Pasos - Ver servicios
1. Ir a "Servicios"
2. Ver listado de todos los servicios
3. Filtrar por:
- Categoria (Vacunacion, Consulta, Cirugia, etc.)
- Tipo de mascota (Perro, Gato, Ambos)
- Estado (Activo/Inactivo)
## Pasos - Agregar nuevo servicio
1. Click en "Agregar servicio"
2. Completar datos:
- Nombre del servicio
- Descripcion
- Categoria
- Tipo de mascota aplicable
- Precio base
- Duracion estimada
- Requiere otros servicios (dependencias)
3. Guardar
## Pasos - Editar servicio
1. Abrir servicio existente
2. Modificar campos
3. Guardar
4. Cambios aplican a nuevas solicitudes
## Pasos - Gestionar precios
1. Abrir servicio
2. Ir a seccion "Precios"
3. Ver precio actual
4. Para cambiar precio:
- Click "Agregar precio"
- Ingresar monto
- Definir fecha de vigencia
- Guardar
5. Precio anterior queda en historial
## Pasos - Configurar combos
1. Ir a "Combos" o "Paquetes"
2. Crear nuevo combo:
- Nombre del combo
- Servicios incluidos
- Precio del combo (con descuento)
- Condiciones de aplicacion
3. Guardar
## Que deberia pasar
- Catalogo actualizado de servicios
- Precios correctos en el turnero
- Combos aplicados automaticamente
- Historial de precios para facturacion
## Problemas comunes
- Cambio de precio afecta solicitudes ya creadas
- Servicio deprecado pero con solicitudes pendientes
- Combo no se aplica automaticamente
- Precio diferente por zona/vet
## Casos especiales
- Servicio con precio variable (depende de peso mascota)
- Servicio estacional (solo ciertas epocas)
- Promocion temporal
- Precio especial por vet
## Flujos relacionados
- Turnero (muestra servicios disponibles)
- Facturacion (usa precios)
## Notas tecnicas
- APIs:
- `GET /productos/api/v1/services/` (servicios)
- `POST /productos/api/v1/services/` (crear)
- `PATCH /productos/api/v1/services/{id}/` (editar)
- `GET /productos/api/v1/prices/` (precios)
- `POST /productos/api/v1/prices/` (nuevo precio)
- Modelo Price tiene fecha de vigencia
- Precio se congela al momento de crear solicitud

View File

@@ -0,0 +1,82 @@
# Proceso de Reembolso
## Tipo de usuario
Administrador / Operaciones
## Donde empieza
Backoffice -> Solicitud pagada -> "Procesar reembolso" o Seccion "Pagos"
## Que quiere hacer el usuario
Procesar un reembolso para un turno que fue cancelado despues del pago
## Pasos - Identificar solicitud a reembolsar
1. Buscar la solicitud por:
- ID de solicitud
- Nombre del dueno
- Numero de operacion de Mercado Pago
2. Verificar que esta en estado "Pagado"
3. Verificar que el pago fue exitoso
## Pasos - Procesar reembolso
1. Abrir detalle de la solicitud
2. Click en "Procesar reembolso"
3. Ver informacion del pago:
- Monto pagado
- Fecha de pago
- Metodo de pago
- ID de operacion MP
4. Seleccionar tipo de reembolso:
- Total
- Parcial (ingresar monto)
5. Ingresar motivo del reembolso
6. Confirmar
7. Sistema procesa reembolso en Mercado Pago
8. Actualizar estado de la solicitud
## Pasos - Verificar reembolso
1. Ir a seccion "Pagos" o historial de la solicitud
2. Verificar que el reembolso fue procesado
3. Ver estado del reembolso en Mercado Pago
## Que deberia pasar
- Reembolso procesado en Mercado Pago
- Dueno recibe el dinero (segun tiempos de MP)
- Solicitud actualiza estado
- Registro en el historial
- Dueno notificado por email
## Problemas comunes
- Reembolso parcial no soportado por el metodo de pago
- Plazo de reembolso vencido (politica de MP)
- Dueno reclama que no recibio el dinero
- Reembolso duplicado por error
- Pago original en disputa
## Casos especiales
- Reembolso por mala atencion
- Reembolso parcial (solo algunos servicios)
- Visita incompleta (reembolso proporcional)
- Dueno quiere credito en vez de reembolso
- Reembolso fuera de plazo (solucion alternativa)
## Flujos relacionados
- Gestion de solicitudes
- Cancelacion de turno
- Atencion al cliente
## Notas tecnicas
- API Mercado Pago: `POST /v1/payments/{id}/refunds`
- Tiempos de acreditacion:
- Tarjeta credito: 1-2 estados de cuenta
- Tarjeta debito: 5-10 dias habiles
- Dinero en cuenta MP: inmediato
- Plazo maximo para reembolso: 180 dias desde el pago
- Se debe guardar log de todos los reembolsos

View File

@@ -0,0 +1,99 @@
# Reportes y Dashboard
## Tipo de usuario
Administrador / Gerencia
## Donde empieza
Backoffice `/admin/` -> Dashboard o Seccion "Reportes"
## Que quiere hacer el usuario
Ver metricas del negocio, generar reportes y analizar datos
## Pasos - Ver dashboard
1. Acceder al backoffice
2. Ver dashboard principal con:
- Solicitudes del dia/semana/mes
- Ingresos del periodo
- Visitas completadas
- Conversion (solicitudes -> pagos)
- Vets activos
## Pasos - Generar reporte de solicitudes
1. Ir a "Reportes" -> "Solicitudes"
2. Seleccionar rango de fechas
3. Filtrar por:
- Estado
- Zona
- Veterinario
- Tipo de servicio
4. Click "Generar"
5. Ver tabla con resultados
6. Opcion de exportar (CSV/Excel)
## Pasos - Generar reporte de ingresos
1. Ir a "Reportes" -> "Ingresos"
2. Seleccionar periodo
3. Agrupar por:
- Dia/Semana/Mes
- Veterinario
- Servicio
- Zona
4. Ver grafico y tabla
5. Exportar si es necesario
## Pasos - Reporte de veterinarios
1. Ir a "Reportes" -> "Veterinarios"
2. Ver para cada vet:
- Visitas completadas
- Calificacion promedio
- Ingresos generados
- Tasa de cancelacion
3. Filtrar por periodo
4. Ordenar por metrica
## Pasos - Exportar datos
1. En cualquier reporte, click "Exportar"
2. Seleccionar formato (CSV, Excel)
3. Descargar archivo
4. Usar para analisis externo o contabilidad
## Que deberia pasar
- Vision clara del estado del negocio
- Datos para toma de decisiones
- Reportes exportables para contabilidad
- Identificacion de tendencias
## Problemas comunes
- Datos no actualizados en tiempo real
- Filtros que no devuelven lo esperado
- Discrepancia entre reportes y realidad
- Exportacion con formato incorrecto
## Casos especiales
- Reporte de prueba vs produccion
- Datos historicos antes de implementar filtro
- Comparativa año vs año
- Reporte personalizado para inversores
## Flujos relacionados
- Gestion de solicitudes (fuente de datos)
- Facturacion AFIP
- Google Sheets sync
## Notas tecnicas
- API:
- `GET /mascotas/api/v1/stats-summary` (metricas principales)
- `GET /solicitudes/api/v1/service-requests/?date_from=X&date_to=Y` (datos crudos)
- Google Sheets: sincronizacion automatica via Celery
- Dashboard actualiza cada 5 minutos
- Reportes pesados: generar async y notificar cuando estan listos

View File

@@ -0,0 +1,55 @@
# Registro de Usuario
## Tipo de usuario
Dueno de mascota (nuevo)
## Donde empieza
Pagina principal -> Boton "Registrarse" o `/register`
## Que quiere hacer el usuario
Crear una cuenta nueva para poder reservar turnos y gestionar sus mascotas
## Pasos
1. Click en "Registrarse" en la pagina principal
2. Ingresar email
3. Ingresar contraseña
4. Confirmar contraseña
5. Aceptar terminos y condiciones
6. Click en "Crear cuenta"
7. Recibir email de verificacion
8. Click en el link de verificacion
9. Cuenta activada, redirige al dashboard
## Que deberia pasar
- Usuario creado en el sistema
- Email de bienvenida enviado
- Puede iniciar sesion inmediatamente
- Ve su dashboard vacio (sin mascotas, sin turnos)
## Problemas comunes
- El email ya esta registrado pero el usuario no lo recuerda
- El email de verificacion llega a spam
- La contraseña no cumple los requisitos minimos
- El usuario cierra el browser antes de verificar y no encuentra el email despues
- Usuarios intentan registrarse con email de otra persona
## Casos especiales
- Si el email existe como usuario invitado (del turnero), deberia linkear las cuentas
- Si el usuario ya tiene cuenta pero no verificada, reenviar email de verificacion
- Registro desde el flujo de turnero (ya ingreso datos, solo falta contraseña)
## Flujos relacionados
- Login (despues de registrarse)
- Turnero (puede disparar registro)
- Recuperar contraseña (si ya tenia cuenta y no recuerda)
## Notas tecnicas
- API: `POST /common/users/create/`
- Validacion de contraseña: minimo 8 caracteres, 1 numero, 1 mayuscula
- Verificacion expira en 24 horas

View File

@@ -0,0 +1,77 @@
# Reservar Turno (Turnero)
## Tipo de usuario
Dueno de mascota (invitado, registrado, o recurrente)
## Donde empieza
Pagina principal -> Boton "Agendar visita" o enlace directo `/turnero`
## Que quiere hacer el usuario
Reservar un turno veterinario a domicilio para su mascota
## Pasos
1. Click en "Agendar visita"
2. Ingresar direccion en el popup de cobertura
3. Sistema verifica si hay cobertura en esa zona
4. Si hay cobertura, click "Siguiente"
5. Completar datos de la mascota:
- Nombre
- Tipo (Perro/Gato)
- Raza (opcional)
- Edad aproximada
- Peso aproximado
- Si esta castrado/a
6. Seleccionar categoria de servicio (Vacunacion, Consulta, etc.)
7. Seleccionar servicios especificos
8. Ver que algunos servicios se agregan automaticamente (ej: consulta clinica)
9. Seleccionar fechas preferidas (hasta 3)
10. Seleccionar franja horaria preferida
11. Ingresar datos de contacto:
- Nombre completo
- Telefono
- Email
12. Revisar resumen
13. Enviar solicitud
## Que deberia pasar
- Solicitud creada con estado "Pendiente"
- Email de confirmacion al usuario
- Notificacion a veterinarios de la zona
- Aparece en "Mis turnos" del usuario
## Problemas comunes
- No hay cobertura en la zona del usuario
- El autocompletado de direcciones no encuentra la calle
- Usuario no puede quitar "Consulta clinica" cuando selecciona vacunacion
- Confunden "fecha preferida" con "fecha confirmada"
- No entienden por que no pueden elegir hora exacta
- El total no se muestra hasta el final y sorprende al usuario
## Casos especiales
- Usuario invitado: se crea como guest, puede registrarse despues
- Usuario logueado: datos pre-llenados, mascota puede ser existente
- Usuario recurrente (mismo email): sistema detecta y sugiere linkear
- Mascota ya castrada: no mostrar servicio de castracion
- Servicios combo: algunos incluyen otros automaticamente
- Zona sin cobertura: mostrar formulario para avisar cuando haya
## Flujos relacionados
- Ver mis turnos (despues de reservar)
- Pagar turno (cuando se coordina)
- Cancelar turno
- Agregar mascota (si ya tiene cuenta)
## Notas tecnicas
- APIs:
- `POST /mascotas/api/v1/coverage-check/` (verificar cobertura)
- `POST /mascotas/api/v1/pet-owners/` (crear dueno invitado)
- `POST /mascotas/api/v1/pets/` (crear mascota)
- `GET /productos/api/v1/services/` (obtener servicios)
- `POST /solicitudes/api/v1/service-requests/` (crear solicitud)
- Estados de solicitud: pending -> coordinated -> payed -> completed

View File

@@ -0,0 +1,79 @@
# Gestion de Mascotas
## Tipo de usuario
Dueno de mascota (registrado)
## Donde empieza
Dashboard -> Seccion "Mis mascotas" o `/user/pets`
## Que quiere hacer el usuario
Agregar, editar o ver informacion de sus mascotas
## Pasos - Agregar mascota
1. Ir a "Mis mascotas"
2. Click en "Agregar mascota"
3. Completar formulario:
- Nombre (obligatorio)
- Tipo: Perro o Gato (obligatorio)
- Raza (opcional, lista segun tipo)
- Fecha de nacimiento o edad aproximada
- Peso en kg (opcional)
- Sexo
- Esta castrado/a (checkbox)
- Foto (opcional)
4. Guardar
## Pasos - Editar mascota
1. Ir a "Mis mascotas"
2. Click en la tarjeta de la mascota
3. Click en "Editar"
4. Modificar campos deseados
5. Guardar
## Pasos - Ver historial medico
1. Ir a "Mis mascotas"
2. Click en la tarjeta de la mascota
3. Ver seccion "Historial de visitas"
4. Click en una visita para ver el informe completo
## Que deberia pasar
- Mascota aparece en el listado
- Disponible para seleccionar en el turnero
- Historial medico accesible
- Foto visible en la tarjeta
## Problemas comunes
- Usuarios quieren agregar mascotas de otros tipos (conejo, ave) - no soportado
- No encuentran donde ver el historial medico
- Quieren eliminar mascota pero tiene turnos pendientes
- Foto muy grande no sube
- Confunden edad con fecha de nacimiento
## Casos especiales
- Mascota creada desde turnero como invitado: aparece cuando linkea cuenta
- Mascota fallecida: deberia poder marcarse (soft delete)
- Multiples mascotas con mismo nombre: permitido pero confuso
- Cambio de peso significativo: registrar historial?
## Flujos relacionados
- Reservar turno (seleccionar mascota existente)
- Ver historial medico
- Registro (crear primera mascota)
## Notas tecnicas
- APIs:
- `GET /mascotas/api/v1/pets/` (listar)
- `POST /mascotas/api/v1/pets/` (crear)
- `PATCH /mascotas/api/v1/pets/{id}/` (editar)
- `DELETE /mascotas/api/v1/pets/{id}/` (soft delete)
- `GET /mascotas/api/v1/vet-visits/?pet={id}` (historial)
- Tipos soportados: solo Perro y Gato por ahora
- Razas: lista predefinida por tipo

View File

@@ -0,0 +1,66 @@
# Pago de Turno
## Tipo de usuario
Dueno de mascota (con turno coordinado)
## Donde empieza
Email de confirmacion de turno -> Link "Pagar" o Dashboard -> Mis turnos -> Boton "Pagar"
## Que quiere hacer el usuario
Pagar un turno que ya fue coordinado con fecha y veterinario asignado
## Pasos
1. Recibir email/notificacion de que el turno fue coordinado
2. Ver detalle del turno con fecha, hora y veterinario asignado
3. Verificar el monto total
4. Click en "Pagar"
5. Redireccion a Mercado Pago
6. Seleccionar metodo de pago:
- Tarjeta de credito/debito
- Dinero en cuenta MP
- Transferencia bancaria
- Efectivo (Rapipago/PagoFacil)
7. Completar pago
8. Redireccion de vuelta a la plataforma
9. Ver confirmacion de pago exitoso
## Que deberia pasar
- Estado del turno cambia a "Pagado"
- Email de confirmacion de pago
- Comprobante disponible
- Veterinario notificado
- Turno aparece como confirmado en el calendario
## Problemas comunes
- Usuario cierra el browser durante el pago y no sabe si se proceso
- Pago rechazado por fondos insuficientes
- Link de pago expira y no pueden pagr
- Quieren pagar en efectivo el dia de la visita
- Precio cambio entre coordinacion y pago
- Quieren aplicar descuento/cupon y no encuentran donde
## Casos especiales
- Pago parcial: no soportado actualmente
- Pago con tarjeta rechazada: puede reintentar
- Pago por transferencia: demora en acreditarse (pendiente de confirmacion)
- Usuario paga pero webhook falla: requiere intervencion manual
- Turno cancelado despues de pagar: proceso de reembolso
## Flujos relacionados
- Ver mis turnos (antes y despues de pagar)
- Cancelar turno (si decide no pagar)
- Contactar soporte (problemas con pago)
## Notas tecnicas
- APIs:
- `POST /payments/api/v1/requests/{id}/preference/` (generar link MP)
- Webhook: `POST /payments/mp/webhook/` (notificacion de MP)
- Integracion: Mercado Pago Checkout Pro
- Estados: coordinated -> payed (despues de webhook exitoso)
- Timeout de preferencia: 24 horas

View File

@@ -0,0 +1,79 @@
# Ver Historial Medico
## Tipo de usuario
Dueno de mascota (registrado, con visitas completadas)
## Donde empieza
Dashboard -> Mis mascotas -> Mascota -> "Ver historial" o Mis turnos -> Turno completado -> "Ver informe"
## Que quiere hacer el usuario
Ver los informes medicos de las visitas veterinarias de su mascota
## Pasos - Desde mascotas
1. Ir a "Mis mascotas"
2. Seleccionar la mascota
3. Ver seccion "Historial de visitas"
4. Lista de visitas ordenadas por fecha (mas reciente primero)
5. Click en una visita para ver detalle
## Pasos - Desde turnos
1. Ir a "Mis turnos"
2. Filtrar por "Completados"
3. Click en un turno completado
4. Click en "Ver informe medico"
## Que muestra el informe
- Fecha de la visita
- Veterinario que atendio
- Motivo de consulta / servicios realizados
- Examen fisico:
- Peso registrado
- Temperatura
- Frecuencia cardiaca
- Observaciones generales
- Diagnostico
- Tratamiento indicado
- Medicamentos recetados (nombre, dosis, frecuencia, duracion)
- Estudios solicitados
- Proximos pasos / seguimiento recomendado
- Observaciones adicionales
## Que deberia pasar
- Usuario puede ver todos los informes de sus mascotas
- Puede descargar/imprimir el informe
- Informacion clara y entendible
## Problemas comunes
- Visita completada pero informe no cargado todavia
- Usuario quiere editar algo del informe (no puede, es del vet)
- Terminologia medica confusa
- No encuentra informe de visita antigua
- Quiere compartir informe con otro veterinario
## Casos especiales
- Visita sin informe: vet no lo cargo (deberia ser obligatorio)
- Informe incompleto: campos vacios
- Multiples visitas mismo dia: mostrar todas
- Mascota transferida de otro dueno: historial previo?
- Estudios pendientes: mostrar estado
## Flujos relacionados
- Gestion de mascotas
- Reservar turno de seguimiento
- Contactar veterinario (dudas sobre informe)
## Notas tecnicas
- APIs:
- `GET /mascotas/api/v1/vet-visits/?pet={id}` (listar visitas)
- `GET /mascotas/api/v1/vet-visits/{id}/` (detalle visita)
- `GET /mascotas/api/v1/vetvisitreport/?vet_visit={id}` (informe)
- PDF: generado on-demand o pre-generado?
- Permisos: solo dueno de la mascota puede ver

View File

@@ -0,0 +1,77 @@
# Aceptar/Rechazar Solicitud de Servicio
## Tipo de usuario
Veterinario
## Donde empieza
Dashboard veterinario `/vet/` -> Seccion "Solicitudes pendientes"
## Que quiere hacer el usuario
Revisar las solicitudes de servicio en su zona y decidir si las acepta o rechaza
## Pasos - Aceptar solicitud
1. Ingresar al dashboard veterinario
2. Ver listado de solicitudes pendientes en su zona de cobertura
3. Click en una solicitud para ver detalle:
- Datos del dueno (nombre, telefono, direccion)
- Datos de la mascota (nombre, tipo, edad, historial previo)
- Servicios solicitados
- Fechas preferidas por el dueno
4. Verificar disponibilidad en esas fechas
5. Click en "Aceptar"
6. Seleccionar fecha y hora disponible
7. Confirmar aceptacion
## Pasos - Rechazar solicitud
1. Ver detalle de la solicitud
2. Click en "Rechazar"
3. Opcionalmente seleccionar motivo:
- No tengo disponibilidad
- Fuera de mi zona
- No realizo este servicio
- Otro
4. Confirmar rechazo
## Que deberia pasar
Al aceptar:
- Solicitud pasa a estado "Coordinado"
- Vet queda asignado a la solicitud
- Dueno recibe notificacion con fecha/hora y datos del vet
- Aparece en el calendario del vet
Al rechazar:
- Solicitud sigue disponible para otros vets
- Si la rechazo yo, ya no la veo en mi lista
## Problemas comunes
- Multiples vets aceptan la misma solicitud casi simultaneamente
- El vet acepta pero el dueno no puede en esa fecha
- No hay suficientes vets en la zona y la solicitud queda sin atender
- Vet acepta por error y quiere deshacer
- Las fechas preferidas ya pasaron
## Casos especiales
- Solicitud con mascota que el vet ya atendio antes: mostrar historial
- Solicitud urgente/emergencia: destacar visualmente
- Vet con agenda completa: no deberia poder aceptar
- Solicitud con multiples mascotas: revisar tiempo necesario
- Zona limite: solicitud que aparece para vets de zonas adyacentes
## Flujos relacionados
- Ver mi agenda (despues de aceptar)
- Realizar visita
- Cancelar visita aceptada
## Notas tecnicas
- APIs:
- `GET /solicitudes/api/v1/service-requests/?state=pending&veterinarian_area=X`
- `PATCH /solicitudes/api/v1/service-requests/{id}/` (aceptar/rechazar)
- Race condition: backend debe manejar caso de aceptacion simultanea
- Push notification al dueno cuando se acepta

View File

@@ -0,0 +1,87 @@
# Gestion de Agenda
## Tipo de usuario
Veterinario
## Donde empieza
Dashboard veterinario `/vet/` -> Menu "Mi agenda" o `/vet/turnos`
## Que quiere hacer el usuario
Ver su calendario de visitas, gestionar disponibilidad y marcar dias no disponibles
## Pasos - Ver agenda
1. Ir a "Mi agenda"
2. Ver calendario con:
- Visitas confirmadas (con detalle al hacer click)
- Dias/horarios bloqueados
- Disponibilidad por franja horaria
3. Navegar entre semanas/meses
4. Filtrar por estado (pendientes, confirmadas, completadas)
## Pasos - Configurar disponibilidad semanal
1. Ir a "Configuracion" -> "Mi disponibilidad"
2. Para cada dia de la semana:
- Marcar si trabajo ese dia
- Definir franja horaria (ej: 9:00-18:00)
- Definir pausa (ej: 13:00-14:00)
3. Guardar configuracion
## Pasos - Bloquear dias especificos
1. En el calendario, click en un dia
2. Seleccionar "Marcar como no disponible"
3. Opcionalmente agregar motivo (vacaciones, curso, etc.)
4. Confirmar
5. Ese dia no aparece como opcion para nuevas solicitudes
## Pasos - Ver detalle de visita
1. Click en una visita en el calendario
2. Ver informacion completa:
- Dueno: nombre, telefono, direccion
- Mascota: nombre, tipo, edad, foto
- Servicios a realizar
- Historial previo de esa mascota
- Estado de pago
- Notas especiales
## Que deberia pasar
- Calendario siempre actualizado con visitas
- No puedo recibir solicitudes en dias bloqueados
- Cambios de disponibilidad afectan solo solicitudes futuras
- Puedo ver toda la informacion necesaria para la visita
## Problemas comunes
- Vet olvida desbloquear dia despues de terminar vacaciones
- Visitas muy seguidas en zonas distantes (logistica)
- Vet quiere mover visita a otro horario
- Visita cancelada a ultimo momento
- Vet no marco indisponibilidad y le llegan solicitudes que no puede atender
## Casos especiales
- Visita reprogramada: mostrar historial de cambios
- Visita cancelada por el dueno: liberar espacio en agenda
- Emergencia: poder agregar visita fuera de horario normal
- Feriados: bloquear automaticamente?
- Multiples visitas mismo dia/zona: optimizar ruta?
## Flujos relacionados
- Aceptar solicitud (agrega a la agenda)
- Realizar visita (inicia desde la agenda)
- Gestionar zonas de cobertura
## Notas tecnicas
- APIs:
- `GET /mascotas/api/v1/vet-visits/?veterinarian=X`
- `GET /mascotas/api/v1/vet_availabilities/`
- `PUT /mascotas/api/v1/vet_availabilities/{id}/`
- `POST /mascotas/api/v1/vet_unavailabilities/` (dias bloqueados)
- Vista calendario: usar libreria tipo FullCalendar
- Colores por estado: pendiente (amarillo), pagado (verde), completado (azul)

View File

@@ -0,0 +1,97 @@
# Realizar Visita y Crear Informe
## Tipo de usuario
Veterinario
## Donde empieza
Agenda del dia -> Visita programada -> "Iniciar visita" o `/vet/visita/{id}`
## Que quiere hacer el usuario
Registrar la visita medica, crear el informe clinico y completar el flujo
## Pasos - Antes de la visita
1. Ver agenda del dia
2. Click en la visita programada
3. Ver datos del dueno (direccion, telefono) para llegar
4. Ver datos de la mascota e historial
5. Preparar insumos segun servicios solicitados
## Pasos - Iniciar visita
1. Al llegar al domicilio, click "Iniciar visita"
2. Estado cambia a "En progreso"
3. Se registra hora de inicio
## Pasos - Crear informe medico
1. Durante o despues de la atencion, ir a "Crear informe"
2. Completar examen fisico:
- Peso actual
- Temperatura
- Frecuencia cardiaca
- Frecuencia respiratoria
- Estado general (mucosas, hidratacion, etc.)
3. Registrar hallazgos clinicos
4. Escribir diagnostico
5. Indicar tratamiento:
- Descripcion del tratamiento
- Medicamentos recetados (nombre, dosis, frecuencia, duracion)
- Indicaciones especiales
6. Solicitar estudios si es necesario:
- Tipo de estudio
- Laboratorio sugerido
7. Programar seguimiento:
- Fecha sugerida de control
- Motivo del seguimiento
8. Agregar observaciones adicionales
9. Guardar informe
## Pasos - Completar visita
1. Verificar que el informe este guardado
2. Click en "Completar visita"
3. Confirmar finalizacion
4. Se genera factura automaticamente (AFIP)
5. Dueno recibe notificacion con acceso al informe
## Que deberia pasar
- Informe queda guardado y asociado a la mascota
- Dueno puede ver el informe desde su cuenta
- Se genera factura electronica
- Visita se marca como "Completada"
- Vet puede ver la visita en su historial
## Problemas comunes
- Vet olvida completar el informe y cierra la visita
- Mala conexion a internet durante la visita
- Informe muy largo y se pierde por timeout
- Dueno no esta en el domicilio
- Mascota agresiva, no se puede atender
- Necesita derivar a clinica
## Casos especiales
- Visita cancelada in situ: registrar motivo, posible cargo
- Emergencia durante visita rutinaria: agregar servicios
- Multiples mascotas en la visita: un informe por cada una
- Vet necesita segundo opinion: derivar a especialista
- Fallecimiento durante la visita: protocolo especial
## Flujos relacionados
- Ver historial de paciente (antes de atender)
- Cobro de la visita (Mercado Pago del vet)
- Seguimiento post-visita
## Notas tecnicas
- APIs:
- `PATCH /mascotas/api/v1/vet-visits/{id}/` (cambiar estado)
- `POST /mascotas/api/v1/vetvisitreport/` (crear informe)
- `GET /mascotas/api/v1/vet-visits/?pet=X` (historial previo)
- Integracion AFIP via django_afip
- Guardado automatico del informe cada 30 segundos
- Modo offline: guardar localmente y sincronizar despues

View File

@@ -0,0 +1,66 @@
# Gestionar Zonas de Cobertura
## Tipo de usuario
Veterinario
## Donde empieza
Dashboard veterinario -> Menu "Mi cobertura" o Perfil -> "Zonas de atencion"
## Que quiere hacer el usuario
Definir en que barrios/zonas esta dispuesto a atender visitas a domicilio
## Pasos - Ver zonas actuales
1. Ir a "Mi cobertura"
2. Ver mapa con zonas actualmente cubiertas
3. Ver listado de barrios seleccionados
## Pasos - Agregar zona
1. En el mapa o listado, buscar el barrio
2. Click en el barrio para seleccionarlo
3. El barrio se agrega a mi cobertura
4. Guardar cambios
## Pasos - Quitar zona
1. En mi listado de zonas
2. Click en "X" o deseleccionar el barrio
3. Confirmar eliminacion
4. Guardar cambios
## Que deberia pasar
- Solo recibo solicitudes de las zonas que seleccione
- Si agrego zona, empiezo a ver solicitudes pendientes de esa zona
- Si quito zona, dejo de ver nuevas solicitudes de esa zona
- Visitas ya aceptadas no se afectan
## Problemas comunes
- Vet quiere zona muy especifica (solo algunas calles)
- Zonas con poca demanda, vet no recibe solicitudes
- Zonas con mucha demanda, vet saturado
- Limites de zona confusos (calle pertenece a 2 barrios)
- Vet quiere cobertura condicional (solo ciertos dias)
## Casos especiales
- Zona nueva no listada: solicitar a ops que la agregue
- Cobertura temporal (ej: cubriendo a otro vet)
- Cobertura por horario (mañana en zona A, tarde en zona B)
- Vet se muda: actualizar todas las zonas
## Flujos relacionados
- Aceptar solicitud (solo veo solicitudes de mis zonas)
- Ver agenda (optimizar ruta por zonas)
## Notas tecnicas
- APIs:
- `GET /common/api/v1/neighborhoods/` (lista de barrios)
- `GET /mascotas/api/v1/veterinarians/{id}/` (zonas actuales)
- `PATCH /mascotas/api/v1/veterinarians/{id}/` (actualizar zonas)
- Modelo: Veterinarian tiene M2M con Neighborhood
- Coeficiente de distancia por barrio para calcular viabilidad

View File

@@ -0,0 +1,81 @@
# Ver Historial de Pacientes
## Tipo de usuario
Veterinario
## Donde empieza
Dashboard veterinario -> "Historia clinica" o `/vet/historia-clinica`
## Que quiere hacer el usuario
Buscar y revisar el historial medico de pacientes que ha atendido
## Pasos - Buscar paciente
1. Ir a "Historia clinica"
2. Usar el buscador:
- Por nombre del dueno
- Por nombre de la mascota
- Por telefono
- Por email
3. Ver resultados de busqueda
4. Click en el paciente deseado
## Pasos - Ver historial de mascota
1. Seleccionar la mascota
2. Ver ficha de la mascota:
- Datos basicos (nombre, tipo, raza, edad)
- Foto
- Peso historico
- Estado de vacunacion
3. Ver listado de visitas (todas, no solo las mias)
4. Click en una visita para ver el informe completo
## Pasos - Revisar informe anterior
1. En el listado de visitas, click en una
2. Ver informe completo:
- Fecha y veterinario que atendio
- Examen fisico
- Diagnostico
- Tratamiento
- Medicamentos indicados
- Estudios solicitados
- Seguimiento
## Que deberia pasar
- Puedo ver historial completo de pacientes que atendi
- Puedo ver informes de otros vets (para continuidad de atencion)
- Tengo contexto para tomar decisiones clinicas
## Problemas comunes
- Busqueda no encuentra al paciente (nombre mal escrito)
- Mascota atendida por otro vet, no tengo acceso?
- Historial muy extenso, dificil encontrar info relevante
- Informes anteriores incompletos o ilegibles
- Duplicados de pacientes (mismo dueno registrado 2 veces)
## Casos especiales
- Mascota nueva sin historial
- Mascota atendida en otra clinica (historial externo)
- Dueno tiene multiples mascotas
- Mascota transferida a otro dueno
- Paciente de urgencia/emergencia sin cita previa
## Flujos relacionados
- Realizar visita (consultar historial antes/durante)
- Aceptar solicitud (ver si ya lo atendi antes)
## Notas tecnicas
- APIs:
- `GET /mascotas/api/v1/pet-owners/?search=X`
- `GET /mascotas/api/v1/pets/?pet_owner=X`
- `GET /mascotas/api/v1/vet-visits/?pet=X`
- `GET /mascotas/api/v1/vetvisitreport/?vet_visit=X`
- Permisos: vet puede ver historial de cualquier paciente que haya atendido
- Busqueda: usar indice de texto completo para rendimiento

View File

@@ -0,0 +1,143 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ops Templates Sample - 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: #15803d; text-decoration: none; }
.breadcrumb a:hover { text-decoration: underline; }
h1 { font-size: 2rem; color: #15803d; }
.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;
}
.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: #15803d;
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.user-type h2::before {
content: '';
width: 8px;
height: 8px;
background: #22c55e;
border-radius: 50%;
}
.templates-list { list-style: none; }
.templates-list li {
border-bottom: 1px solid #e2e8f0;
}
.templates-list li:last-child { border-bottom: none; }
.templates-list a {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 0;
text-decoration: none;
color: #1e293b;
}
.templates-list a:hover { color: #15803d; }
.templates-list .name { font-weight: 500; }
.templates-list .arrow { color: #94a3b8; }
.info-box {
background: #f0fdf4;
border: 1px solid #bbf7d0;
border-radius: 8px;
padding: 1rem;
margin-top: 2rem;
font-size: 0.9rem;
}
.info-box h3 { font-size: 0.9rem; color: #15803d; margin-bottom: 0.5rem; }
footer {
margin-top: 3rem;
padding-top: 1rem;
border-top: 1px solid #e2e8f0;
font-size: 0.85rem;
}
footer a { color: #15803d; text-decoration: none; }
footer a:hover { text-decoration: underline; }
</style>
</head>
<body>
<div class="container">
<header>
<div class="breadcrumb"><a href="/">Album</a> / Ops Templates</div>
<h1>Ops Templates Sample</h1>
<p class="subtitle">User flow documentation templates - non-technical format for support/ops teams</p>
<span class="sample-badge">Sample Data</span>
</header>
<div class="user-type">
<h2>Pet Owner</h2>
<ul class="templates-list">
<li><a href="/book/feature-form-samples/larder/pet-owner/01-registro.md"><span class="name">01. Registro de Usuario</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/pet-owner/02-reservar-turno.md"><span class="name">02. Reservar Turno</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/pet-owner/03-gestion-mascotas.md"><span class="name">03. Gestion de Mascotas</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/pet-owner/04-pago-turno.md"><span class="name">04. Pago de Turno</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/pet-owner/05-historial-medico.md"><span class="name">05. Historial Medico</span><span class="arrow">&rarr;</span></a></li>
</ul>
</div>
<div class="user-type">
<h2>Veterinarian</h2>
<ul class="templates-list">
<li><a href="/book/feature-form-samples/larder/veterinarian/01-aceptar-solicitud.md"><span class="name">01. Aceptar/Rechazar Solicitud</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/veterinarian/02-gestion-agenda.md"><span class="name">02. Gestion de Agenda</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/veterinarian/03-realizar-visita.md"><span class="name">03. Realizar Visita</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/veterinarian/04-zonas-cobertura.md"><span class="name">04. Zonas de Cobertura</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/veterinarian/05-historial-pacientes.md"><span class="name">05. Historial de Pacientes</span><span class="arrow">&rarr;</span></a></li>
</ul>
</div>
<div class="user-type">
<h2>Backoffice</h2>
<ul class="templates-list">
<li><a href="/book/feature-form-samples/larder/backoffice/01-gestion-solicitudes.md"><span class="name">01. Gestion de Solicitudes</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/backoffice/02-gestion-usuarios.md"><span class="name">02. Gestion de Usuarios</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/backoffice/03-gestion-servicios.md"><span class="name">03. Gestion de Servicios</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/backoffice/04-reembolsos.md"><span class="name">04. Reembolsos</span><span class="arrow">&rarr;</span></a></li>
<li><a href="/book/feature-form-samples/larder/backoffice/05-reportes.md"><span class="name">05. Reportes</span><span class="arrow">&rarr;</span></a></li>
</ul>
</div>
<div class="info-box">
<h3>Template Structure</h3>
<p>Each template includes: User type, Entry point, Goal, Steps, Expected result, Common problems, Edge cases, Related flows, Technical notes.</p>
<p style="margin-top: 0.5rem;">These templates transform into <a href="/book/gherkin-samples/">Gherkin specs</a> for testing.</p>
</div>
<footer>
<a href="/">&larr; Album</a>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,91 @@
# Plantilla: Documentacion de Flujos
## Para: Equipo de Soporte/Operaciones
Usa esta plantilla para documentar cualquier accion/flujo del sistema.
---
## Plantilla
```
### [Nombre del Flujo]
**Tipo de usuario:** [Dueno de mascota / Veterinario / Admin]
**Donde empieza:** [Que pagina/boton/link]
**Que quiere hacer el usuario:** [Objetivo en una oracion]
**Pasos:**
1. [Primera cosa que hace el usuario]
2. [Segunda cosa que hace el usuario]
3. [etc.]
**Que deberia pasar:** [Resultado esperado cuando todo funciona]
**Problemas comunes:**
- [Problema 1]
- [Problema 2]
**Casos especiales:**
- [Caso especial 1]
- [Caso especial 2]
**Flujos relacionados:** [Otros flujos que se conectan con este]
```
---
## Ejemplo Completo
### Reservar turno de vacunacion
**Tipo de usuario:** Dueno de mascota
**Donde empieza:** Pagina principal -> Boton "Agendar visita"
**Que quiere hacer el usuario:** Reservar un turno de vacunacion para su gato
**Pasos:**
1. Click en "Agendar visita" en la pagina principal
2. Ingresar direccion en el popup
3. Click en "Siguiente"
4. Completar datos mascota: nombre, tipo (gato), edad
5. Seleccionar categoria "Vacunacion"
6. Elegir la vacuna especifica
7. Ver que "Consulta clinica" se agrega automaticamente
8. Elegir fechas preferidas
9. Ingresar datos de contacto (nombre, telefono, email)
10. Enviar la solicitud
**Que deberia pasar:**
- Ver mensaje de confirmacion
- Recibir email de confirmacion
- La solicitud aparece en "Mis turnos" con estado "Pendiente"
**Problemas comunes:**
- Los usuarios intentan quitar "Consulta clinica" y no pueden
- El autocompletado de direcciones a veces no encuentra su calle
- Algunos usuarios no ven el link "Ya soy cliente" y crean cuentas duplicadas
**Casos especiales:**
- Si la mascota ya esta castrada, el servicio de castracion no deberia aparecer
- Si el usuario abandona a mitad del flujo, sus datos se guardan como "invitado"
- Algunos barrios no tienen cobertura - deberia mostrar un error claro
**Flujos relacionados:**
- "Ver mis turnos" (para ver el estado despues de reservar)
- "Pagar turno" (cuando se solicita el pago)
---
## Preguntas a Considerar
1. **Camino feliz:** Que pasa cuando todo funciona perfecto?
2. **Validacion:** Que errores puede ver el usuario?
3. **Permisos:** Quien puede hacer esto?
4. **Estados:** Esta accion cambia segun algun estado?
5. **Dependencias:** Esto requiere que algo mas haya pasado antes?
6. **Efectos secundarios:** Esto dispara emails, notificaciones?
7. **Deshacer:** El usuario puede revertir esta accion?