diff --git a/CONTRACT-GAPS.md b/CONTRACT-GAPS.md index 30a1fe2..3fdc537 100644 --- a/CONTRACT-GAPS.md +++ b/CONTRACT-GAPS.md @@ -30,6 +30,12 @@ Estados: `identified` (detectado, sin issue) · `requested` (issue abierto) · | Post-venta comprador B2C (reenvío de ticket sin credenciales) | `POST /public/tickets/{code}/resend` (reenvía QR/email al mail del comprador, rate-limited, email enmascarado en la respuesta) | B2C (`/api/public`) | mcp ✓ | [#191](https://github.com/AppFreeticket/free-admin/issues/191) | shipped | | Authorization server OAuth 2.1 para el MCP remoto — claude.ai exige OAuth para connectors con credenciales. Resuelto **embebiendo el AS en el propio mcp** (v0.10.0): tokens stateless que sellan API key + workspace + sesión admin; no requirió endpoint nuevo en free-admin. `FT_OAUTH_ISSUER` permite delegar a un AS de free-admin si algún día existe | `/.well-known/oauth-authorization-server` (RFC 8414), dynamic client registration (RFC 7591), `/authorize` + `/token` con PKCE y página de consentimiento — todo servido por el mcp | B2B | mcp ✓ | — | shipped | -| Update endpoints sin `requestBody` en el spec — el mcp no puede tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedan fuera de la Ola B | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — declarar `requestBody` (schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate`) | B2B | mcp | — | identified | +| Update endpoints sin `requestBody` en el spec — el mcp no podía tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedaban fuera de la Ola B. **Resuelto en el contrato 1.5.0**: los cinco schemas existen y el mcp los expone (v0.12.0) | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate` | B2B | mcp ✓ | — | shipped | +| API key de servicio self-service — un cron server-side (Vercel) no puede usar el device flow interactivo, y no había forma de acuñar una `ft_live_…` sin entrar al backend | `GET/POST/DELETE /api-keys` (scope `read`/`write`, `expiresAt`, el plano solo en la respuesta de creación) | B2B | cli ✓ (`ft api-keys`), mcp ✓ (solo list) | [freeticket-cli#29](https://github.com/AppFreeticket/freeticket-cli/issues/29) | shipped | +| Service token de plataforma para `ft admin` headless — el superadmin solo tenía la cookie de sesión del browser | `GET/POST/DELETE /api/admin/tokens` | Admin | cli ✓ (`ft admin tokens`), mcp ✓ (solo list) | — | shipped | +| Liquidaciones al organizador: monto consignado y estado por evento/función, y el desglose financiero (bruto, cargo de plataforma, facial, comisión de pasarela, 4x1000, neto) | `GET /settlements`, `GET /reports/financials` | B2B | cli ✓ (`ft settlements list`, `ft reports financials`), mcp ✓ | [freeticket-cli#32](https://github.com/AppFreeticket/freeticket-cli/issues/32) | shipped | +| **PDF de comprobante de liquidación** — el contrato expone `hasDocument` y los `fileName` de los comprobantes, pero no una URL de descarga; el archivo sigue siendo solo del panel. Bloquea archivar el comprobante junto al resto de la documentación financiera | `GET /settlements/{id}/document` (o URL firmada de corta vida en el `Settlement`) | B2B | cli, mcp | [#381](https://github.com/AppFreeticket/free-admin/issues/381) · origen [cli#32](https://github.com/AppFreeticket/freeticket-cli/issues/32) | requested | +| **Listado de staff cross-workspace** — `GET /staff` está scopeado a un workspace por `X-Workspace-Id`, así que un dashboard con N workspaces hace 1×`/me` + N×`/staff`. El fan-out del mcp (`workspace: "all"`) tapa el síntoma del lado cliente, pero sigue siendo N round trips; en cold start serverless es el tramo más caro | `GET /staff?workspaceIds=a,b,c` devolviendo staff agrupado por workspace | B2B | cli, mcp | [#382](https://github.com/AppFreeticket/free-admin/issues/382) · origen [cli#31](https://github.com/AppFreeticket/freeticket-cli/issues/31) | requested | +| **Onboarding enterprise white-label por API** — el admin API no expone `webTemplate` / `customDomain` en `PATCH /workspaces/{id}` ni la asignación manual de plan, así que `ft admin enterprise` no se puede construir sin inventar contrato | `PATCH /api/admin/workspaces/{id}` con `webTemplate`, `customDomain`, `customDomainVerifiedAt` + `POST /api/admin/workspaces/{id}/plan` | Admin | cli | [#383](https://github.com/AppFreeticket/free-admin/issues/383) · origen [cli#23](https://github.com/AppFreeticket/freeticket-cli/issues/23) | requested | diff --git a/cli b/cli index c0200d3..5291114 160000 --- a/cli +++ b/cli @@ -1 +1 @@ -Subproject commit c0200d34d4918ae127a545dcb194ce9d8785745b +Subproject commit 52911143360f664cb333791aafb94242f79959a8 diff --git a/mcp b/mcp index 4f8718d..ad56f19 160000 --- a/mcp +++ b/mcp @@ -1 +1 @@ -Subproject commit 4f8718d6f5d5ff9ffbf39d5f8613b4a45e0e424c +Subproject commit ad56f1969047aeca1ed0fdae4bd8f2a210c6d419 diff --git a/skills b/skills index 58cf3db..da460f3 160000 --- a/skills +++ b/skills @@ -1 +1 @@ -Subproject commit 58cf3db0a4edda419045d10c0b97758ca8960ed9 +Subproject commit da460f3b846c028323be56e18c577324238c6f58