Por ejemplo, este es un caso real que hice en estos dias. Inicie el archivo .MD (9901_Favortes.md) con este texto:
Se quiere agregar la funcion de favoritos al componente TMResManager. En particular se quiere:
- Crear los endpoint y SPs necesarios para poder marcar/desmarcar uno o mas documentos como "favoritos" usando la tabla tmfavdb.
- Agregar una opcion en el toolbar principal de TMResManager para poder marcar/desmarcar como favoritos uno o mas documentos.
- Agregar un dropdown en el div "ViewFilter" con las siguientes opciones:
- Recientes (ultimos 25 documentos creados/modificados por el usuario actual).
- Mis favoritos (documentos marcados como favorito)
- Todos (todos los documentos). Esta debe ser la vista por defecto.Luego, se lo pase a un skill coordinadorr de nombre tm-do:
/tm-do 9901_Favorites.mdEste skill recibe el nombre del archivo, ve que esta en si etapa inicial y se lo pasa a otro skill que hace la funcion de Project Manager. Este skill analiza el contenido del archivo y genera una version mas detallada que incluye las tareas a pasar al skill desarrollador. El resultado fue:
# CONTROL DE PROCESO
[ ] Spec OK
[ ] Coded
[ ] Test units
[ ] Revised
[ ] Tested
[ ] Ready
# REQUERIMIENTO ORIGINAL
Se quiere agregar la funcion de favoritos al componente TMResManager. En particular se quiere:
- Crear los endpoint y SPs necesarios para poder marcar/desmarcar uno o mas documentos como "favoritos" usando la tabla tmfavdb.
- Agregar una opcion en el toolbar principal de TMResManager para poder marcar/desmarcar como favoritos uno o mas documentos.
- Agregar un dropdown en el div "ViewFilter" con las siguientes opciones:
- Recientes (ultimos 25 documentos creados/modificados por el usuario actual).
- Mis favoritos (documentos marcados como favorito)
- Todos (todos los documentos). Esta debe ser la vista por defecto.
# DESCRIPCIÓN Y CONTEXTO
## Objetivo del Feature
Permitir al usuario marcar documentos del repositorio Tailor como **favoritos** y filtrar la grilla del `TMResManager` entre **Todos**, **Mis favoritos** y **Recientes**, con persistencia en `tmfavdb` y operaciones masivas desde el toolbar.
## Alcance y Casos de Uso
### Dentro del alcance
| Caso | Descripción |
|------|-------------|
| **Marcar favorito** | Con uno o más documentos seleccionados, el toolbar agrega registros en `tmfavdb` para el usuario de sesión. |
| **Desmarcar favorito** | Con uno o más documentos seleccionados, elimina favoritos del usuario actual (idempotente si ya no existen). |
| **Vista Todos** | Lista completa de documentos activos (comportamiento actual de `GET /tm/repo`). Vista por defecto al abrir. |
| **Vista Mis favoritos** | Lista solo documentos marcados como favorito por el usuario de sesión. |
| **Vista Recientes** | Lista los últimos 25 documentos creados o modificados por el usuario de sesión (`createdBy` o última modificación atribuible al usuario). |
| **Indicador en grilla** | Columna o marca visual opcional `isFavorite` en filas para reflejar estado actual. |
| **API dedicada** | Endpoints REST bajo `/api/tm/fav` con SPs `spTMFavPost` y `spTMFavDrop`. |
| **Extensión de listado** | Extender `spTMRepoList` (o parámetro `@view`) para soportar filtros `all`, `favorites`, `recent` sin romper consumidores actuales. |
### Fuera del alcance
- Favoritos compartidos entre usuarios.
- Orden personalizado de favoritos.
- Sincronización offline o persistencia en `localStorage`.
- Favoritos sobre documentos eliminados (FK en `tmfavdb` debe respetarse al borrar docs).
- Paginación avanzada en vista Recientes (tope fijo 25).
## Arquitectura / Datos
### Tabla existente `tmfavdb`
| Columna | Tipo | Descripción |
|---------|------|-------------|
| `rowid` | INT IDENTITY | PK |
| `userid` | VARCHAR(100) | Login del usuario (`SESSION_USER` / sesión TALOS) |
| `docid` | INT | FK → `tmrepodb.rowid` |
| `created` | DATETIME | Alta del favorito |
Índices existentes: `ix_tmfavdb_userid`, `ix_tmfavdb_docid`.
### Stored procedures (SQL Server, schema empresa)
| SP | Propósito |
|----|-----------|
| `spTMFavPost` | Recibe lista JSON/array de `docid`; inserta favoritos del usuario de sesión omitiendo duplicados. |
| `spTMFavDrop` | Recibe lista de `docid`; elimina favoritos del usuario de sesión. |
| `spTMRepoList` (alter) | Nuevo parámetro `@view VARCHAR(20) = 'all'` con valores: `all`, `favorites`, `recent`. `@recent` usa TOP 25 ordenado por actividad del usuario. Incluir columna calculada `isFavorite BIT` en el result set. |
El usuario de sesión se obtiene con el mecanismo estándar TMLIB (`TMH::getSessionUser()` o equivalente ya usado en otros SPs).
### API REST (Laravel, `api/app/tmlib`)
| Método | Ruta | SP | Body |
|--------|------|-----|------|
| POST | `/api/tm/fav` | `spTMFavPost` | `{ "docids": [1,2,3] }` |
| DELETE | `/api/tm/fav` | `spTMFavDrop` | `{ "docids": [1,2,3] }` |
| GET | `/api/tm/repo?view=all\|favorites\|recent` | `spTMRepoList` | query param `view` (default `all`) |
Controlador sugerido: `TMFavController` o métodos en `TMRepoController` para fav; rutas en `api/app/tmlib/routes/api.php`.
### Frontend (`TMResManager`)
**Ubicación:** `app/src/app/tmlib/ui/tm-res-manager/`
| Elemento | Detalle |
|----------|---------|
| **ViewFilter dropdown** | `nz-select` en `.ViewFilter` con opciones: `Todos`, `Recientes`, `Mis favoritos`. Modelo `viewFilter: 'all' \| 'recent' \| 'favorites'`. Al cambiar, invoca `requeryDocuments()`. |
| **Toolbar** | Botones `Favorito` / `Quitar favorito` (o toggle único según selección). Habilitados cuando `checkedCount >= 1`. Iconos Ant Design (`star` / `star-fill`). |
| **requeryDocuments** | Pasa `view` al GET `/tm/repo?view=...`. |
| **Selección múltiple** | Usar `lastSelection.checkedRows` para enviar `docids` al POST/DELETE fav. |
## Criterios de Aceptación
1. Marcar favorito persiste en `tmfavdb` para el usuario de sesión.
2. Desmarcar elimina el registro correspondiente sin error si ya no existía.
3. Vista **Todos** muestra el listado completo (default).
4. Vista **Mis favoritos** muestra solo documentos favoritos del usuario.
5. Vista **Recientes** muestra máximo 25 documentos del usuario por creación/modificación reciente.
6. El toolbar permite operación masiva sobre la selección actual.
7. Tras marcar/desmarcar, la grilla refleja el cambio (requery o actualización local de `isFavorite`).
8. `GET /tm/repo` sin `view` mantiene compatibilidad (equivale a `all`).
9. Código documentado con JSDoc/PHPDoc según estándar TercerMedio.
# TASK LIST
[ ] Crear `spTMFavPost.sp.sql` y `spTMFavDrop.sp.sql` en `api/app/tmlib/migrations/empresa/sql/api/`.
[ ] Alterar `spTMRepoList.sp.sql`: parámetro `@view`, filtros favorites/recent, columna `isFavorite`.
[ ] Registrar rutas `POST/DELETE /api/tm/fav` y extender `TMRepoController` (o `TMFavController`) + query `view` en index.
[ ] Actualizar `TMResManager`: dropdown ViewFilter, botones toolbar favorito, `requeryDocuments` con `view`.
[ ] Documentar PHPDoc/JSDoc en archivos tocados.Una vez completado ese proceso el skill coordinador espera a que yo revise el documento y le de el visto bueno marcando la casilla "Spec OK". Una vez hhecho eso, escribo "listo" y el skill coordinador retoma el documento, ve que ya revise la especificacion y se lo pasa al skill desarrollador, el cual se encargar de programar todas las tareas indicadas en el documento y propone una lista de test units a implementar para validar el codigo generado. Una vez completado, marca la casilla "Coded" en el control de proceso y el skill coordinador una vez mas espera a que yo revise lo hecho por el desarrollador y marque la casilla "Revised".
Esto causa que el skill coordinador le pase la batuta a otro skill QA que se encarga de implementar las pruebas, ejecutarlas y verificar el resultado. Si alguna prueba falla, se invoca de nuevo el skill desarrollador para que haga la correccion y el skill coordinador vuelve a invocar al skill QA para que repita la prueba que fallo. Este proceso se puede repetir un maximo de 3 veces, luego de lo cual si aun quedan test units no conformes, el proceos se detiene para que yo pueda revisar que paso.
Una vez que todas las pruebas fueron completadas, el skill coordinador marca la casilla "Tested" y me devuelve el control par que yo haga pruebas finales. Si en esas pruebas encuentro detalles, puedo armar una lista de inconformidades en la seccion # Revision del MD y luego indicarle al skill coordinador que las revise. Este le pasa el testigo al skill desaarrollador parra que haga las correcciones y luego al skill QA para que repita los test units. Este proceso se repite hasta que yo este satisfecho y marque la casilla "Ready" en el MD.
El archivo MD final quedo asi:
# CONTROL DE PROCESO
[x] Spec OK
[x] Coded
[x] Test units
[x] Revised
[x] Tested
[x] Ready
# REQUERIMIENTO ORIGINAL
Se quiere agregar la funcion de favoritos al componente TMResManager. En particular se quiere:
- Crear los endpoint y SPs necesarios para poder marcar/desmarcar uno o mas documentos como "favoritos" usando la tabla tmfavdb.
- Agregar una opcion en el toolbar principal de TMResManager para poder marcar/desmarcar como favoritos uno o mas documentos.
- Agregar un dropdown en el div "ViewFilter" con las siguientes opciones:
- Recientes (ultimos 25 documentos creados/modificados por el usuario actual).
- Mis favoritos (documentos marcados como favorito)
- Todos (todos los documentos). Esta debe ser la vista por defecto.
# DESCRIPCIÓN Y CONTEXTO
## Objetivo del Feature
Permitir al usuario marcar documentos del repositorio Tailor como **favoritos** y filtrar la grilla del `TMResManager` entre **Todos**, **Mis favoritos** y **Recientes**, con persistencia en `tmfavdb` y operaciones masivas desde el toolbar.
## Alcance y Casos de Uso
### Dentro del alcance
| Caso | Descripción |
|------|-------------|
| **Marcar favorito** | Con uno o más documentos seleccionados, el toolbar agrega registros en `tmfavdb` para el usuario de sesión. |
| **Desmarcar favorito** | Con uno o más documentos seleccionados, elimina favoritos del usuario actual (idempotente si ya no existen). |
| **Vista Todos** | Lista completa de documentos activos (comportamiento actual de `GET /tm/repo`). Vista por defecto al abrir. |
| **Vista Mis favoritos** | Lista solo documentos marcados como favorito por el usuario de sesión. |
| **Vista Recientes** | Lista los últimos 25 documentos creados o modificados por el usuario de sesión (`createdBy` o última modificación atribuible al usuario). |
| **Indicador en grilla** | Columna o marca visual opcional `isFavorite` en filas para reflejar estado actual. |
| **API dedicada** | Endpoints REST bajo `/api/tm/fav` con SPs `spTMFavPost` y `spTMFavDrop`. |
| **Extensión de listado** | Extender `spTMRepoList` (o parámetro `@view`) para soportar filtros `all`, `favorites`, `recent` sin romper consumidores actuales. |
### Fuera del alcance
- Favoritos compartidos entre usuarios.
- Orden personalizado de favoritos.
- Sincronización offline o persistencia en `localStorage`.
- Favoritos sobre documentos eliminados (FK en `tmfavdb` debe respetarse al borrar docs).
- Paginación avanzada en vista Recientes (tope fijo 25).
## Arquitectura / Datos
### Tabla existente `tmfavdb`
| Columna | Tipo | Descripción |
|---------|------|-------------|
| `rowid` | INT IDENTITY | PK |
| `userid` | VARCHAR(100) | Login del usuario (`SESSION_USER` / sesión TALOS) |
| `docid` | INT | FK → `tmrepodb.rowid` |
| `created` | DATETIME | Alta del favorito |
Índices existentes: `ix_tmfavdb_userid`, `ix_tmfavdb_docid`.
### Stored procedures (SQL Server, schema empresa)
| SP | Propósito |
|----|-----------|
| `spTMFavPost` | Recibe lista JSON/array de `docid`; inserta favoritos del usuario de sesión omitiendo duplicados. |
| `spTMFavDrop` | Recibe lista de `docid`; elimina favoritos del usuario de sesión. |
| `spTMRepoList` (alter) | Nuevo parámetro `@view VARCHAR(20) = 'all'` con valores: `all`, `favorites`, `recent`. `@recent` usa TOP 25 ordenado por actividad del usuario. Incluir columna calculada `isFavorite BIT` en el result set. |
El usuario de sesión se obtiene con el mecanismo estándar TMLIB (`TMH::getSessionUser()` o equivalente ya usado en otros SPs).
### API REST (Laravel, `api/app/tmlib`)
| Método | Ruta | SP | Body |
|--------|------|-----|------|
| POST | `/api/tm/fav` | `spTMFavPost` | `{ "docids": [1,2,3] }` |
| DELETE | `/api/tm/fav` | `spTMFavDrop` | `{ "docids": [1,2,3] }` |
| GET | `/api/tm/repo?view=all\|favorites\|recent` | `spTMRepoList` | query param `view` (default `all`) |
Controlador sugerido: `TMFavController` o métodos en `TMRepoController` para fav; rutas en `api/app/tmlib/routes/api.php`.
### Frontend (`TMResManager`)
**Ubicación:** `app/src/app/tmlib/ui/tm-res-manager/`
| Elemento | Detalle |
|----------|---------|
| **ViewFilter dropdown** | `nz-select` en `.ViewFilter` con opciones: `Todos`, `Recientes`, `Mis favoritos`. Modelo `viewFilter: 'all' \| 'recent' \| 'favorites'`. Al cambiar, invoca `requeryDocuments()`. |
| **Toolbar** | Botones `Favorito` / `Quitar favorito` (o toggle único según selección). Habilitados cuando `checkedCount >= 1`. Iconos Ant Design (`star` / `star-fill`). |
| **requeryDocuments** | Pasa `view` al GET `/tm/repo?view=...`. |
| **Selección múltiple** | Usar `lastSelection.checkedRows` para enviar `docids` al POST/DELETE fav. |
## Criterios de Aceptación
1. Marcar favorito persiste en `tmfavdb` para el usuario de sesión.
2. Desmarcar elimina el registro correspondiente sin error si ya no existía.
3. Vista **Todos** muestra el listado completo (default).
4. Vista **Mis favoritos** muestra solo documentos favoritos del usuario.
5. Vista **Recientes** muestra máximo 25 documentos del usuario por creación/modificación reciente.
6. El toolbar permite operación masiva sobre la selección actual.
7. Tras marcar/desmarcar, la grilla refleja el cambio (requery o actualización local de `isFavorite`).
8. `GET /tm/repo` sin `view` mantiene compatibilidad (equivale a `all`).
9. Código documentado con JSDoc/PHPDoc según estándar TercerMedio.
# TASK LIST
[x] Crear `spTMFavPost.sp.sql` y `spTMFavDrop.sp.sql` en `api/app/tmlib/migrations/empresa/sql/api/`.
[x] Alterar `spTMRepoList.sp.sql`: parámetro `view`, filtros favorites/recent, columna `isFavorite`.
[x] Registrar rutas `POST/DELETE /api/tm/fav` y extender `TMRepoController` (o `TMFavController`) + query `view` en index.
[x] Actualizar `TMResManager`: dropdown ViewFilter, botones toolbar favorito, `requeryDocuments` con `view`.
[x] Documentar PHPDoc/JSDoc en archivos tocados.
# TEST UNITS
- [OK] `spTMFavPost` debe insertar favoritos del usuario sin duplicados
- [OK] `spTMFavDrop` debe eliminar favoritos del usuario para los docids indicados
- [OK] `spTMRepoList` debe soportar `@view` all, favorites y recent (TOP 25) con `isFavorite`
- [OK] Rutas `POST/DELETE /api/tm/fav` deben estar registradas
- [OK] `GET /api/tm/repo` debe aceptar query param `view`
- [OK] TMResManager debe enviar `view` al listar documentos
- [OK] TMResManager debe llamar POST/DELETE `/tm/fav` al marcar/desmarcar selección
# REVISION
[x] La marca de favorito debe mostrarse en la columna info
[x] Debe usarse un solo boton en el toolbar para marcar/desmarcar favoritos. Al momento de procesar, si el documento es favorito se le quita la marca y si no lo es, se le asigna
[x] Al intentar quitar la marca de favorito se genera un error "debe indicar al menos un docID"
[x] La marca de favorito debe mostrarse en color negro sobre fondo transparente.
[x] Al pulsar el boton de favorito con un documento marcado como favorito, no elimina la marca.
[x] Cuando un documento ya no esta en la lista de favoritos, sigue apareciendo la marca en pantalla
Espero les sirva de ayuda, pero aclaro: yo soy SUPER novato en esto... lo que les describo es lo que me ha funcionado a mi por ahora, pero no siginfifca ni que sea la mejor practica ni que funcione para todo el mundo.
Saludos
Victor ESpina