Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions docs/frontend/evidence/far-04-catalogo-por-pestanas/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# FAR-04 · Catálogo por pestañas — evidencia de navegador

Compilación de producción del front contra la API local, con las cuentas sintéticas de la farmacia (Farmacia FAR
Uno) y del paciente (`@alovida.test`). Ruta: `/administration/pharmacy-catalog`. Errores de consola, `pageerror`,
peticiones fallidas y escrituras: `consola.txt`.

Nombre de archivo: `rol__ruta__estado__tema__viewport.png`.

La rama trae `dev` con FAR-07: se ven seis pestañas, la sexta «Integración».

| # | Caso | Archivos | Estado |
|---|---|---|---|
| 1 | Menú de la farmacia: Resumen, Catálogo, Horario y turnos, Solicitudes de retiro, Promociones, Sucursales (más los fijos «Mi perfil» y «Notificaciones») | `farmacia__menu__abierto__{claro,oscuro}__{1440x900,390x844}.png` | PASS |
| 2 | Un membrete «Catálogo», una tarjeta, seis pestañas con marco de ventana; Productos abierta con su tabla | `farmacia__catalogo__productos__*` | PASS |
| 3 | Clic en cada pestaña: la URL pasa a `?tab=categories`, `prices`, `inventory`, `import`, `integration`, `products`; ninguna dibuja membrete propio dentro de la tarjeta; «Atrás» después de las seis vuelve a `/administration/pharmacy` (sin entradas nuevas en el historial) | `farmacia__catalogo__pestana-*__claro__1440x900.png` | PASS |
| 4 | `/administration/pharmacy-inventory?alerts=true` termina en `/administration/pharmacy-catalog?alerts=true&tab=inventory`, Inventario abierta y «solo alertas» marcado | `farmacia__ruta-vieja-inventario-alertas__claro__1440x900.png` | PASS |
| 5 | `/administration/pharmacy-categories`, `-prices`, `-import` terminan en `?tab=categories`, `prices`, `import`, cada una con su pestaña abierta | `consola.txt` (URLs finales) | PASS |
| 6 | Importación → terminar una carga → «Ver productos» | — | No se ejecutó en esta corrida: la carga de productos de punta a punta está en la evidencia de FAR-05 (casos 2 y 3); el enlace a la misma ruta lo cubre `pharmacy-catalog-hub.spec.ts` |
| 7 | Resumen → «Revisar inventario» abre `?tab=inventory&alerts=true` (Inventario); «Actualizar en lote» abre `?tab=import` (Importación) | `consola.txt` | PASS |
| 8 | Categorías: crear, renombrar y eliminar, cada paso con recarga; Precios: cambiar uno, guardar (`PATCH` 200) y recargar: 17,25 | `farmacia__catalogo__precios-guardado-recarga__claro__1440x900.png`; las de categorías, en la evidencia de FAR-05 (R2) | PASS |
| 9 | 390x844: la tira de pestañas se desplaza, la primera no queda cortada, la página no se desborda | `farmacia__catalogo__productos__{claro,oscuro}__390x844.png` | PASS |
| 10 | Paciente: `/administration/pharmacy-catalog` por URL termina en `/dashboard` sin la tarjeta del catálogo; «Catálogo» no está en su menú (1440 y 390) | `paciente__catalogo-por-url__claro__{1440x900,390x844}.png` | PASS |
| 12 | Cinco viewports (390x844, 768x1024, 1024x768, 1440x900, 1920x1080): tira sin desbordar en las cuatro anchas y desplazable en 390, sin desborde de página | `farmacia__catalogo__productos__claro__*` | PASS |
49 changes: 49 additions & 0 deletions docs/frontend/evidence/far-04-catalogo-por-pestanas/consola.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# FAR-04 · registro de la corrida de navegador (30/10/2026)

## f04views — hechos
[claro 390] pestañas: Productos | Categorías | Precios | Inventario | Importación | Integración · tira desplazable: true · primera cortada: false · sin desborde de página: true
[claro 390] menú de la farmacia: Mi perfil | Notificaciones | Resumen | Catálogo | Horario y turnos | Solicitudes de retiro | Promociones | Sucursales
[claro 768] pestañas: Productos | Categorías | Precios | Inventario | Importación | Integración · tira desplazable: false · primera cortada: false · sin desborde de página: true
[claro 1024] pestañas: Productos | Categorías | Precios | Inventario | Importación | Integración · tira desplazable: false · primera cortada: false · sin desborde de página: true
[claro 1440] pestañas: Productos | Categorías | Precios | Inventario | Importación | Integración · tira desplazable: false · primera cortada: false · sin desborde de página: true
[claro 1440] menú de la farmacia: Mi perfil | Notificaciones | Resumen | Catálogo | Horario y turnos | Solicitudes de retiro | Promociones | Sucursales
[claro 1920] pestañas: Productos | Categorías | Precios | Inventario | Importación | Integración · tira desplazable: false · primera cortada: false · sin desborde de página: true
[oscuro 390] pestañas: Productos | Categorías | Precios | Inventario | Importación | Integración · tira desplazable: true · primera cortada: false · sin desborde de página: true
[oscuro 390] menú de la farmacia: Mi perfil | Notificaciones | Resumen | Catálogo | Horario y turnos | Solicitudes de retiro | Promociones | Sucursales
[oscuro 1440] pestañas: Productos | Categorías | Precios | Inventario | Importación | Integración · tira desplazable: false · primera cortada: false · sin desborde de página: true
[oscuro 1440] menú de la farmacia: Mi perfil | Notificaciones | Resumen | Catálogo | Horario y turnos | Solicitudes de retiro | Promociones | Sucursales
## f04views — consola, pageerror, peticiones fallidas y escrituras
(ninguno)

## f04tabs — hechos
pestaña «Categorías» → /administration/pharmacy-catalog?tab=categories · membretes dentro de la tarjeta: 0
pestaña «Precios» → /administration/pharmacy-catalog?tab=prices · membretes dentro de la tarjeta: 0
pestaña «Inventario» → /administration/pharmacy-catalog?tab=inventory · membretes dentro de la tarjeta: 0
pestaña «Importación» → /administration/pharmacy-catalog?tab=import · membretes dentro de la tarjeta: 0
pestaña «Integración» → /administration/pharmacy-catalog?tab=integration · membretes dentro de la tarjeta: 0
pestaña «Productos» → /administration/pharmacy-catalog?tab=products · membretes dentro de la tarjeta: 0
Atrás después de seis pestañas → /administration/pharmacy
## f04tabs — consola, pageerror, peticiones fallidas y escrituras
(ninguno)

## f04links — hechos
/administration/pharmacy-inventory?alerts=true → /administration/pharmacy-catalog?alerts=true&tab=inventory · pestaña abierta: Inventario · «solo alertas» marcado: true
/administration/pharmacy-categories → /administration/pharmacy-catalog?tab=categories · pestaña abierta: Categorías
/administration/pharmacy-prices → /administration/pharmacy-catalog?tab=prices · pestaña abierta: Precios
/administration/pharmacy-import → /administration/pharmacy-catalog?tab=import · pestaña abierta: Importación
Resumen → «Revisar inventario» → /administration/pharmacy-catalog?tab=inventory&alerts=true · pestaña abierta: Inventario
Resumen → «Actualizar en lote» → /administration/pharmacy-catalog?tab=import · pestaña abierta: Importación
## f04links — consola, pageerror, peticiones fallidas y escrituras
(ninguno)

## f04patient — hechos
[paciente 1440] /administration/pharmacy-catalog → /dashboard · tarjeta del catálogo: 0
[paciente 1440] «Catálogo» en el menú: false
[paciente 390] /administration/pharmacy-catalog → /dashboard · tarjeta del catálogo: 0
[paciente 390] «Catálogo» en el menú: false
## f04patient — consola, pageerror, peticiones fallidas y escrituras
(ninguno)

## precios (caso 8)
precio de CIERRE-113533 tras guardar y recargar: 17.25
[crud] PATCH /pharmacies/:id/products/:id → 200
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 9 additions & 5 deletions docs/frontend/evidence/far-05-importacion-masiva/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,16 @@ Nombre de archivo: `rol__ruta__estado__tema__viewport.png`.
| 6 | Sucursales: el aviso dice que se crean como sedes de venta; una sede creada y otra rechazada (latitud sin longitud); tras recargar, la sede aparece en Horario y turnos | `…__sucursales-vista-previa__*`, `…__sucursales-aplicado__*`, `farmacia__horario-y-turnos__sede-importada-recarga__*` | PASS |
| 7 | Paciente · Farmacia: el producto importado y publicado aparece con su precio | `paciente__mi-cuenta-farmacia__*` | PASS |
| R1 | Radio · Inventario → «Subir CSV» abre su diálogo como antes (archivo sin cambios en este trabajo) | `farmacia__catalogo-inventario__subir-csv-abierto__*` | PASS (apertura); aplicar un CSV de inventario: no se ejecutó |
| R2 | Radio · alta y edición de producto desde el modal; crear, renombrar y borrar categoría | — | BLOCKED: no se ejecutó en navegador (código sin cambios; cubierto solo por las pruebas unitarias existentes) |
| R2a | Radio · categoría: crear (`POST` 201), renombrar (`PATCH` 200) y eliminar con confirmación (`DELETE` 200), cada paso seguido de recarga | `farmacia__catalogo-categorias__crear-dialogo__claro__1440x900.png`, `farmacia__catalogo-categorias__renombrada-recarga__claro__1440x900.png` | PASS |
| R2b | Radio · edición de producto desde el modal: precio a 13,75 en «Publicación», `PATCH` 200, tras recargar la fila dice Bs 13,75 | `farmacia__catalogo-productos__editado-recarga__claro__1440x900.png` | PASS |
| R2c | Radio · alta de producto desde el modal | `farmacia__catalogo-productos__alta-catalogo-oficial-vacio__claro__1440x900.png` | BLOCKED: el alta parte del catálogo oficial de medicamentos, y la base local no lo tiene cargado (cargarlo es escribir en la base fuera de la API). La búsqueda respondía 500 por un error de la API, corregido en el PR de la API del mismo nombre; ahora responde 200 sin resultados |
| 8 | A 390 la columna «Motivo» de la vista previa va en la ficha de cada fila (tabla apilada), sin desplegar el detalle | `farmacia__catalogo-importacion__categorias-motivo__{claro,oscuro}__{390x844,1440x900}.png` | PASS (sólo vista previa: no se aplicó nada) |
| — | Un 413 dicho en pantalla | — | BLOCKED en navegador (cubierto por `entity-import.spec.ts` y `bulk-publish.spec.ts`) |

Observaciones:

- A 390 px la tabla de la vista previa de categorías, precios y sucursales deja la columna «Motivo»
detrás del desplazamiento lateral de `app-data-table`; se ve deslizando la tabla.
- En la tienda del paciente el producto importado sale en las sedes sin stock propio y no en las que ya
llevan stock por sede, como anticipa el riesgo R-05-5.
- A 390 px la columna «Motivo» de la vista previa quedaba detrás del detalle plegado de `app-data-table`.
Corregido: la columna es primaria y la tabla se apila en el teléfono (caso 8).
- En la tienda del paciente el producto importado salía en las sedes sin stock propio y no en las que ya
llevaban stock por sede (riesgo R-05-5). Con la disponibilidad por producto de la API (PR del mismo nombre)
un producto sin posición en una sede sigue lo declarado en el catálogo: ver la evidencia de FAR-06, caso 11.
22 changes: 22 additions & 0 deletions docs/frontend/evidence/far-05-importacion-masiva/consola.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,25 @@ prices 200 · UPSERT · true · 3 · UPDATED 1, UNCHANGED 1, REJECTED 1 (pro
prices 200 · UPSERT · (sin) · 3 · UPDATED 1, UNCHANGED 1, REJECTED 1
sites 200 · UPSERT · true · 2 · CREATED 1, REJECTED 1 (longitude COORDINATES_INCOMPLETE)
sites 200 · UPSERT · (sin) · 2 · CREATED 1, REJECTED 1

## Cierre (30/10/2026) — R2 y «Motivo» a 390
categoría «Evidencia 495297» creada y tras recargar: 1 fila(s) [POST /pharmacies/:id/categories → 201]
renombrada a «Evidencia 495297 b» y tras recargar: 1 fila(s) [PATCH /pharmacies/:id/categories/:id → 200]
eliminada y tras recargar: 0 fila(s) [DELETE /pharmacies/:id/categories/:id → 200]
alta · búsqueda del catálogo oficial → 200 con 0 resultado(s)
tras editar el precio a 13,75 desde el modal y recargar, la fila: Cierre 113533 — CIERRE-113533 Sin categoría Bs 13,75 Publicado Disponible [PATCH /pharmacies/:id/products/:id → 200]
precio de CIERRE-113533 tras guardar y recargar: 17.25
[claro 390] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
[claro 1440] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
[oscuro 390] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
[oscuro 1440] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
[motivo claro 390] POST /pharmacies/:id/categories/bulk → 200
[motivo claro 1440] POST /pharmacies/:id/categories/bulk → 200
[motivo oscuro 390] POST /pharmacies/:id/categories/bulk → 200
[motivo oscuro 1440] POST /pharmacies/:id/categories/bulk → 200
Nota: el texto del motivo de la fila 3 («Falta el dato que identifica la fila») se ve en la ficha apilada sin desplegar nada (capturas de 390); la tabla no tiene botón de detalle.
Repetido sobre el código final (tras fusionar dev):
[claro 390] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
[claro 1440] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
[oscuro 390] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
[oscuro 1440] vista previa: 2 Vitaminas evidencia Creado / 3 — RechazadoFalta el dato que identifica la fila · sin desborde: true
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 12 additions & 5 deletions docs/frontend/evidence/far-06-stock-por-sucursal/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,18 @@ Errores de consola, red y lecturas de persistencia: `consola.txt`.
| 3 | Sede en modo catálogo (Sucursal Sur 2): aviso de que el primer guardado la pasa a su propio stock | `farmacia_…_sur2-modo-catalogo-antes_claro_1440.png` | PASS |
| 4 | Mutación: Sur 2 → A en «No lo tengo» → Guardar → `PUT` 200 → relectura → recarga → A sigue en «No lo tengo» y la sede muestra «Esta sucursal lleva su propio stock…» | `farmacia_…_sur2-A-no-lo-tengo-sin-guardar_claro_1440.png`, `farmacia_…_sur2-A-no-lo-tengo-tras-recargar_claro_1440.png`, `consola.txt` | PASS |
| 5 | Paciente, regresión de rebote: antes A y B en todas las sedes; después Sur 2 sin A y **con B**, las demás sedes igual | `paciente_my-account-pharmacy_antes_*`, `paciente_my-account-pharmacy_despues-A-no-en-sur2_*` (claro y oscuro 1440, claro 390) | PASS |
| 6 | Casa central: D «Marcado sin stock en el catálogo», sin interruptor; H (publicado después) «Sin registrar en esta sucursal» con «Lo tengo» | `farmacia_…_casa-central_{claro,oscuro}_{1440,390}.png` | PASS en 1440. En 390 la celda se salía de la fila: corregido en CSS, no se volvió a ver (ver 9) |
| 7 | Volver a «Lo tengo» con cantidad (A en Sur 2 con 3) y el paciente ve A de nuevo | — | BLOCKED: no se ejecutó (ver 9) |
| 8 | Un 422 queda en su fila con el motivo | — | BLOCKED: no se ejecutó en navegador; cubierto por `site-stock-panel.spec.ts` |
| 9 | Corrección de la celda «En la sucursal» en 390 (rótulo más corto y valor que se acomoda) | — | BLOCKED: la compilación de desarrollo para volver a capturar se interrumpió por falta de memoria del equipo |
| 10 | Radio: Precios, Productos y «Subir CSV» sin cambios | — | BLOCKED: no se ejecutó |
| 6 | Casa central: D «Marcado sin stock en el catálogo», sin interruptor (la marca llega de la API como `outOfStockDeclared`). H, publicado después, ya no sale «Sin registrar»: sigue el catálogo (ver 11) | `farmacia__catalogo-inventario__casa-central-far06__{claro,oscuro}__{1440x900,390x844}.png` | PASS. Las capturas `farmacia_pharmacy-catalog-inventory_casa-central_*` son anteriores al cierre |
| 7 | Volver a «Lo tengo» con cantidad: Sur 2 → A en «Lo tengo» con 3 → Guardar → `PUT` 200 con `{available:true, quantity:3}` → recarga → A en «Lo tengo»; el paciente vuelve a ver A en Sur 2 (1440 y 390) | `farmacia__catalogo-inventario__sur2-A-lo-tengo-3-{sin-guardar,tras-recargar}__claro__1440x900.png`, `paciente__mi-cuenta-farmacia__A-de-nuevo-en-sur2__claro__*` | PASS |
| 8 | Un 422 queda en su fila: con la pantalla abierta, C se marca «no tengo» desde el catálogo (otra pestaña, por la API); «Lo tengo» en C → Guardar → `PUT` 422 → el motivo y el código de soporte quedan bajo la fila de C, el aviso dice «el motivo está en su fila»; después la marca se deshace y C queda como estaba (conteo 0) | `farmacia__catalogo-inventario__sur2-C-rechazo-422__claro__1440x900.png`, `consola.txt` | PASS |
| 9 | 390: la celda «En la sucursal» y la cantidad entran en la fila; el rótulo vacío de la cantidad («Del catálogo») se lee entero | `farmacia__catalogo-inventario__casa-central-{far06,producto-nuevo}__{claro,oscuro}__390x844.png` | PASS |
| 10 | Radio: Precios y Productos cargan su tabla; «Subir CSV» abre su diálogo | `farmacia__catalogo-{prices,products}__radio__claro__1440x900.png`, `farmacia__catalogo-inventario__radio-subir-csv__claro__1440x900.png` | PASS (apertura; no se aplicó un CSV) |
| 11 | Disponibilidad por producto (cierre): un producto publicado después de que Casa central lleva stock propio (CIERRE-113533) sale en Casa central como «Lo tengo · Como en el catálogo», con el aviso «Los productos con stock propio en esta sucursal no siguen lo que cambie en "Todas"; los demás muestran lo declarado en el catálogo.» | `farmacia__catalogo-inventario__casa-central-producto-nuevo__{claro,oscuro}__{1440x900,390x844}.png` | PASS |

Las capturas de 1440 con «¿Lo tiene en esta sucursal?» como cabecera de la columna son anteriores al cambio a
«En la sucursal».

Los casos 1 a 5 son de la primera entrega. Con la disponibilidad por producto cambiaron los textos de los avisos:
con «Todas», «Casa central tiene stock propio en algunos productos: en esos, lo que cambie en "Todas" no la afecta,
tampoco lo que suba por CSV»; en una sede sin stock propio, «El producto que cambie acá pasa a llevar su propio stock
en esta sucursal; los demás siguen el catálogo». Los casos 6 a 11 son del cierre (30/10/2026) y sus hechos están al
final de `consola.txt`.
Loading