# :: export::app :: paquete::sistemas ::

## :: overview::app ::

| campo | valor |
|-------|--------|
| **nombre** | `mayan-sync-catrina-control` |
| **owner** | alfonso @ terrauniversalis |
| **version** | `1.0.0` |
| **clave primaria** | `ID_Post` |
| **clave secundaria** | `URL` |
| **fuente canónica** | `final_production_package_control.csv` |
| **cuenta** | `@catrina_nortena` |
| **posts en memoria** | `10` |
| **columnas modelo** | `51` |
| **endpoints** | `10` |
| **api base** | `https://api.terrauniversalis.mx/catrina/v1` |
| **analytics** | Streamlit + Plotly / Power BI |
| **ingesta CSV** | multipart/form-data + upsert por `ID_Post` |
| **observabilidad** | Teams webhook + logs JSON |

Tablero editorial que revisa, corrige y enruta posts diarios de **@catrina_nortena** para el área editorial de Terrauniversalis. Integra pipeline **Panchita**, QA automático y verificación de fuentes.

Datos en **memoria de sesión** del navegador; export a **SharePoint / Power Automate**. Este paquete es lo que **Sistemas** necesita para replicar el modelo (Postgres, SharePoint, Fabric, etc.).

**UI docs:** [app.html](./app.html)

## :: stack::tecnico ::

| capa | tecnología |
|------|------------|
| frontend | Vite + React 18 + TypeScript |
| styling | Tailwind v4 + Shadcn UI |
| routing | react-router-dom |
| estado | memory-store + TanStack Query |
| charts | D3.js |
| iconografía | lucide-react |
| analytics | Streamlit + Plotly / Power BI |
| backend sugerido | FastAPI o Node/Express |
| persistencia | PostgreSQL o SharePoint List |
| automatización | Power Automate + Copilot Studio |
| observabilidad | Teams webhook + logs JSON |

## :: autenticacion :: bearer::jwt ::

Todas las llamadas requieren JWT Azure AD (tenant Terrauniversalis):

```http
Authorization: Bearer <token>
```

Rate limit: **120 req/min** por token.

| rol | permisos |
|-----|----------|
| editor | GET, PATCH (posts propios) |
| revisor | GET, PATCH (todos) |
| produccion | GET, PATCH, POST |
| admin | GET, POST, PATCH, DELETE |

```bash
export CATRINA_API_BASE="https://api.terrauniversalis.mx/catrina/v1"
export CATRINA_API_TOKEN="eyJhbGciOi..."
```

### ejemplos curl

```bash
curl -X GET "https://api.terrauniversalis.mx/catrina/v1/posts?estado=REVISAR&limit=50" \
  -H "Authorization: Bearer $CATRINA_API_TOKEN" \
  -H "Content-Type: application/json"
```

```bash
curl -X PATCH "https://api.terrauniversalis.mx/catrina/v1/posts/2054615748157604003" \
  -H "Authorization: Bearer $CATRINA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"Estado_Revision":"Aprobado","QA_Status":"PASS","Revisor":"alfonso"}'
```

## :: endpoints::rest :: 10 rutas ::

Base: `https://api.terrauniversalis.mx/catrina/v1`

| # | método | path | uso |
|---|--------|------|-----|
| 1 | GET | `/posts` | Listar + filtros/paginación |
| 2 | GET | `/posts/{ID_Post}` | Obtener post |
| 3 | POST | `/posts` | Crear (upsert `?upsert=1`) |
| 4 | PATCH | `/posts/{ID_Post}` | Actualizar parcial |
| 5 | DELETE | `/posts/{ID_Post}` | Soft-delete (`?hard=1` admin) |
| 6 | GET | `/export/csv` | **descargar csv** 51 cols |
| 7 | GET | `/export/json` | **descargar json** snapshot |
| 8 | POST | `/ingest/csv` | multipart file · upsert ID_Post |
| 9 | GET | `/stats` | KPIs Streamlit / Power BI |
| 10 | POST | `/webhook/post-updated` | Power Automate / Teams |

OpenAPI oficial: [`catrina_openapi.yaml`](./catrina_openapi.yaml) (alias `openapi.yaml`)

Esquema 51 cols: [`columns_model_51.json`](./columns_model_51.json)

## :: conexion::streamlit ::

```bash
pip install streamlit pandas requests plotly
export CATRINA_API_BASE="https://api.terrauniversalis.mx/catrina/v1"
export CATRINA_API_TOKEN="eyJhbGciOi..."
streamlit run catrina_streamlit_app.py
```

Archivo: [`catrina_streamlit_app.py`](./catrina_streamlit_app.py)

## :: notas::deploy :: sistemas ::

1. Replicar esquema **51 columnas**. PK `ID_Post` (índice único). SK `URL`.
2. Backend FastAPI/Node con los **10 endpoints** y contrato OpenAPI.
3. Azure AD App Registration · roles editor/revisor/produccion/admin · JWT.
4. Ingesta inicial: `POST /ingest/csv` con `final_production_package_control.csv` (upsert).
5. Power Automate escucha `/webhook/post-updated` → canal Teams `#catrina-editorial`.
6. Publicar Streamlit (App Service / Container Apps).
7. Backup diario del CSV canónico a OneDrive Terrauniversalis.

## :: contacto::sistemas ::

- owner: alfonso @ terrauniversalis  
- mail: sistemas@terrauniversalis.mx  
- canal Teams: `#catrina-editorial`

## :: entrega::sistemas ::

| artefacto | archivo |
|-----------|---------|
| csv | export tablero / `/export/csv` |
| json | export tablero / `/export/json` |
| openapi | `catrina_openapi.yaml` |
| streamlit.py | `catrina_streamlit_app.py` |

::::terra::sls:::: ♾ · ::::mayan::sync::catrina::powerapp::control::::
