From 5846c515f35831f5ac9fc7419a1f78b270004443 Mon Sep 17 00:00:00 2001 From: mgonzalez Date: Fri, 5 Jun 2026 11:21:30 -0500 Subject: [PATCH] feat: sitio CV completo v1.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 4 temas WordPress: persona-cv (activo), lumina, apex-cv, cvolio - Plugin pflores-cv-fields con CMB2 (100% gratuito) — admin editable - Generador PDF dinámico con Chromium headless (?cv_pdf=1) - Datos del CV de Patricia Flores cargados en CMB2 - URL dinámica con soporte proxy SSL (NPM/X-Forwarded-Proto) - WP Mail SMTP instalado (pendiente config SMTP) - Documentación completa: PROMPT_IA.md, DEPLOY_WEB.md, PRODUCCION.md, VERSIONADO.md --- .gitignore | 56 +- CHANGELOG.md | 38 + CV_Patricia_Flores_Sanchez_ES_FINAL.docx | Bin 0 -> 19375 bytes DEPLOY_WEB.md | 90 ++ PRODUCCION.md | 85 ++ PROMPT_IA.md | 756 ++++++++++ README.md | 98 +- VERSION | 1 + VERSIONADO.md | 50 + backend/start-wordpress.sh | 3 +- backend/wordpress/wp-config.php | 29 +- .../pflores-cv-fields/pdf-generator.php | 499 +++++++ .../pflores-cv-fields/pflores-cv-fields.php | 350 +++++ .../pflores-cv-fields/populate-data.php | 187 +++ .../themes/apex-cv/assets/css/theme.css | 1194 ++++++++++++++++ .../CV_Patricia_Flores_Sanchez_ES_FINAL.docx | Bin 0 -> 19375 bytes .../images/patricia-flores-profile.jpeg | Bin 0 -> 29272 bytes .../assets/images/patricia-flores-qr.png | Bin 0 -> 535 bytes .../assets/images/profile-placeholder.svg | 10 + .../themes/apex-cv/assets/js/theme.js | 183 +++ .../wp-content/themes/apex-cv/footer.php | 5 + .../wp-content/themes/apex-cv/front-page.php | 351 +++++ .../wp-content/themes/apex-cv/functions.php | 118 ++ .../wp-content/themes/apex-cv/header.php | 14 + .../themes/apex-cv/inc/customizer.php | 5 + .../wp-content/themes/apex-cv/inc/cv-data.php | 204 +++ .../wp-content/themes/apex-cv/inc/visits.php | 130 ++ .../wp-content/themes/apex-cv/index.php | 24 + .../wp-content/themes/apex-cv/style.css | 9 + backend/wordpress/wp-content/themes/lumina | 1 + .../wordpress/wp-content/themes/persona-cv | 1 + docs/instalacion-wordpress.md | 52 +- frontend/cvfolio-theme/assets/css/theme.css | 760 ++++++++-- .../CV_Patricia_Flores_Sanchez_ES_FINAL.docx | Bin 0 -> 19375 bytes .../images/patricia-flores-profile.jpeg | Bin 0 -> 29272 bytes .../assets/images/patricia-flores-qr.png | Bin 0 -> 535 bytes .../assets/images/profile-placeholder.svg | 10 + frontend/cvfolio-theme/assets/js/theme.js | 7 + frontend/cvfolio-theme/front-page.php | 296 +++- frontend/cvfolio-theme/functions.php | 58 +- frontend/cvfolio-theme/header.php | 10 +- frontend/cvfolio-theme/inc/customizer.php | 31 +- frontend/cvfolio-theme/inc/cv-data.php | 189 +++ frontend/cvfolio-theme/inc/visits.php | 118 ++ frontend/lumina-cv-theme/assets/css/theme.css | 1218 +++++++++++++++++ .../CV_Patricia_Flores_Sanchez_ES_FINAL.docx | Bin 0 -> 19375 bytes .../images/patricia-flores-profile.jpeg | Bin 0 -> 29272 bytes .../assets/images/patricia-flores-qr.png | Bin 0 -> 535 bytes .../assets/images/profile-placeholder.svg | 10 + frontend/lumina-cv-theme/assets/js/theme.js | 60 + frontend/lumina-cv-theme/footer.php | 18 + frontend/lumina-cv-theme/front-page.php | 343 +++++ frontend/lumina-cv-theme/functions.php | 133 ++ frontend/lumina-cv-theme/header.php | 41 + frontend/lumina-cv-theme/inc/customizer.php | 53 + frontend/lumina-cv-theme/inc/cv-data.php | 189 +++ frontend/lumina-cv-theme/inc/visits.php | 116 ++ frontend/lumina-cv-theme/index.php | 28 + frontend/lumina-cv-theme/style.css | 11 + .../persona-cv-theme/assets/css/theme.css | 458 +++++++ .../CV_Patricia_Flores_Sanchez_ES_FINAL.docx | Bin 0 -> 19375 bytes .../images/patricia-flores-profile.jpeg | Bin 0 -> 29272 bytes .../assets/images/patricia-flores-qr.png | Bin 0 -> 535 bytes .../assets/images/profile-placeholder.svg | 10 + frontend/persona-cv-theme/assets/js/theme.js | 97 ++ frontend/persona-cv-theme/footer.php | 6 + frontend/persona-cv-theme/front-page.php | 382 ++++++ frontend/persona-cv-theme/functions.php | 67 + frontend/persona-cv-theme/header.php | 34 + frontend/persona-cv-theme/inc/customizer.php | 23 + frontend/persona-cv-theme/inc/cv-data.php | 157 +++ frontend/persona-cv-theme/inc/visits.php | 35 + frontend/persona-cv-theme/index.php | 12 + frontend/persona-cv-theme/style.css | 11 + img-pflores.jpeg | Bin 0 -> 29272 bytes tarjeta-patricia-flores-qr.png | Bin 0 -> 535 bytes tarjeta-presentacion-patricia-flores.html | 253 ++++ 77 files changed, 9567 insertions(+), 220 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CV_Patricia_Flores_Sanchez_ES_FINAL.docx create mode 100644 DEPLOY_WEB.md create mode 100644 PRODUCCION.md create mode 100644 PROMPT_IA.md create mode 100644 VERSION create mode 100644 VERSIONADO.md create mode 100644 backend/wordpress/wp-content/plugins/pflores-cv-fields/pdf-generator.php create mode 100644 backend/wordpress/wp-content/plugins/pflores-cv-fields/pflores-cv-fields.php create mode 100644 backend/wordpress/wp-content/plugins/pflores-cv-fields/populate-data.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/assets/css/theme.css create mode 100644 backend/wordpress/wp-content/themes/apex-cv/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx create mode 100644 backend/wordpress/wp-content/themes/apex-cv/assets/images/patricia-flores-profile.jpeg create mode 100644 backend/wordpress/wp-content/themes/apex-cv/assets/images/patricia-flores-qr.png create mode 100644 backend/wordpress/wp-content/themes/apex-cv/assets/images/profile-placeholder.svg create mode 100644 backend/wordpress/wp-content/themes/apex-cv/assets/js/theme.js create mode 100644 backend/wordpress/wp-content/themes/apex-cv/footer.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/front-page.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/functions.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/header.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/inc/customizer.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/inc/cv-data.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/inc/visits.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/index.php create mode 100644 backend/wordpress/wp-content/themes/apex-cv/style.css create mode 120000 backend/wordpress/wp-content/themes/lumina create mode 120000 backend/wordpress/wp-content/themes/persona-cv create mode 100644 frontend/cvfolio-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx create mode 100644 frontend/cvfolio-theme/assets/images/patricia-flores-profile.jpeg create mode 100644 frontend/cvfolio-theme/assets/images/patricia-flores-qr.png create mode 100644 frontend/cvfolio-theme/assets/images/profile-placeholder.svg create mode 100644 frontend/cvfolio-theme/inc/cv-data.php create mode 100644 frontend/cvfolio-theme/inc/visits.php create mode 100644 frontend/lumina-cv-theme/assets/css/theme.css create mode 100644 frontend/lumina-cv-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx create mode 100644 frontend/lumina-cv-theme/assets/images/patricia-flores-profile.jpeg create mode 100644 frontend/lumina-cv-theme/assets/images/patricia-flores-qr.png create mode 100644 frontend/lumina-cv-theme/assets/images/profile-placeholder.svg create mode 100644 frontend/lumina-cv-theme/assets/js/theme.js create mode 100644 frontend/lumina-cv-theme/footer.php create mode 100644 frontend/lumina-cv-theme/front-page.php create mode 100644 frontend/lumina-cv-theme/functions.php create mode 100644 frontend/lumina-cv-theme/header.php create mode 100644 frontend/lumina-cv-theme/inc/customizer.php create mode 100644 frontend/lumina-cv-theme/inc/cv-data.php create mode 100644 frontend/lumina-cv-theme/inc/visits.php create mode 100644 frontend/lumina-cv-theme/index.php create mode 100644 frontend/lumina-cv-theme/style.css create mode 100644 frontend/persona-cv-theme/assets/css/theme.css create mode 100644 frontend/persona-cv-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx create mode 100644 frontend/persona-cv-theme/assets/images/patricia-flores-profile.jpeg create mode 100644 frontend/persona-cv-theme/assets/images/patricia-flores-qr.png create mode 100644 frontend/persona-cv-theme/assets/images/profile-placeholder.svg create mode 100644 frontend/persona-cv-theme/assets/js/theme.js create mode 100644 frontend/persona-cv-theme/footer.php create mode 100644 frontend/persona-cv-theme/front-page.php create mode 100644 frontend/persona-cv-theme/functions.php create mode 100644 frontend/persona-cv-theme/header.php create mode 100644 frontend/persona-cv-theme/inc/customizer.php create mode 100644 frontend/persona-cv-theme/inc/cv-data.php create mode 100644 frontend/persona-cv-theme/inc/visits.php create mode 100644 frontend/persona-cv-theme/index.php create mode 100644 frontend/persona-cv-theme/style.css create mode 100644 img-pflores.jpeg create mode 100644 tarjeta-patricia-flores-qr.png create mode 100644 tarjeta-presentacion-patricia-flores.html diff --git a/.gitignore b/.gitignore index 3fef480..d7c5ffb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,58 @@ -backend/wordpress/wp-config-local.php +# ── Secretos y entorno ────────────────────────────────────── +.env +.env.* +!.env.example +.token_gitea +LOCAL_DEPLOY_CONTEXT.md + +# ── WordPress core (no versionar — viene de wordpress.org) ── +backend/wordpress/wp-admin/ +backend/wordpress/wp-includes/ +backend/wordpress/wp-activate.php +backend/wordpress/wp-blog-header.php +backend/wordpress/wp-comments-post.php +backend/wordpress/wp-cron.php +backend/wordpress/wp-links-opml.php +backend/wordpress/wp-load.php +backend/wordpress/wp-login.php +backend/wordpress/wp-mail.php +backend/wordpress/wp-settings.php +backend/wordpress/wp-signup.php +backend/wordpress/wp-trackback.php +backend/wordpress/xmlrpc.php +backend/wordpress/index.php +backend/wordpress/readme.html +backend/wordpress/license.txt + +# ── wp-content: solo versionar lo propio ──────────────────── backend/wordpress/wp-content/uploads/ backend/wordpress/wp-content/cache/ backend/wordpress/wp-content/upgrade/ backend/wordpress/wp-content/backups/ -.env -.token_gitea +backend/wordpress/wp-content/debug.log +backend/wordpress/wp-content/languages/ + +# Temas por defecto de WordPress (no son nuestros) +backend/wordpress/wp-content/themes/twentytwentythree/ +backend/wordpress/wp-content/themes/twentytwentyfour/ +backend/wordpress/wp-content/themes/twentytwentyfive/ + +# Plugins descargados de WordPress.org (no son nuestros) +backend/wordpress/wp-content/plugins/cmb2/ +backend/wordpress/wp-content/plugins/wp-mail-smtp/ +backend/wordpress/wp-content/plugins/advanced-custom-fields/ +backend/wordpress/wp-content/plugins/index.php + +# ── Sistema / editor ──────────────────────────────────────── .DS_Store +Thumbs.db +.idea/ +.vscode/* +!.vscode/extensions.json +*.swp +*.swo +.claude/ + +# ── Archivos temporales ────────────────────────────────────── +/tmp/ +*.tmp diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e336ee8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,38 @@ +# Changelog — pflores.linkedcorp.net + +Formato: `X.Y.Z` según `VERSIONADO.md` + +--- + +## [1.0.0] — 2026-06-05 + +### Lanzamiento inicial completo + +**Temas WordPress (4)** +- `persona-cv` — Personage/Pixflow style: hero fullscreen, secciones alternas, timeline centrado, barras de skills, Raleway + Open Sans. Tema activo. +- `lumina` — Diseño claro alegre, paleta teal+ámbar, sidebar izquierdo, foto circular, Plus Jakarta Sans. +- `apex-cv` — Dark theme serio, sidebar fijo izquierdo, acento cian eléctrico, Space Grotesk. +- `cvolio` — Glassmorphism oscuro, paleta café/tostado, sidebar derecho. + +**Gestión de contenido** +- Plugin propio `pflores-cv-fields` con CMB2 (100 % gratuito). +- Panel admin **"CV Patricia Flores"** con 5 sub-páginas editables: Perfil, Experiencia, Formación, Competencias, Métricas/Impacto. +- Todos los datos del CV editables sin tocar código. + +**Generador de PDF** +- Endpoint `/?cv_pdf=1` genera PDF dinámico con Chromium headless. +- Diseño fiel al documento DOCX original: columna única, navy #1B3A5C, secciones en mayúsculas con borde inferior. +- Se actualiza automáticamente al cambiar datos en el admin. +- Botón "Descargar CV PDF" en todos los temas apunta al mismo endpoint. + +**Infraestructura** +- Servidor PHP integrado en `0.0.0.0:8081` (accesible desde red local). +- URL dinámica en `wp-config.php` — funciona con cualquier IP y detrás de proxy SSL (NPM). +- Auto-updates de WordPress desactivados. +- WP Mail SMTP instalado (pendiente configuración SMTP). + +**Contenido del CV cargado** +- 5 cargos con 23 bullets completos. +- 2 títulos académicos, 10 certificaciones. +- 3 grupos de competencias (15 habilidades con porcentajes). +- Métricas, highlights, impacto, voluntariado y datos adicionales. diff --git a/CV_Patricia_Flores_Sanchez_ES_FINAL.docx b/CV_Patricia_Flores_Sanchez_ES_FINAL.docx new file mode 100644 index 0000000000000000000000000000000000000000..544bf3d781cd85ddc8becbc624bf639c8ba6fe11 GIT binary patch literal 19375 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/dev/null +``` + +## Tema activo + +- Slug: `persona-cv` +- Fuente: `frontend/persona-cv-theme/` (symlink) + +## Repositorio Git + +- Remoto: `https://gitea.linkedcorp.net/mgonzalez/pflores.linkedcorp.net.git` +- Rama principal: `main` +- Credenciales: `~/.gitconfig` o `.token_gitea` (no versionado) + +## Comandos de verificación rápida + +```bash +# Site responde +curl -s http://127.0.0.1:8081/ | grep -c "Patricia Soledad" + +# PDF funciona +curl -sI http://127.0.0.1:8081/?cv_pdf=1 | grep Content-Type + +# Limpiar caché WP si algo no se actualiza +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "DELETE FROM cv_options WHERE option_name LIKE '_site_transient_%' OR option_name LIKE '_transient_%';" 2>/dev/null +``` + +## Pendientes + +- [ ] Configurar SMTP en WP Mail SMTP (Gmail u otro proveedor) +- [ ] Revisar si el proceso WordPress arranca automáticamente al reiniciar el servidor diff --git a/PROMPT_IA.md b/PROMPT_IA.md new file mode 100644 index 0000000..07e63bc --- /dev/null +++ b/PROMPT_IA.md @@ -0,0 +1,756 @@ +# PROMPT_IA — Guía completa del proyecto pflores.linkedcorp.net + +> Documento de referencia para asistentes de IA. Léelo completo antes de cualquier tarea. +> Última actualización: junio 2026. + +--- + +## 1. ¿Qué es este proyecto? + +Sitio web personal de **hoja de vida / currículum ejecutivo** de **Patricia Soledad Flores Sánchez**, gerente de operaciones financieras con 22+ años en banca y microfinanzas (Ecuador). + +- URL pública: `https://pflores.linkedcorp.net` +- Stack: **WordPress 6.x** + PHP 8.4 + MariaDB + **CMB2** (campos personalizados, 100 % gratuito) +- Se ejecuta con el servidor PHP incorporado (`php -S`) en el puerto **8081** +- SSL terminado por **Nginx Proxy Manager** → envía `X-Forwarded-Proto: https` +- IP local del servidor: `192.168.222.40` + +--- + +## 2. Estructura de directorios + +``` +pflores.linkedcorp.net/ +├── backend/ +│ ├── start-wordpress.sh # Arrancar el servidor PHP +│ └── wordpress/ # Instalación WordPress +│ ├── wp-config.php # Config dinámica (URL, auto-updates OFF) +│ └── wp-content/ +│ ├── plugins/ +│ │ ├── cmb2/ # CMB2 — campos personalizados (GRATIS) +│ │ └── pflores-cv-fields/ +│ │ ├── pflores-cv-fields.php # Menú admin + campos CMB2 +│ │ ├── pdf-generator.php # Generador PDF con Chromium +│ │ └── populate-data.php # Sembrador inicial (ejecutar 1 vez) +│ └── themes/ +│ ├── persona-cv/ # ACTIVO — Personage-style, rojo, timeline central +│ ├── apex-cv/ # Dark, cian, sidebar fijo izquierdo +│ ├── lumina -> ../../frontend/lumina-cv-theme # symlink +│ ├── cvolio -> ../../frontend/cvfolio-theme # symlink +│ └── ... +├── frontend/ +│ ├── persona-cv-theme/ # Fuente del tema activo (usa symlink persona-cv) +│ │ ├── style.css # Solo cabecera del tema +│ │ ├── functions.php # Setup, enqueue, helpers +│ │ ├── header.php # Header con nav y botón PDF +│ │ ├── footer.php +│ │ ├── front-page.php # PLANTILLA PRINCIPAL — toda la página CV +│ │ ├── index.php # Fallback +│ │ ├── assets/css/theme.css # Estilos completos +│ │ ├── assets/js/theme.js # JS (nav, scroll spy, animaciones) +│ │ ├── assets/images/ # patricia-flores-profile.jpeg, qr.png +│ │ ├── assets/docs/ # CV_Patricia_Flores_Sanchez_ES_FINAL.docx +│ │ └── inc/ +│ │ ├── cv-data.php # Fallback hardcodeado (función persona_cv_data()) +│ │ ├── customizer.php # Campos Customizer (mínimos) +│ │ └── visits.php # Contador de visitas +│ ├── lumina-cv-theme/ # Tema claro teal+ámbar, sidebar izquierdo +│ ├── cvfolio-theme/ # Tema oscuro glassmorphism (original) +│ └── apex-cv-theme/ # OBSOLETO — usar wp-content/themes/apex-cv +├── docs/ +│ └── instalacion-wordpress.md +├── .env # Variables de entorno (DB, puerto, etc.) +├── PROMPT_IA.md # ESTE ARCHIVO +└── README.md +``` + +> **NOTA IMPORTANTE:** El tema `apex-cv` vive directamente en +> `backend/wordpress/wp-content/themes/apex-cv/` (directorio real, no symlink) +> porque el directorio `frontend/apex-cv-theme/` tiene un problema de persistencia. +> Los demás temas activos usan symlinks desde `wp-content/themes/` hacia `frontend/`. + +--- + +## 3. Base de datos + +``` +Host: 192.168.222.20 +DB: paty.wordpress +Usuario: paty.wordpress +Password: paty.wordpress +Prefijo: cv_ → tabla principal: cv_options +``` + +Conexión de prueba: +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 +``` + +--- + +## 4. Arrancar / reiniciar el servidor + +```bash +# Ver si está corriendo +lsof -i tcp:8081 + +# Matar proceso existente +kill $(lsof -ti tcp:8081) + +# Arrancar (lee variables de .env automáticamente) +bash backend/start-wordpress.sh & +``` + +El servidor escucha en `0.0.0.0:8081` (todas las interfaces) gracias a `WP_HOST=0.0.0.0` en `.env`. + +--- + +## 5. Plugins activos y su función + +| Plugin | Propósito | Gratuito | +|--------|-----------|----------| +| `cmb2/init.php` | Campos personalizados en el admin (repeaters, options pages) | ✓ GPL | +| `pflores-cv-fields/pflores-cv-fields.php` | Páginas de opciones + función `pflores_get_cv_data()` + PDF | ✓ propio | + +**Activar / verificar plugins en la BD:** +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "SELECT option_value FROM cv_options WHERE option_name='active_plugins';" +``` + +El valor correcto debe ser: +``` +a:2:{i:0;s:13:"cmb2/init.php";i:1;s:39:"pflores-cv-fields/pflores-cv-fields.php";} +``` + +Si no, corregirlo: +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "UPDATE cv_options SET option_value='a:2:{i:0;s:13:\"cmb2/init.php\";i:1;s:39:\"pflores-cv-fields/pflores-cv-fields.php\";}' WHERE option_name='active_plugins';" +``` + +> ⚠ La serialización PHP es estricta: `s:N:` donde N es la longitud exacta en bytes. +> Siempre genera el valor con `php -r "echo serialize(['cmb2/init.php','pflores-cv-fields/pflores-cv-fields.php']);"`. + +--- + +## 6. Cambiar el tema activo + +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "UPDATE cv_options SET option_value='SLUG_TEMA' WHERE option_name IN('template','stylesheet');" +``` + +| Slug | Tema | +|------|------| +| `persona-cv` | **Activo por defecto** — Personage-style, secciones alternas, rojo | +| `lumina` | Claro, teal+ámbar, sidebar izquierdo, foto circular | +| `apex-cv` | Oscuro, cian eléctrico, sidebar fijo | +| `cvolio` | Oscuro glassmorphism, paleta café/tostado | + +--- + +## 7. Arquitectura de datos — CMB2 + +Todos los datos del CV se almacenan en `wp_options` (prefijo `cv_`) como arrays PHP serializados. Se acceden con `get_option('clave')`. + +| Clave `wp_options` | Contenido | +|--------------------|-----------| +| `pflores_perfil` | Nombre, cargo, intro, resumen, contacto, foto | +| `pflores_experiencia` | Array de cargos con bullets | +| `pflores_formacion` | Títulos académicos + certificaciones | +| `pflores_competencias` | Grupos de habilidades con porcentajes | +| `pflores_extras` | Métricas, highlights, impacto, voluntariado | + +**Función central de lectura:** +```php +pflores_get_cv_data(): array +// Retorna la misma estructura que todos los temas esperan. +// Si CMB2 no está disponible, devuelve pflores_cv_fallback_data(). +``` + +**Estructura del array retornado:** +```php +[ + 'hero' => ['name','role','role2','intro','location','email', + 'phone','linkedin','availability','focus','languages', + 'born','id','web','eyebrow'], + 'photo' => 'URL de la imagen de perfil (o vacío)', + 'summary' => ['title','body'], + 'metrics' => [['value','suffix','label'], ...], // 5 contadores + 'highlights' => [['value','suffix','label'], ...], // 4 logros grandes + 'impact' => [['title','body'], ...], // 3 áreas + 'experience' => [['period','title','company','location','lead','bullets'=>[...]], ...], + 'education' => [['year','title','institution','detail'], ...], + 'certifications' => [['year','title','issuer'], ...], + 'competencies' => ['Grupo' => [['name','pct'], ...], ...], + 'volunteer' => ['title','year','body'], + 'additional' => ['Idiomas'=>'...','Disponibilidad'=>'...','C.I.'=>'...', ...], +] +``` + +--- + +## 8. Editar datos del CV desde el admin + +URL del admin: `https://pflores.linkedcorp.net/wp-admin` +- Usuario: `pflores` +- Contraseña: en `.env` como `WP_ADMIN_PASSWORD` + +En el menú lateral aparece **"CV Patricia Flores"** con sub-páginas: +- **Perfil** → datos personales, foto, disponibilidad +- **Experiencia** → cargos (repeater, arrastrable) +- **Formación** → títulos + certificaciones +- **Competencias** → grupos de habilidades con porcentajes +- **Métricas / Impacto** → contadores, logros, áreas de impacto, voluntariado + +--- + +## 9. Agregar un nuevo campo al CV + +### 9a. Campo simple (texto, email, URL) + +**Paso 1** — Registrar el campo en `pflores-cv-fields.php` dentro de la función `pflores_register_pages()`: + +```php +// Ejemplo: añadir "Twitter/X" al perfil +$perfil->add_field([ + 'id' => 'pf_twitter', + 'name' => 'Twitter / X URL', + 'type' => 'text_url', +]); +``` + +**Paso 2** — Añadir la lectura en `pflores_get_cv_data()`: +```php +'hero' => [ + // ... campos existentes ... + 'twitter' => $perfil['pf_twitter'] ?? '', +], +``` + +**Paso 3** — Usarlo en el `front-page.php` de cada tema: +```php +$twitter = $hero['twitter'] ?? ''; +if ($twitter) : ?> + Twitter + +``` + +**Paso 4** — Si el campo debe aparecer en el PDF, añadirlo en `pdf-generator.php` dentro de `pflores_build_cv_html()`. + +--- + +### 9b. Nuevo grupo repetible (como experiencia o certificaciones) + +**Paso 1** — Registrar un nuevo CMB2 box con group en `pflores_register_pages()`: + +```php +$premios = new_cmb2_box([ + 'id' => 'pflores_premios', + 'title' => 'Premios y reconocimientos', + 'object_types' => ['options-page'], + 'option_key' => 'pflores_premios', // nombre de la opción en BD + 'parent_slug' => 'pflores_perfil', // sub-menú bajo el menú principal + 'menu_title' => 'Premios', + 'save_button' => 'Guardar cambios', + 'capability' => 'manage_options', +]); + +$gr = $premios->add_field([ + 'id' => 'pf_awards', + 'type' => 'group', + 'options' => ['group_title' => 'Premio {#}', 'add_button' => 'Añadir premio', + 'remove_button' => 'Eliminar', 'sortable' => true, 'closed' => true], +]); +$premios->add_group_field($gr, ['id' => 'year', 'name' => 'Año', 'type' => 'text']); +$premios->add_group_field($gr, ['id' => 'title', 'name' => 'Título', 'type' => 'text']); +$premios->add_group_field($gr, ['id' => 'org', 'name' => 'Organización','type' => 'text']); +``` + +**Paso 2** — Leer los datos en `pflores_get_cv_data()`: +```php +$premiosOpts = get_option('pflores_premios', []); +$awards = []; +foreach ((array) ($premiosOpts['pf_awards'] ?? []) as $item) { + $awards[] = ['year' => $item['year'] ?? '', 'title' => $item['title'] ?? '', 'org' => $item['org'] ?? '']; +} +// Agregar 'awards' => $awards al array retornado +``` + +**Paso 3** — Renderizarlo en `front-page.php` de cada tema. + +**Paso 4** — Poblar datos iniciales añadiendo al `populate-data.php`: +```php +update_option('pflores_premios', [ + 'pf_awards' => [ + ['year' => '2025', 'title' => 'Premio Excelencia', 'org' => 'Fundación FACES'], + ], +]); +``` + +--- + +## 10. Modificar datos existentes + +**Opción A** — Desde el admin de WordPress (recomendado): +- Ir a `wp-admin` → **CV Patricia Flores** → sub-página correspondiente → editar → Guardar. + +**Opción B** — Directo en BD (para migraciones o correcciones masivas): +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 -e " +UPDATE cv_options SET option_value = 'Nuevo valor' WHERE option_name = 'pflores_perfil'; +" +``` +> Para campos dentro de arrays (repeaters), es más fácil editar desde el admin o re-ejecutar `populate-data.php`. + +**Re-ejecutar el poblador de datos** (si se necesita resetear todo): +``` +https://pflores.linkedcorp.net/wp-content/plugins/pflores-cv-fields/populate-data.php?key=pflores2024 +``` +> ⚠ Esto sobreescribe TODOS los datos con los valores del archivo `populate-data.php`. + +--- + +## 11. Crear un nuevo tema + +### Convenciones obligatorias + +1. **Directorio**: Crear en `frontend/NOMBRE-cv-theme/` con subdirectorios `assets/{css,js,images,docs}` e `inc/`. +2. **Symlink**: `ln -s /ruta/absoluta/frontend/NOMBRE-cv-theme /ruta/wordpress/wp-content/themes/NOMBRE-cv` +3. **Text Domain**: usar `nombre` (minúsculas, sin guiones). +4. **Prefijo de funciones**: `nombre_` (ej: `nova_setup()`, `nova_render_nav()`). +5. **Prefijo CSS**: `nv-` (2-3 letras, sin conflictos con `pn-`, `lm-`, `ax-`, `cv-`). + +### Archivos mínimos requeridos + +``` +NOMBRE-cv-theme/ +├── style.css # Cabecera del tema (Theme Name, Text Domain, Version...) +├── functions.php # apex_setup, enqueue, nav helpers +├── header.php # + nav + botón PDF +├── footer.php # +├── front-page.php # TODA la lógica y HTML del CV +├── index.php # Fallback vacío o mínimo +└── inc/ + ├── cv-data.php # Función NOMBRE_cv_data() con fallback hardcodeado + ├── customizer.php # Opcional, puede estar vacío + └── visits.php # Contador de visitas (copiar de otro tema y renombrar funciones) +``` + +### Estructura obligatoria de `functions.php` + +```php + $items) : ?> +

+ + + +
+ + +``` + +### Botón de descarga PDF (obligatorio en todos los temas) + +```php + + + Descargar CV PDF + +``` + +### `inc/cv-data.php` — función de fallback + +Debe contener **todos los datos reales** de Patricia Flores, idénticos a los que están en la BD. Copiar la función de otro tema y renombrar a `NOMBRE_cv_data()`. + +> ⚠ Las competencias del fallback deben tener formato array: +> `['name' => 'Gestión operativa', 'pct' => 95]` + +### Activar el nuevo tema + +```bash +# 1. Crear el symlink +ln -s /ruta/absoluta/frontend/NOMBRE-cv-theme \ + /ruta/absoluta/backend/wordpress/wp-content/themes/NOMBRE-cv + +# 2. Activar en la BD +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "UPDATE cv_options SET option_value='NOMBRE-cv' WHERE option_name IN('template','stylesheet');" +``` + +> ⚠ **Evitar el slug `apex`** (existe un tema comercial con ese nombre en WordPress.org). +> Usar siempre slugs compuestos: `nova-cv`, `slate-cv`, `forma-cv`, etc. + +--- + +## 12. Crear / modificar menús de navegación + +Los menús de navegación son listas de anclas (`#seccion`) dentro del mismo tema. No se usan menús de WordPress por defecto. + +### Modificar los ítems del menú en un tema + +En `functions.php` de cada tema, hay una función `NOMBRE_render_nav()`: + +```php +function persona_render_nav(): string { + $items = [ + '#sobre-mi' => 'Sobre mí', + '#impacto' => 'Impacto', + '#experiencia' => 'Experiencia', + '#formacion' => 'Formación', + '#competencias' => 'Competencias', + '#certificaciones' => 'Certificaciones', + '#contacto' => 'Contacto', + ]; + // Para añadir un ítem: '#premios' => 'Premios', + // Para eliminar: quitar la línea correspondiente + // Para reordenar: cambiar el orden del array + ... +} +``` + +El `href` debe coincidir con el `id` de la sección en `front-page.php`: +```html +
+``` + +### Usar menús de WordPress (avanzado) + +Si se registra un menú en `functions.php`: +```php +register_nav_menus(['primary' => __('Menú principal', 'persona')]); +``` + +Se puede asignar desde `wp-admin` → **Apariencia → Menús** y el tema lo detectará automáticamente si `has_nav_menu('primary')` retorna `true`. + +--- + +## 13. Generador de PDF + +**Endpoint:** `https://pflores.linkedcorp.net/?cv_pdf=1` + +**Cómo funciona** (`pdf-generator.php`): +1. Se activa con `get_query_var('cv_pdf') === '1'` +2. Llama a `pflores_get_cv_data()` para obtener todos los datos actuales +3. Genera HTML limpio con CSS embebido (formato A4, 2 columnas) +4. Escribe el HTML en un archivo temporal +5. Ejecuta Chromium headless: `chromium --headless --no-sandbox --print-to-pdf=... file://...` +6. Lee el PDF resultante y lo devuelve con headers de descarga +7. Limpia los archivos temporales + +**Modificar el layout del PDF:** + +Todo el diseño está en la función `pflores_build_cv_html()` dentro de `pdf-generator.php`. Modificar el CSS dentro de la variable `$css` o el HTML de cada sección. + +**Añadir una nueva sección al PDF** (ej: Premios): + +```php +// En pflores_build_cv_html(), después de certificaciones: +$awardsHtml = ''; +foreach ($awards as $a) { + $awardsHtml .= '
...'; +} + +// Y en el HTML final: +'

Premios y reconocimientos

' . $awardsHtml . +``` + +--- + +## 14. Archivo `.env` + +``` +WP_ENV=local +WP_HOST=0.0.0.0 +WP_PORT=8081 +WP_URL=http://192.168.222.40:8081 + +DB_NAME=paty.wordpress +DB_USER=paty.wordpress +DB_PASSWORD=paty.wordpress +DB_HOST=192.168.222.20 +DB_PREFIX=cv_ + +WP_ADMIN_USER=pflores +WP_ADMIN_PASSWORD=HXk4boxuI1QYum3jKL +``` + +--- + +## 15. Configuración `wp-config.php` clave + +```php +// Auto-updates DESACTIVADAS (protege archivos de temas y plugins locales) +define('AUTOMATIC_UPDATER_DISABLED', true); +define('WP_AUTO_UPDATE_CORE', false); + +// URL dinámica — funciona con cualquier IP o dominio, y detrás de proxy SSL (NPM) +$_wpIsHttps = /* detecta X-Forwarded-Proto: https */; +define('WP_HOME', $_wpProto . '://' . $_wpHost); +define('WP_SITEURL', $_wpProto . '://' . $_wpHost); +``` + +--- + +## 16. Convenciones de código + +| Elemento | Convención | +|----------|-----------| +| PHP | `declare(strict_types=1)` en todos los archivos | +| Funciones WordPress | Usar `esc_html()`, `esc_url()`, `esc_attr()` en toda salida HTML | +| Prefijos | Funciones y opciones siempre con prefijo del plugin/tema para evitar conflictos | +| Comentarios | Solo cuando el "por qué" no es obvio. Sin comentarios de "qué hace" | +| Serialización PHP en SQL | Generar con `php -r "echo serialize([...]);"` — nunca manual | +| Auto-updates WP | **Siempre desactivadas** — no tocar `wp-config.php` en ese bloque | + +--- + +## 17. Tareas comunes — referencia rápida + +### Verificar que todo funciona +```bash +curl -s http://127.0.0.1:8081/ | grep -c "Patricia Soledad" +# Debe retornar >= 1 +``` + +### Ver el tema activo +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "SELECT option_value FROM cv_options WHERE option_name='template';" 2>/dev/null +``` + +### Ver todos los datos del CV en BD +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "SELECT option_name, LENGTH(option_value) as bytes FROM cv_options WHERE option_name LIKE 'pflores_%' ORDER BY option_name;" 2>/dev/null +``` + +### Limpiar caché de WordPress (transients) +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "DELETE FROM cv_options WHERE option_name LIKE '_site_transient_%' OR option_name LIKE '_transient_%';" 2>/dev/null +``` + +### Verificar los 4 temas en un loop +```bash +for slug in persona-cv lumina apex-cv cvolio; do + mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "UPDATE cv_options SET option_value='$slug' WHERE option_name IN('template','stylesheet');" 2>/dev/null + sleep 0.4 + count=$(curl -s http://127.0.0.1:8081/ | grep -c "Patricia Soledad" || true) + echo "[$slug] Patricia aparece: $count veces" +done +# Restaurar: +mysql ... -e "UPDATE cv_options SET option_value='persona-cv' WHERE option_name IN('template','stylesheet');" +``` + +### Probar la descarga del PDF +```bash +curl -sI http://127.0.0.1:8081/?cv_pdf=1 | grep -E "Content-Type|Content-Disposition" +# Debe mostrar: application/pdf y attachment; filename="CV_Patricia_Flores_Sanchez.pdf" +``` + +### Comprobar PHP syntax de un tema +```bash +php -l /ruta/al/tema/front-page.php +php -l /ruta/al/tema/functions.php +``` + +--- + +## 18. Errores frecuentes y soluciones + +| Error | Causa probable | Solución | +|-------|---------------|----------| +| Página en blanco o "error crítico" | PHP fatal en el tema | Ver `debug.log`, buscar la línea del error | +| CSS sin cargar / página sin estilos | Mixed content (HTTP vs HTTPS) | Verificar `wp-config.php` — bloque de proxy SSL | +| CMB2 / plugin no carga | Serialización incorrecta en `active_plugins` | Regenerar con `php -r "echo serialize([...]);"` | +| `pflores_get_cv_data()` retorna vacío | Datos no guardados en BD | Re-ejecutar `populate-data.php?key=pflores2024` + limpiar caché | +| Apex-cv vacío o sin archivos | Tema apex-cv depende de directorio real, no symlink | Los archivos van en `wp-content/themes/apex-cv/`, no en `frontend/` | +| PDF vacío o error 500 | Chromium no encontrado o falla | `which chromium chromium-browser google-chrome` | +| `update_option` no guarda | Caché de WordPress | Limpiar transients (ver sección 17) | + +--- + +## 19. Acerca de los temas — resumen visual + +| Tema | Estilo | Layout | Fuente | Acento | +|------|--------|--------|--------|--------| +| `persona-cv` | Personage/Pixflow, secciones alternas | Full-width, nav sticky top | Raleway + Open Sans | Rojo `#c0392b` | +| `lumina` | Claro, moderno, alegre | Sidebar IZQUIERDO fijo | Plus Jakarta Sans | Teal `#0d9488` + Ámbar | +| `apex-cv` | Oscuro, serio, editorial | Sidebar IZQUIERDO fijo | Space Grotesk | Cian `#22d3ee` + Dorado | +| `cvolio` | Oscuro glassmorphism | Hero dividido + sidebar DERECHO | Manrope + Cormorant | Café/tostado | + +--- + +## 20. Notas importantes para la IA asistente + +1. **No usar ACF** (Advanced Custom Fields). Tiene Repeater solo en versión de pago. Usar CMB2. +2. **No instalar plugins de pago**. Todo debe ser 100 % gratuito. +3. **No tocar el bloque de auto-updates** en `wp-config.php`. +4. **Verificar serialización PHP** antes de cualquier `UPDATE` en `active_plugins` o similar. +5. **Limpiar caché** después de modificar datos en BD directamente. +6. **La foto de perfil** es `assets/images/patricia-flores-profile.jpeg` en cada tema — NO usar el placeholder SVG como defecto. +7. **El CV en docx** (`CV_Patricia_Flores_Sanchez_ES_FINAL.docx`) es solo para descarga — el contenido de la web se gestiona por CMB2. +8. **El PDF** se genera dinámicamente con Chromium desde `/?cv_pdf=1` — no hay PDF estático. +9. **Los 4 temas leen de CMB2** mediante `pflores_get_cv_data()`. Si esa función no existe (plugin inactivo), cada tema usa su propio fallback hardcodeado. +10. **Siempre verificar** con `curl -s http://127.0.0.1:8081/ | grep -c "Patricia Soledad"` que el sitio responde correctamente después de cualquier cambio. + +--- + +## 21. Git y Gitea — versionar y subir + +### Repositorio + +- **Remoto:** `https://gitea.linkedcorp.net/mgonzalez/pflores.linkedcorp.net.git` +- **Rama:** `main` +- **Credenciales:** archivo local `.token_gitea` (nunca versionado) + +### Flujo estándar de commit + push + +```bash +# 1. Revisar qué cambió +git status +git diff --stat + +# 2. Agregar archivos — SELECTIVO (nunca git add -A sin revisar) +git add frontend/ # temas propios +git add backend/wordpress/wp-content/plugins/pflores-cv-fields/ +git add backend/wordpress/wp-content/themes/apex-cv/ +git add backend/wordpress/wp-config.php +git add CHANGELOG.md VERSION README.md PROMPT_IA.md + +# 3. Confirmar que .env y .token_gitea NO están en staging +git status | grep -E "\.env|\.token" # debe retornar vacío + +# 4. Commit +git commit -m "tipo: descripción corta" +# Prefijos: feat: / fix: / docs: / chore: / style: + +# 5. Push +git push origin main +``` + +### Credenciales para push + +Al hacer `git push` por primera vez pedirá usuario y contraseña: +- **Usuario:** `mgonzalez` +- **Contraseña:** Personal Access Token (NO la contraseña web de Gitea) + +Crear token: `https://gitea.linkedcorp.net/user/settings/applications` + +Para no escribir credenciales cada vez: +```bash +git config credential.helper store +# La primera vez las guarda; las siguientes son automáticas +``` + +Guardar también en `.token_gitea` (local, nunca versionar): +```text +# Token gitea +usuario: mgonzalez +token: [token de gitea.linkedcorp.net] +``` + +### Qué SE versiona vs qué NO + +**SE versiona:** +- `frontend/` (todos los temas propios) +- `backend/wordpress/wp-content/plugins/pflores-cv-fields/` +- `backend/wordpress/wp-content/themes/apex-cv/` +- `backend/wordpress/wp-config.php` +- `backend/start-wordpress.sh`, `docs/`, `*.md`, `VERSION` +- `CV_Patricia_Flores_Sanchez_ES_FINAL.docx`, imágenes del CV + +**NO se versiona:** +- `.env`, `.token_gitea`, `LOCAL_DEPLOY_CONTEXT.md` +- WordPress core (`wp-admin/`, `wp-includes/`) +- Plugins de terceros (`cmb2/`, `wp-mail-smtp/`) +- Temas por defecto de WP (`twenty*/`) +- `wp-content/debug.log`, `uploads/`, `languages/` + +### Versionar antes de hacer push + +Ver `VERSIONADO.md` para decidir si subir `X`, `Y` o `Z`: +```bash +# Actualizar VERSION +echo "1.0.1" > VERSION + +# Anotar cambio en CHANGELOG.md +# Luego commit y push normal +``` diff --git a/README.md b/README.md index 38f43f1..6227325 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,89 @@ -# CVolio WP +# pflores.linkedcorp.net -Tema WordPress moderno para hoja de vida, preparado para pruebas locales en este directorio. +Sitio web de currículum ejecutivo de **Patricia Soledad Flores Sánchez** — Gerente / Jefa de Operaciones Financieras, sector financiero y microfinanzas. + +## Stack + +- **CMS:** WordPress 6.x (PHP 8.4, servidor PHP integrado) +- **Base de datos:** MariaDB en `192.168.222.20` +- **Campos del CV:** CMB2 (100 % gratuito, GPL) +- **PDF:** Chromium headless (`/?cv_pdf=1`) +- **Email:** WP Mail SMTP (configurable) +- **Deploy:** Debian 12 · Nginx Proxy Manager → `192.168.222.40:8081` +- **URL pública:** `https://pflores.linkedcorp.net` ## Estructura -- `frontend/cvfolio-theme`: tema editable. -- `backend/wordpress`: instalación local de WordPress. -- `docs/`: notas de instalación y uso. - -## Estado actual - -- WordPress descargado en local. -- Tema base responsive creado. -- Puerto sugerido preparado: `8081`. -- Pendiente para ejecución completa: extensiones PHP de WordPress y una base MariaDB/MySQL disponible. +``` +pflores.linkedcorp.net/ +├── frontend/ +│ ├── persona-cv-theme/ ← ACTIVO — Personage-style, rojo, timeline central +│ ├── lumina-cv-theme/ ← Claro, teal + ámbar, sidebar izquierdo +│ └── cvfolio-theme/ ← Oscuro, glassmorphism original +├── backend/ +│ ├── start-wordpress.sh +│ └── wordpress/ +│ ├── wp-config.php +│ └── wp-content/ +│ ├── plugins/pflores-cv-fields/ ← plugin propio: CMB2 + PDF +│ └── themes/apex-cv/ ← tema oscuro cian +├── docs/ +├── .env ← local, no versionado +├── .env.example +├── VERSION +├── CHANGELOG.md +├── PROMPT_IA.md ← guía completa para IA +└── README.md +``` ## Arranque rápido -1. Copia `.env.example` a `.env`. -2. Ajusta credenciales de base de datos. -3. Revisa `docs/instalacion-wordpress.md`. -4. Ejecuta `backend/start-wordpress.sh`. +```bash +# 1. Copiar variables de entorno +cp .env.example .env +# 2. Editar .env con credenciales reales +# 3. Arrancar el servidor WordPress +bash backend/start-wordpress.sh & +# 4. Abrir http://127.0.0.1:8081 +``` -## Git +El servidor escucha en `0.0.0.0:8081` (accesible desde la red local). -El repositorio fue inicializado localmente. Falta enlazar remoto si luego quieres subirlo a Gitea. +## Temas disponibles + +| Slug | Descripción | Estado | +|------|-------------|--------| +| `persona-cv` | Personage-style, rojo, secciones alternas, Raleway | **Activo** | +| `lumina` | Claro, teal+ámbar, sidebar izq., Plus Jakarta Sans | Disponible | +| `apex-cv` | Oscuro, cian eléctrico, sidebar fijo, Space Grotesk | Disponible | +| `cvolio` | Oscuro glassmorphism, café/tostado, Manrope | Disponible | + +Cambiar tema activo: +```bash +mysql -u "paty.wordpress" -p"paty.wordpress" -h 192.168.222.20 "paty.wordpress" --ssl=0 \ + -e "UPDATE cv_options SET option_value='SLUG' WHERE option_name IN('template','stylesheet');" +``` + +## Editar el CV + +Acceder al admin: `https://pflores.linkedcorp.net/wp-admin` +- Usuario: `pflores` +- Menú: **CV Patricia Flores** → sub-páginas por sección + +Los datos se almacenan en CMB2 (opciones de WordPress). Cada cambio se refleja automáticamente en la web y en el PDF descargable. + +## Descargar CV en PDF + +El PDF se genera dinámicamente con Chromium headless: +``` +GET /?cv_pdf=1 → descarga CV_Patricia_Flores_Sanchez.pdf +``` + +## Documentación relacionada + +- `PROMPT_IA.md` — guía completa para asistentes de IA y desarrolladores +- `DEPLOY_WEB.md` — pasos para versionar y desplegar +- `PRODUCCION.md` — estado del servidor de producción +- `VERSIONADO.md` — reglas de versiones +- `CHANGELOG.md` — historial de cambios +- `docs/instalacion-wordpress.md` — configuración local diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..3eefcb9 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.0 diff --git a/VERSIONADO.md b/VERSIONADO.md new file mode 100644 index 0000000..8f04d08 --- /dev/null +++ b/VERSIONADO.md @@ -0,0 +1,50 @@ +# Versionado — pflores.linkedcorp.net + +## Esquema: `X.Y.Z` + +| Nivel | Cuándo subirlo | +|-------|---------------| +| `X` | Rediseño completo, cambio de CMS, rotura de compatibilidad mayor | +| `Y` | Nuevo tema completo, nueva sección del CV, nuevo módulo funcional | +| `Z` | Correcciones visuales, ajuste de texto, nuevo campo, fix de bug | + +## Qué se versiona + +- `frontend/` — todos los temas WordPress propios +- `backend/wordpress/wp-content/plugins/pflores-cv-fields/` — plugin propio +- `backend/wordpress/wp-content/themes/apex-cv/` — tema en directorio real +- `backend/wordpress/wp-config.php` — sin credenciales (usa variables de entorno) +- `backend/start-wordpress.sh` +- `docs/` +- `README.md`, `PROMPT_IA.md`, `CHANGELOG.md`, `VERSION`, `VERSIONADO.md` +- `PRODUCCION.md`, `DEPLOY_WEB.md` +- `.env.example` +- `.gitignore` +- Archivos de assets del CV: `CV_Patricia_Flores_Sanchez_ES_FINAL.docx`, imágenes QR/perfil + +## Qué NO se versiona + +- `.env` — credenciales locales +- `.token_gitea` — token de acceso Gitea +- `backend/wordpress/wp-admin/` y `wp-includes/` — núcleo de WordPress +- `backend/wordpress/wp-content/plugins/cmb2/` — plugin de terceros descargado +- `backend/wordpress/wp-content/plugins/wp-mail-smtp/` — plugin de terceros +- `backend/wordpress/wp-content/themes/twenty*/` — temas por defecto +- `backend/wordpress/wp-content/uploads/` — media subida +- `backend/wordpress/wp-content/debug.log` +- `.DS_Store`, `.claude/` +- `LOCAL_DEPLOY_CONTEXT.md` — contexto local con credenciales + +## Checklist antes de cada commit + +1. `git status` — revisar qué se incluye +2. Verificar que `.env` y `.token_gitea` NO están en staging +3. Si hay cambios funcionales → actualizar `VERSION` y `CHANGELOG.md` +4. Mensaje de commit claro: `feat:`, `fix:`, `chore:`, `docs:` + +## Checklist antes de subir a Gitea (`git push`) + +1. Todo el checklist de commit cumplido +2. Site funcionando: `curl -s http://127.0.0.1:8081/ | grep -c "Patricia Soledad"` +3. PDF funcionando: `curl -sI http://127.0.0.1:8081/?cv_pdf=1 | grep Content-Type` +4. Ver `DEPLOY_WEB.md` para pasos completos diff --git a/backend/start-wordpress.sh b/backend/start-wordpress.sh index 513972d..7b13f99 100755 --- a/backend/start-wordpress.sh +++ b/backend/start-wordpress.sh @@ -17,9 +17,10 @@ WP_HOST="${WP_HOST:-127.0.0.1}" required_modules=("mysqli" "dom") missing_modules=() +php_modules="$(php -m | tr '[:upper:]' '[:lower:]')" for module in "${required_modules[@]}"; do - if ! php -m | grep -qi "^${module}$"; then + if ! printf '%s\n' "$php_modules" | grep -qx "$module"; then missing_modules+=("$module") fi done diff --git a/backend/wordpress/wp-config.php b/backend/wordpress/wp-config.php index 6d10f0e..088b4ea 100644 --- a/backend/wordpress/wp-config.php +++ b/backend/wordpress/wp-config.php @@ -25,11 +25,34 @@ define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); -if (getenv('WP_URL')) { - define('WP_HOME', getenv('WP_URL')); - define('WP_SITEURL', getenv('WP_URL')); +// Desactivar actualizaciones automáticas para proteger archivos de temas y plugins locales +define('AUTOMATIC_UPDATER_DISABLED', true); +define('WP_AUTO_UPDATE_CORE', false); + +// URL dinámica con soporte de reverse proxy (NPM, Nginx, Traefik…). +// NPM termina SSL y reenvía como HTTP, pero manda X-Forwarded-Proto: https. +$_wpIsHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') + || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') + || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'on'); + +// X-Forwarded-Host contiene el dominio público cuando hay proxy. +// Fallback a HTTP_HOST (que NPM también pasa correctamente). +$_wpHost = $_SERVER['HTTP_X_FORWARDED_HOST'] + ?? $_SERVER['HTTP_HOST'] + ?? '127.0.0.1:8081'; + +$_wpProto = $_wpIsHttps ? 'https' : 'http'; +define('WP_HOME', $_wpProto . '://' . $_wpHost); +define('WP_SITEURL', $_wpProto . '://' . $_wpHost); + +// Necesario para que WordPress confíe en el header del proxy +// y no entre en bucle de redirección HTTP→HTTPS. +if ($_wpIsHttps) { + $_SERVER['HTTPS'] = 'on'; } +unset($_wpIsHttps, $_wpHost, $_wpProto); + if (! defined('ABSPATH')) { define('ABSPATH', __DIR__ . '/'); } diff --git a/backend/wordpress/wp-content/plugins/pflores-cv-fields/pdf-generator.php b/backend/wordpress/wp-content/plugins/pflores-cv-fields/pdf-generator.php new file mode 100644 index 0000000..07450ca --- /dev/null +++ b/backend/wordpress/wp-content/plugins/pflores-cv-fields/pdf-generator.php @@ -0,0 +1,499 @@ + 500]); + } + + $cv = function_exists('pflores_get_cv_data') ? pflores_get_cv_data() : []; + $html = pflores_build_cv_html($cv); + $ts = time(); + $tmpDir = sys_get_temp_dir(); + $htmlFile = $tmpDir . '/cv_pf_' . $ts . '.html'; + $pdfFile = $tmpDir . '/cv_pf_' . $ts . '.pdf'; + + file_put_contents($htmlFile, $html); + + $cmd = escapeshellcmd($chromium) + . ' --headless --no-sandbox --disable-gpu' + . ' --run-all-compositor-stages-before-draw' + . ' --print-to-pdf=' . escapeshellarg($pdfFile) + . ' --print-to-pdf-no-header' + . ' "file://' . $htmlFile . '"' + . ' 2>/dev/null'; + + exec($cmd); + @unlink($htmlFile); + + if (! file_exists($pdfFile) || filesize($pdfFile) < 1024) { + @unlink($pdfFile); + wp_die('No se pudo generar el PDF.', 'Error PDF', ['response' => 500]); + } + + header('Content-Type: application/pdf'); + header('Content-Disposition: attachment; filename="CV_Patricia_Flores_Sanchez.pdf"'); + header('Content-Length: ' . filesize($pdfFile)); + header('Cache-Control: no-cache, no-store, must-revalidate'); + readfile($pdfFile); + @unlink($pdfFile); + exit; +} + +function pflores_find_chromium(): string +{ + foreach (['chromium', 'chromium-browser', 'google-chrome', 'google-chrome-stable'] as $bin) { + $path = trim((string) shell_exec('which ' . escapeshellarg($bin) . ' 2>/dev/null')); + if ($path !== '' && file_exists($path)) { + return $path; + } + } + return ''; +} + +/* ═══════════════════════════════════════════════════════════ + CONSTRUCTOR HTML — réplica fiel del DOCX + ═══════════════════════════════════════════════════════════ */ +function pflores_build_cv_html(array $cv): string +{ + /* ── datos ── */ + $hero = $cv['hero'] ?? []; + $metrics = $cv['metrics'] ?? []; + $highlights = $cv['highlights'] ?? []; + $summary = $cv['summary'] ?? []; + $impact = $cv['impact'] ?? []; + $experience = $cv['experience'] ?? []; + $education = $cv['education'] ?? []; + $certifications = $cv['certifications'] ?? []; + $competencies = $cv['competencies'] ?? []; + $volunteer = $cv['volunteer'] ?? []; + $additional = $cv['additional'] ?? []; + + $name = $hero['name'] ?? ''; + $role = $hero['role'] ?? ''; + $role2 = $hero['role2'] ?? ''; + $location = $hero['location'] ?? ''; + $email = $hero['email'] ?? ''; + $phone = $hero['phone'] ?? ''; + $linkedin = $hero['linkedin'] ?? ''; + $avail = $hero['availability'] ?? ''; + $focus = $hero['focus'] ?? ''; + $langs = $hero['languages'] ?? ''; + $web = $hero['web'] ?? ''; + $intro = $hero['intro'] ?? ''; + + /* ── helpers ── */ + $h = fn(string $s): string => htmlspecialchars($s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $nl = "\n"; + + /* ── estilos (replica el DOCX) ── */ + $css = ' +* { box-sizing: border-box; margin: 0; padding: 0; } + +@page { + size: A4; + margin: 16mm 18mm 16mm 18mm; +} + +body { + font-family: Arial, Helvetica, sans-serif; + font-size: 9pt; + color: #3A3A3A; + background: #ffffff; + line-height: 1.45; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +/* ── CABECERA ── */ +.cv-name { + font-size: 19pt; + font-weight: 700; + color: #1B3A5C; + line-height: 1.1; + margin-bottom: 3px; +} +.cv-role { + font-size: 10pt; + font-weight: 700; + color: #1B3A5C; + margin-bottom: 2px; +} +.cv-contact { + font-size: 8pt; + color: #666666; + margin-bottom: 10px; +} +.cv-contact span { margin: 0 4px; } + +/* ── SECCIONES ── */ +.sec { + margin-bottom: 10px; +} +.sec-title { + font-size: 10pt; + font-weight: 700; + color: #1B3A5C; + text-transform: uppercase; + letter-spacing: .04em; + border-bottom: 1.5px solid #1B3A5C; + padding-bottom: 2px; + margin-bottom: 6px; +} + +/* ── PERFIL ── */ +.profile-text { + font-size: 9pt; + color: #3A3A3A; + line-height: 1.55; + text-align: justify; +} + +/* ── EXPERIENCIA ── */ +.exp-item { margin-bottom: 8px; } +.exp-header { + display: flex; + justify-content: space-between; + align-items: baseline; +} +.exp-title { + font-size: 10pt; + font-weight: 700; + color: #1B3A5C; +} +.exp-period { + font-size: 9pt; + color: #3A3A3A; + font-style: italic; + white-space: nowrap; + margin-left: 8px; +} +.exp-company { + font-size: 9pt; + color: #666666; + margin-bottom: 3px; +} +.exp-desc { + font-size: 9pt; + color: #3A3A3A; + margin-bottom: 3px; + font-style: italic; +} +.exp-bullets { + margin: 0; + padding-left: 0; + list-style: none; +} +.exp-bullets li { + font-size: 9pt; + color: #3A3A3A; + padding-left: 12px; + position: relative; + margin-bottom: 2px; + line-height: 1.45; + text-align: justify; +} +.exp-bullets li::before { + content: "•"; + position: absolute; + left: 0; + color: #1B3A5C; + font-weight: 700; +} + +/* ── FORMACIÓN ── */ +.edu-item { + margin-bottom: 6px; + display: flex; + justify-content: space-between; + align-items: flex-start; +} +.edu-left { flex: 1; } +.edu-degree { + font-size: 9pt; + font-weight: 700; + color: #1B3A5C; +} +.edu-institution { + font-size: 8pt; + color: #666666; + margin-top: 1px; +} +.edu-detail { + font-size: 8pt; + color: #666666; + font-style: italic; + margin-top: 1px; +} +.edu-year { + font-size: 9pt; + font-weight: 700; + color: #1B3A5C; + white-space: nowrap; + margin-left: 8px; +} + +/* ── CERTIFICACIONES ── */ +.cert-item { + display: flex; + justify-content: space-between; + font-size: 8pt; + color: #3A3A3A; + margin-bottom: 2.5px; + line-height: 1.4; +} +.cert-title { flex: 1; padding-right: 8px; } +.cert-year { color: #1B3A5C; font-weight: 700; white-space: nowrap; } + +/* ── COMPETENCIAS ── */ +.comp-line { + font-size: 9pt; + color: #3A3A3A; + margin-bottom: 3px; + line-height: 1.45; +} +.comp-line strong { color: #1B3A5C; } + +/* ── VOLUNTARIADO / ADICIONAL ── */ +.vol-header { + display: flex; + justify-content: space-between; + align-items: baseline; +} +.vol-title { font-size: 9pt; font-weight: 700; color: #1B3A5C; } +.vol-year { font-size: 9pt; font-weight: 700; color: #1B3A5C; } +.vol-body { font-size: 9pt; color: #3A3A3A; line-height: 1.45; margin-top: 1px; } + +.add-line { + font-size: 9pt; + color: #3A3A3A; + margin-bottom: 2px; +} +.add-line strong { color: #1B3A5C; } + +.cv-footer-line { + font-size: 8pt; + color: #999999; + text-align: right; + margin-top: 8px; + border-top: .5px solid #dddddd; + padding-top: 4px; +} +'; + + /* ═══════════ SECCIÓN: PERFIL PROFESIONAL ═══════════ */ + + // Combina intro + summary (como el DOCX) + $summaryBody = $summary['body'] ?? ''; + $profileFull = trim($intro); + if ($summaryBody && $summaryBody !== $intro) { + // Evitar duplicar si intro ya contiene el resumen + if (strpos($profileFull, substr($summaryBody, 0, 30)) === false) { + $profileFull .= ' ' . $summaryBody; + } + } + + /* ═══════════ SECCIÓN: EXPERIENCIA ═══════════ */ + $expHtml = ''; + foreach ($experience as $job) { + $expHtml .= '
'; + $expHtml .= '
'; + $expHtml .= '' . $h($job['title'] ?? '') . ''; + $expHtml .= '' . $h($job['period'] ?? '') . ''; + $expHtml .= '
'; + + $company = $h($job['company'] ?? ''); + $loc = $h($job['location'] ?? ''); + if ($company || $loc) { + $expHtml .= '

' . $company . ($loc ? '  |  ' . $loc : '') . '

'; + } + + if (! empty($job['lead'])) { + $expHtml .= '

' . $h($job['lead']) . '

'; + } + + if (! empty($job['bullets'])) { + $expHtml .= '
    '; + foreach ($job['bullets'] as $bullet) { + $expHtml .= '
  • ' . $h($bullet) . '
  • '; + } + $expHtml .= '
'; + } + $expHtml .= '
'; + } + + /* ═══════════ SECCIÓN: FORMACIÓN ═══════════ */ + $eduHtml = ''; + foreach ($education as $edu) { + $eduHtml .= '
'; + $eduHtml .= '
'; + $eduHtml .= '

' . $h($edu['title'] ?? '') . '

'; + $eduHtml .= '

' . $h($edu['institution'] ?? '') . '

'; + if (! empty($edu['detail'])) { + $eduHtml .= '

' . $h($edu['detail']) . '

'; + } + $eduHtml .= '
'; + $eduHtml .= '' . $h($edu['year'] ?? '') . ''; + $eduHtml .= '
'; + } + + /* ═══════════ SECCIÓN: CERTIFICACIONES ═══════════ */ + $certHtml = ''; + foreach ($certifications as $cert) { + $title = $h($cert['title'] ?? ''); + $issuer = $h($cert['issuer'] ?? ''); + $year = $h($cert['year'] ?? ''); + $certHtml .= '
'; + $certHtml .= '' . $title . ($issuer ? ' — ' . $issuer : '') . ''; + $certHtml .= '' . $year . ''; + $certHtml .= '
'; + } + + /* ═══════════ SECCIÓN: COMPETENCIAS ═══════════ */ + $compHtml = ''; + foreach ($competencies as $groupName => $items) { + $skills = []; + foreach ($items as $item) { + $skills[] = is_array($item) ? ($item['name'] ?? '') : (string) $item; + } + $skillsStr = implode(' · ', array_filter($skills)); + $compHtml .= '

' . $h($groupName) . ':  ' . $h($skillsStr) . '

'; + } + + /* ═══════════ SECCIÓN: VOLUNTARIADO ═══════════ */ + $volHtml = ''; + if (! empty($volunteer['title'])) { + $volHtml .= '
'; + $volHtml .= '' . $h($volunteer['title']) . ''; + $volHtml .= '' . $h($volunteer['year'] ?? '') . ''; + $volHtml .= '
'; + if (! empty($volunteer['body'])) { + $volHtml .= '

' . $h($volunteer['body']) . '

'; + } + } + + /* ═══════════ SECCIÓN: INFORMACIÓN ADICIONAL ═══════════ */ + $addHtml = ''; + $addLines = [ + 'Idiomas' => $langs, + 'Disponibilidad' => $avail, + 'Enfoque' => $focus, + ]; + // Añadir los del array additional filtrando redundancias + foreach ($additional as $k => $v) { + if ($v !== '' && ! in_array($k, ['Disponibilidad', 'Idiomas'], true)) { + $addLines[$k] = $v; + } + } + foreach ($addLines as $k => $v) { + if ($v === '') continue; + $addHtml .= '

' . $h($k) . ': ' . $h($v) . '

'; + } + if ($web) { + $addHtml .= '

Web: ' . $h($web) . '

'; + } + + /* ═══════════ LÍNEA DE CONTACTO (cabecera) ═══════════ */ + $contactParts = []; + if ($email) $contactParts[] = 'Correo: ' . $email; + if ($phone) $contactParts[] = 'Tel.: ' . $phone; + if ($linkedin) { + // Mostrar URL limpia sin https://www. + $lnDisplay = preg_replace('#^https?://(www\.)?#', '', urldecode($linkedin)); + $contactParts[] = 'LinkedIn: ' . $lnDisplay; + } + if ($location) $contactParts[] = $location; + $contactLine = implode(' | ', $contactParts); + + /* ═══════════ TÍTULO del documento ═══════════ */ + $fullRole = $role . ($role2 ? ' | ' . $role2 : ''); + $year = gmdate('Y'); + + /* ═══════════ HTML COMPLETO ═══════════ */ + return ' + + + +CV — ' . $h($name) . ' + + + + + +

' . $h($name) . '

+

' . $h($fullRole) . '

+

' . $h($contactLine) . '

+ + +
+

Perfil profesional

+

' . $h($profileFull) . '

+
+ + +
+

Experiencia profesional

+ ' . $expHtml . ' +
+ + +
+

Formación académica

+ ' . $eduHtml . ' +
+ + +
+

Certificaciones relevantes

+ ' . $certHtml . ' +
+ + +' . ($compHtml ? '
+

Competencias clave

+ ' . $compHtml . ' +
' : '') . ' + + +' . ($volHtml ? '
+

Voluntariado

+ ' . $volHtml . ' +
' : '') . ' + + +' . ($addHtml ? '
+

Información adicional

+ ' . $addHtml . ' +
' : '') . ' + + + + +'; +} diff --git a/backend/wordpress/wp-content/plugins/pflores-cv-fields/pflores-cv-fields.php b/backend/wordpress/wp-content/plugins/pflores-cv-fields/pflores-cv-fields.php new file mode 100644 index 0000000..7192630 --- /dev/null +++ b/backend/wordpress/wp-content/plugins/pflores-cv-fields/pflores-cv-fields.php @@ -0,0 +1,350 @@ + 'pflores_perfil', + 'title' => 'Perfil y contacto', + 'object_types' => ['options-page'], + 'option_key' => 'pflores_perfil', + 'menu_title' => 'CV Patricia Flores', + 'icon_url' => 'dashicons-id-alt', + 'position' => 3, + 'save_button' => 'Guardar cambios', + 'capability' => 'manage_options', + ]); + + $perfil->add_field(['id' => 'pf_name', 'name' => 'Nombre completo', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_role', 'name' => 'Cargo principal', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_role2', 'name' => 'Sector / subtítulo', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_intro', 'name' => 'Introducción', 'type' => 'textarea', 'attributes' => ['rows' => 4]]); + $perfil->add_field(['id' => 'pf_summary_title', 'name' => 'Título del perfil', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_summary_body', 'name' => 'Resumen profesional', 'type' => 'textarea', 'attributes' => ['rows' => 5]]); + $perfil->add_field(['id' => 'pf_location', 'name' => 'Ubicación', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_email', 'name' => 'Correo electrónico', 'type' => 'text_email']); + $perfil->add_field(['id' => 'pf_phone', 'name' => 'Teléfono', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_linkedin', 'name' => 'LinkedIn URL', 'type' => 'text_url']); + $perfil->add_field(['id' => 'pf_availability', 'name' => 'Disponibilidad', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_focus', 'name' => 'Enfoque profesional', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_languages', 'name' => 'Idiomas', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_photo', 'name' => 'Foto de perfil', 'type' => 'file', 'options' => ['url' => false], 'text' => ['add_upload_file_text' => 'Seleccionar foto']]); + $perfil->add_field(['id' => 'pf_born', 'name' => 'Fecha de nacimiento', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_ci', 'name' => 'Cédula de identidad', 'type' => 'text']); + $perfil->add_field(['id' => 'pf_web', 'name' => 'Web profesional', 'type' => 'text']); + + /* ── EXPERIENCIA ── */ + $exp = new_cmb2_box([ + 'id' => 'pflores_experiencia', + 'title' => 'Experiencia profesional', + 'object_types' => ['options-page'], + 'option_key' => 'pflores_experiencia', + 'parent_slug' => 'pflores_perfil', + 'menu_title' => 'Experiencia', + 'save_button' => 'Guardar cambios', + 'capability' => 'manage_options', + ]); + + $exp_group = $exp->add_field([ + 'id' => 'pf_experience', + 'type' => 'group', + 'description' => 'Cargos del más reciente al más antiguo', + 'options' => [ + 'group_title' => 'Cargo {#}', + 'add_button' => 'Añadir cargo', + 'remove_button' => 'Eliminar cargo', + 'sortable' => true, + 'closed' => true, + ], + ]); + + $exp->add_group_field($exp_group, ['id' => 'period', 'name' => 'Período (ej: Abr. 2022 – Presente)', 'type' => 'text']); + $exp->add_group_field($exp_group, ['id' => 'title', 'name' => 'Cargo', 'type' => 'text']); + $exp->add_group_field($exp_group, ['id' => 'company', 'name' => 'Institución / Empresa', 'type' => 'text']); + $exp->add_group_field($exp_group, ['id' => 'location', 'name' => 'Lugar', 'type' => 'text']); + $exp->add_group_field($exp_group, ['id' => 'lead', 'name' => 'Descripción breve', 'type' => 'textarea_small']); + $exp->add_group_field($exp_group, [ + 'id' => 'bullets_text', + 'name' => 'Logros y actividades', + 'type' => 'textarea', + 'description' => 'Un punto por línea. Sin guiones ni asteriscos.', + 'attributes' => ['rows' => 8], + ]); + + /* ── FORMACIÓN Y CERTIFICACIONES ── */ + $form = new_cmb2_box([ + 'id' => 'pflores_formacion', + 'title' => 'Formación y certificaciones', + 'object_types' => ['options-page'], + 'option_key' => 'pflores_formacion', + 'parent_slug' => 'pflores_perfil', + 'menu_title' => 'Formación', + 'save_button' => 'Guardar cambios', + 'capability' => 'manage_options', + ]); + + $edu_group = $form->add_field([ + 'id' => 'pf_education', + 'type' => 'group', + 'options' => ['group_title' => 'Título {#}', 'add_button' => 'Añadir título', 'remove_button' => 'Eliminar', 'sortable' => true, 'closed' => true], + ]); + $form->add_group_field($edu_group, ['id' => 'year', 'name' => 'Año', 'type' => 'text', 'attributes' => ['size' => 6]]); + $form->add_group_field($edu_group, ['id' => 'title', 'name' => 'Título', 'type' => 'text']); + $form->add_group_field($edu_group, ['id' => 'institution', 'name' => 'Institución','type' => 'text']); + $form->add_group_field($edu_group, ['id' => 'detail', 'name' => 'Detalle / Nota de reconocimiento', 'type' => 'textarea_small']); + + $cert_group = $form->add_field([ + 'id' => 'pf_certifications', + 'type' => 'group', + 'description' => 'Certificaciones relevantes', + 'options' => ['group_title' => 'Certificación {#}', 'add_button' => 'Añadir certificación', 'remove_button' => 'Eliminar', 'sortable' => true, 'closed' => true], + ]); + $form->add_group_field($cert_group, ['id' => 'year', 'name' => 'Año', 'type' => 'text', 'attributes' => ['size' => 6]]); + $form->add_group_field($cert_group, ['id' => 'title', 'name' => 'Título', 'type' => 'text']); + $form->add_group_field($cert_group, ['id' => 'issuer', 'name' => 'Emisor', 'type' => 'text']); + + /* ── COMPETENCIAS ── */ + $comp = new_cmb2_box([ + 'id' => 'pflores_competencias', + 'title' => 'Competencias y habilidades', + 'object_types' => ['options-page'], + 'option_key' => 'pflores_competencias', + 'parent_slug' => 'pflores_perfil', + 'menu_title' => 'Competencias', + 'save_button' => 'Guardar cambios', + 'capability' => 'manage_options', + ]); + + $comp_group = $comp->add_field([ + 'id' => 'pf_competencies', + 'type' => 'group', + 'options' => ['group_title' => 'Grupo {#}', 'add_button' => 'Añadir grupo', 'remove_button' => 'Eliminar', 'sortable' => true, 'closed' => true], + ]); + $comp->add_group_field($comp_group, ['id' => 'group_name', 'name' => 'Nombre del grupo (ej: Finanzas y Operaciones)', 'type' => 'text']); + $comp->add_group_field($comp_group, [ + 'id' => 'skills_text', + 'name' => 'Habilidades', + 'type' => 'textarea', + 'description' => 'Una por línea. Formato: Nombre de la habilidad|85 (el número es el porcentaje 0-100).', + 'attributes' => ['rows' => 7], + ]); + + /* ── MÉTRICAS, IMPACTO Y EXTRAS ── */ + $extra = new_cmb2_box([ + 'id' => 'pflores_extras', + 'title' => 'Métricas, impacto y datos adicionales', + 'object_types' => ['options-page'], + 'option_key' => 'pflores_extras', + 'parent_slug' => 'pflores_perfil', + 'menu_title' => 'Métricas / Impacto', + 'save_button' => 'Guardar cambios', + 'capability' => 'manage_options', + ]); + + $metrics_group = $extra->add_field([ + 'id' => 'pf_metrics', + 'type' => 'group', + 'description' => 'Contadores principales del héroe', + 'options' => ['group_title' => 'Métrica {#}', 'add_button' => 'Añadir métrica', 'remove_button' => 'Eliminar', 'sortable' => true, 'closed' => false], + ]); + $extra->add_group_field($metrics_group, ['id' => 'value', 'name' => 'Valor (ej: 22+, USD 5 M)', 'type' => 'text']); + $extra->add_group_field($metrics_group, ['id' => 'suffix', 'name' => 'Sufijo (opcional)', 'type' => 'text', 'attributes' => ['size' => 8]]); + $extra->add_group_field($metrics_group, ['id' => 'label', 'name' => 'Etiqueta descriptiva', 'type' => 'text']); + + $hl_group = $extra->add_field([ + 'id' => 'pf_highlights', + 'type' => 'group', + 'description' => 'Logros destacados con número grande', + 'options' => ['group_title' => 'Logro {#}', 'add_button' => 'Añadir logro', 'remove_button' => 'Eliminar', 'sortable' => true, 'closed' => false], + ]); + $extra->add_group_field($hl_group, ['id' => 'value', 'name' => 'Valor (ej: 74 %, 9/10)', 'type' => 'text']); + $extra->add_group_field($hl_group, ['id' => 'suffix', 'name' => 'Sufijo (opcional)', 'type' => 'text', 'attributes' => ['size' => 8]]); + $extra->add_group_field($hl_group, ['id' => 'label', 'name' => 'Descripción', 'type' => 'text']); + + $impact_group = $extra->add_field([ + 'id' => 'pf_impact', + 'type' => 'group', + 'description' => 'Áreas de impacto ejecutivo', + 'options' => ['group_title' => 'Impacto {#}', 'add_button' => 'Añadir área', 'remove_button' => 'Eliminar', 'sortable' => true, 'closed' => false], + ]); + $extra->add_group_field($impact_group, ['id' => 'title', 'name' => 'Título', 'type' => 'text']); + $extra->add_group_field($impact_group, ['id' => 'body', 'name' => 'Descripción', 'type' => 'textarea_small']); + + $extra->add_field(['id' => 'pf_volunteer_title', 'name' => 'Voluntariado — Título', 'type' => 'text']); + $extra->add_field(['id' => 'pf_volunteer_year', 'name' => 'Voluntariado — Año', 'type' => 'text', 'attributes' => ['size' => 8]]); + $extra->add_field(['id' => 'pf_volunteer_body', 'name' => 'Voluntariado — Descripción', 'type' => 'textarea_small']); +} + +/* ───────────────────────────────────────────── + 2. FUNCIÓN CENTRAL — lee de CMB2 +────────────────────────────────────────────── */ +function pflores_get_cv_data(): array +{ + if (! function_exists('cmb2_get_option')) { + return pflores_cv_fallback_data(); + } + + $perfil = get_option('pflores_perfil', []); + $experiencia = get_option('pflores_experiencia', []); + $formacion = get_option('pflores_formacion', []); + $competencias = get_option('pflores_competencias', []); + $extras = get_option('pflores_extras', []); + + // ── Experiencia ── + $experience = []; + foreach ((array) ($experiencia['pf_experience'] ?? []) as $job) { + $bullets = array_values(array_filter( + array_map('trim', explode("\n", (string) ($job['bullets_text'] ?? ''))) + )); + $experience[] = [ + 'period' => $job['period'] ?? '', + 'title' => $job['title'] ?? '', + 'company' => $job['company'] ?? '', + 'location' => $job['location'] ?? '', + 'lead' => $job['lead'] ?? '', + 'bullets' => $bullets, + ]; + } + + // ── Educación ── + $education = []; + foreach ((array) ($formacion['pf_education'] ?? []) as $edu) { + $education[] = [ + 'year' => $edu['year'] ?? '', + 'title' => $edu['title'] ?? '', + 'institution' => $edu['institution'] ?? '', + 'detail' => $edu['detail'] ?? '', + ]; + } + + // ── Certificaciones ── + $certifications = []; + foreach ((array) ($formacion['pf_certifications'] ?? []) as $cert) { + $certifications[] = [ + 'year' => $cert['year'] ?? '', + 'title' => $cert['title'] ?? '', + 'issuer' => $cert['issuer'] ?? '', + ]; + } + + // ── Competencias (nombre|porcentaje) ── + $competencies = []; + foreach ((array) ($competencias['pf_competencies'] ?? []) as $group) { + $groupName = $group['group_name'] ?? ''; + if ($groupName === '') { + continue; + } + $skills = []; + foreach (array_filter(array_map('trim', explode("\n", (string) ($group['skills_text'] ?? '')))) as $line) { + $parts = explode('|', $line, 2); + $skills[] = ['name' => trim($parts[0]), 'pct' => isset($parts[1]) ? (int) trim($parts[1]) : 80]; + } + $competencies[$groupName] = $skills; + } + + // ── Métricas ── + $metrics = []; + foreach ((array) ($extras['pf_metrics'] ?? []) as $m) { + $metrics[] = ['value' => $m['value'] ?? '', 'suffix' => $m['suffix'] ?? '', 'label' => $m['label'] ?? '']; + } + + // ── Highlights ── + $highlights = []; + foreach ((array) ($extras['pf_highlights'] ?? []) as $h) { + $highlights[] = ['value' => $h['value'] ?? '', 'suffix' => $h['suffix'] ?? '', 'label' => $h['label'] ?? '']; + } + + // ── Impacto ── + $impact = []; + foreach ((array) ($extras['pf_impact'] ?? []) as $item) { + $impact[] = ['title' => $item['title'] ?? '', 'body' => $item['body'] ?? '']; + } + + // ── Foto (CMB2 file field devuelve ID; obtenemos la URL) ── + $photoId = $perfil['pf_photo'] ?? ''; + $photoUrl = $photoId ? (string) wp_get_attachment_url((int) $photoId) : ''; + + return [ + 'hero' => [ + 'eyebrow' => 'Currículum ejecutivo', + 'name' => $perfil['pf_name'] ?? '', + 'role' => $perfil['pf_role'] ?? '', + 'role2' => $perfil['pf_role2'] ?? '', + 'intro' => $perfil['pf_intro'] ?? '', + 'location' => $perfil['pf_location'] ?? '', + 'email' => $perfil['pf_email'] ?? '', + 'phone' => $perfil['pf_phone'] ?? '', + 'linkedin' => $perfil['pf_linkedin'] ?? '', + 'availability' => $perfil['pf_availability'] ?? '', + 'focus' => $perfil['pf_focus'] ?? '', + 'languages' => $perfil['pf_languages'] ?? '', + 'born' => $perfil['pf_born'] ?? '', + 'id' => $perfil['pf_ci'] ?? '', + 'web' => $perfil['pf_web'] ?? '', + ], + 'photo' => $photoUrl, + 'metrics' => $metrics, + 'highlights' => $highlights, + 'summary' => [ + 'title' => $perfil['pf_summary_title'] ?? '', + 'body' => $perfil['pf_summary_body'] ?? '', + ], + 'impact' => $impact, + 'experience' => $experience, + 'education' => $education, + 'certifications' => $certifications, + 'competencies' => $competencies, + 'volunteer' => [ + 'title' => $extras['pf_volunteer_title'] ?? '', + 'year' => $extras['pf_volunteer_year'] ?? '', + 'body' => $extras['pf_volunteer_body'] ?? '', + ], + 'additional' => [ + 'Idiomas' => $perfil['pf_languages'] ?? '', + 'Disponibilidad' => $perfil['pf_availability'] ?? '', + 'C.I.' => $perfil['pf_ci'] ?? '', + 'Fecha de nacimiento' => $perfil['pf_born'] ?? '', + 'Web profesional' => $perfil['pf_web'] ?? '', + ], + ]; +} + +/* ───────────────────────────────────────────── + 3. FALLBACK si CMB2 no está activo +────────────────────────────────────────────── */ +function pflores_cv_fallback_data(): array +{ + return [ + 'hero' => ['eyebrow' => 'Currículum ejecutivo', 'name' => 'Patricia Soledad Flores Sánchez', 'role' => 'Gerente / Jefa de Operaciones Financieras', 'role2' => 'Sector financiero y microfinanzas', 'intro' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas.', 'location' => 'Loja, Ecuador', 'email' => 'patricflorsanchez@gmail.com', 'phone' => '+593 99 469 8405', 'linkedin' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/', 'availability' => 'Inmediata | Presencial / Híbrida / Remota', 'focus' => 'Operaciones financieras, control interno y transformación digital', 'languages' => 'Español nativo | Inglés básico en formación activa', 'born' => '3 de agosto de 1980', 'id' => '1103591648', 'web' => 'pflores.linkedcorp.net'], + 'photo' => '', + 'metrics' => [], + 'highlights' => [], + 'summary' => ['title' => '', 'body' => ''], + 'impact' => [], + 'experience' => [], + 'education' => [], + 'certifications' => [], + 'competencies' => [], + 'volunteer' => ['title' => '', 'year' => '', 'body' => ''], + 'additional' => [], + ]; +} diff --git a/backend/wordpress/wp-content/plugins/pflores-cv-fields/populate-data.php b/backend/wordpress/wp-content/plugins/pflores-cv-fields/populate-data.php new file mode 100644 index 0000000..84123c7 --- /dev/null +++ b/backend/wordpress/wp-content/plugins/pflores-cv-fields/populate-data.php @@ -0,0 +1,187 @@ + 'Patricia Soledad Flores Sánchez', + 'pf_role' => 'Gerente / Jefa de Operaciones Financieras', + 'pf_role2' => 'Sector financiero y microfinanzas', + 'pf_intro' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas. Máster en Dirección y Planificación Financiera, reconocido por la SENECYT en Ecuador, con especialización en gestión operativa, transformación digital de procesos, control interno y liderazgo de equipos multidisciplinarios.', + 'pf_summary_title' => 'Perfil estratégico con enfoque en eficiencia, control y ejecución sostenible', + 'pf_summary_body' => 'Actualmente lidera la operatividad de 26 agencias a nivel nacional y coordina aproximadamente 1.500 operaciones de microcrédito mensuales, por un monto cercano a USD 5 millones. También articula la recaudación de cerca de 28.000 clientes por canales internos y externos, integrando visión operativa, criterio financiero, disciplina de control y liderazgo sostenido del desempeño.', + 'pf_location' => 'Loja, Ecuador', + 'pf_email' => 'patricflorsanchez@gmail.com', + 'pf_phone' => '+593 99 469 8405', + 'pf_linkedin' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/', + 'pf_availability' => 'Inmediata | Presencial / Híbrida / Remota', + 'pf_focus' => 'Operaciones financieras, control interno y transformación digital', + 'pf_languages' => 'Español nativo | Inglés básico en formación activa', + 'pf_born' => '3 de agosto de 1980', + 'pf_ci' => '1103591648', + 'pf_web' => 'pflores.linkedcorp.net', + 'pf_photo' => '', +]); +$ok[] = '✓ Perfil y contacto (17 campos)'; + +/* ════════════════════════════════════════════ + EXPERIENCIA → option: pflores_experiencia +════════════════════════════════════════════ */ +update_option('pflores_experiencia', [ + 'pf_experience' => [ + [ + 'period' => 'Abr. 2022 – Presente', + 'title' => 'Jefa de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Responsable del desempeño operativo nacional, cumplimiento del POA, control interno, digitalización de procesos y gestión de equipos.', + 'bullets_text' => + "Cumplimiento del POA: 98 % (Q2 2025), 96 % (Q3 2025), 100 % (Q4 2025) y 105 % (Q1 2026).\n" . + "La transformación digital logró que los desembolsos por transferencia representen el 47,80 % del monto total en Q1 2026.\n" . + "Redujo los requerimientos de soporte desde Dirección en un 74 %, de 1.489 a 382, mediante la descentralización de procesos hacia las agencias.\n" . + "Automatizó el proceso del seguro de desgravamen con cálculo de prima, conciliación mensual, liquidación de siniestros y asientos contables automatizados.\n" . + "Elevó el índice de cumplimiento operativo nacional del 65 % al 88 % con la matriz de supervisión y certificación por agencia.\n" . + "Redujo el tiempo de atención del seguro de desgravamen de 17 a 10 días.\n" . + "Redujo los tiempos de desembolso a 1,68 días en Q3 2025, mejor resultado del año frente a la meta institucional máxima de 2 días.\n" . + "La efectividad de recuperación de mora alcanzó 90,60 % en Q1 2026, con USD 3,06 millones recuperados sobre USD 3,37 millones en mora.\n" . + "Redujo el índice de rotación del área del 41,46 % al 10,24 % entre diciembre de 2022 y marzo de 2026 mediante mejoras salariales, remuneración variable, evaluación trimestral y un plan de carrera con certificación de 60 horas para asistentes de caja.\n" . + "Participa en comités estratégicos, auditorías internas y externas, y en representación institucional ante organismos financieros internacionales de desarrollo.", + ], + [ + 'period' => 'Feb. 2021 – Mar. 2022', + 'title' => 'Supervisora de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Supervisó operaciones de 18 agencias a nivel nacional y regularizó procesos críticos inexistentes o incompletos.', + 'bullets_text' => + "Reconstruyó desde cero las bases de cálculo del seguro de desgravamen y regularizó pagos pendientes desde enero de 2021.\n" . + "Elaboró el instructivo de constitución de garantías hipotecarias, proceso que no existía previamente en la institución.\n" . + "Inició el proyecto de automatización de pagos por depósitos y transferencias.", + ], + [ + 'period' => '2019 – 2021', + 'title' => 'Actualización y formación profesional', + 'company' => 'Formación independiente', + 'location' => 'Ecuador', + 'lead' => 'Etapa enfocada en fortalecimiento técnico y actualización profesional tras su salida de Mutualista Pichincha.', + 'bullets_text' => "SAP FI (30 h).\nExcel Empresarial (24 h).\nPrevención de Lavado de Activos — UAFE (5 h).", + ], + [ + 'period' => 'Ago. 2004 – May. 2019', + 'title' => 'Oficial Operativa Regional / Jefa Operativa', + 'company' => 'Mutualista Pichincha', + 'location' => 'Loja, Ecuador', + 'lead' => 'Trayectoria ascendente de 15 años desde Cajera hasta Jefa Operativa Regional.', + 'bullets_text' => + "Reconocida a nivel nacional por excelencia en control operativo.\n" . + "La agencia se mantuvo consistentemente por encima del 80 % en gestión de excepciones de crédito hipotecario.\n" . + "Administró proyecto inmobiliario institucional en Loja.\n" . + "Gestionó alertas ALA/FT con 100 % de cumplimiento en comités trimestrales y auditorías internas sin observaciones significativas de forma sostenida.", + ], + [ + 'period' => 'Ene. 2002 – Nov. 2003', + 'title' => 'Cajera', + 'company' => 'Cooperativa de Ahorro y Crédito El Porvenir', + 'location' => 'Loja, Ecuador', + 'lead' => 'Inicio de carrera en el frente operativo financiero con disciplina de caja y apoyo contable.', + 'bullets_text' => + "Gestión de caja sin faltantes ni sobrantes.\n" . + "Contrato renovado de forma anticipada a los tres meses.\n" . + "Apoyo al área de Contabilidad y reemplazo temporal de la contadora durante vacaciones.", + ], + ], +]); +$ok[] = '✓ Experiencia (5 cargos, 23 bullets)'; + +/* ════════════════════════════════════════════ + FORMACIÓN Y CERTIFICACIONES → pflores_formacion +════════════════════════════════════════════ */ +update_option('pflores_formacion', [ + 'pf_education' => [ + ['year' => '2021', 'title' => 'Máster Universitario en Dirección y Planificación Financiera', 'institution' => 'Universidad Europea Miguel de Cervantes — Valladolid, España', 'detail' => 'Título reconocido por la SENECYT — Ecuador, febrero de 2023 | Reg. 2021/394270.'], + ['year' => '2007', 'title' => 'Ingeniera en Administración en Banca y Finanzas', 'institution' => 'Universidad Técnica Particular de Loja (UTPL)', 'detail' => ''], + ], + 'pf_certifications' => [ + ['year' => '2026', 'title' => 'Mujeres que Lideran: Alta Gerencia', 'issuer' => 'Foro UNIR — Universidad Internacional de La Rioja'], + ['year' => '2025', 'title' => 'Programa Internacional de Habilidades Gerenciales (48 h)', 'issuer' => 'IDEASGROUP — Ecuador / México'], + ['year' => '2025', 'title' => 'Transforma tu Trabajo con Inteligencia Artificial (12 h)', 'issuer' => 'Red de Instituciones Financieras de Desarrollo'], + ['year' => '2025', 'title' => 'Excel: Básico a Dashboard (40 h)', 'issuer' => 'DMARURI Training & Consulting'], + ['year' => '2024', 'title' => 'Administración por Procesos — BPM (64 h)', 'issuer' => 'Escuela Politécnica Nacional — CEC'], + ['year' => '2023', 'title' => 'Formación de Formadores (80 h)', 'issuer' => 'Ministerio del Trabajo del Ecuador | Certificación vigente hasta 2028'], + ['year' => '2023', 'title' => 'Power BI (40 h) | Indicadores Clave de Desempeño — KPI (12 h)', 'issuer' => 'Liderazgo Capacitación & Eventos'], + ['year' => '2020', 'title' => 'Gestión Financiera ERP SAP FI — Key User (30 h)', 'issuer' => 'Socio SAP certificado'], + ['year' => '2020', 'title' => 'Prevención de Lavado de Activos y Financiamiento de Delitos', 'issuer' => 'UAFE — Ecuador'], + ['year' => '2013', 'title' => 'Tributación Integral (36 h)', 'issuer' => 'Universidad Técnica Particular de Loja'], + ], +]); +$ok[] = '✓ Formación (2 títulos) + Certificaciones (10)'; + +/* ════════════════════════════════════════════ + COMPETENCIAS → pflores_competencias +════════════════════════════════════════════ */ +update_option('pflores_competencias', [ + 'pf_competencies' => [ + ['group_name' => 'Finanzas y Operaciones', 'skills_text' => "Gestión de operaciones financieras|95\nControl interno y cumplimiento|95\nGestión de cartera y microfinanzas|90\nConciliación bancaria / Tesorería|90\nALA/FT y prevención de riesgos|88"], + ['group_name' => 'Tecnología y Procesos', 'skills_text' => "Transformación digital / BPM|85\nSAP FI|78\nExcel avanzado y dashboards|85\nPower BI|75\nIA aplicada al trabajo|70"], + ['group_name' => 'Liderazgo', 'skills_text' => "Equipos de hasta 48 personas|95\nGestión del cambio organizacional|90\nFormación de formadores|88\nRemuneración variable y plan de carrera|85\nDiversidad, equidad e inclusión|80"], + ], +]); +$ok[] = '✓ Competencias (3 grupos, 15 habilidades)'; + +/* ════════════════════════════════════════════ + MÉTRICAS, IMPACTO Y EXTRAS → pflores_extras +════════════════════════════════════════════ */ +update_option('pflores_extras', [ + 'pf_metrics' => [ + ['value' => '22+', 'suffix' => '', 'label' => 'años de experiencia en banca y microfinanzas'], + ['value' => '26', 'suffix' => '', 'label' => 'agencias bajo liderazgo operativo nacional'], + ['value' => '48', 'suffix' => '', 'label' => 'personas a cargo en la estructura operativa'], + ['value' => 'USD 5 M','suffix' => '', 'label' => 'en operaciones mensuales de microcrédito'], + ['value' => '28.000', 'suffix' => '', 'label' => 'clientes coordinados en recaudación por canales internos y externos'], + ], + 'pf_highlights' => [ + ['value' => '9/10', 'suffix' => '', 'label' => 'calificación de gestión con resultado excelente en cuatro trimestres consecutivos'], + ['value' => '74 %', 'suffix' => '', 'label' => 'reducción de requerimientos de soporte desde Dirección por descentralización de procesos'], + ['value' => '1,68 días','suffix' => '', 'label' => 'tiempo de desembolso logrado en Q3 2025, mejor resultado del año'], + ['value' => '75 %', 'suffix' => '', 'label' => 'reducción del índice de rotación del área entre 2022 y 2026'], + ], + 'pf_impact' => [ + ['title' => 'Transformación digital', 'body' => 'Lideró desembolsos por transferencia bancaria, integración de APIs bancarias y digitalización de expedientes y pagarés en 13 agencias.'], + ['title' => 'Automatización crítica', 'body' => 'Automatizó el seguro de desgravamen, desde el cálculo de prima hasta la liquidación contable, reduciendo tiempos de 17 a 10 días.'], + ['title' => 'Supervisión nacional', 'body' => 'Implementó una matriz de supervisión y certificación por agencia, elevando el índice de cumplimiento operativo del 65 % al 88 %.'], + ], + 'pf_volunteer_title' => 'Voluntaria — Hogar San Camilo de Lellis', + 'pf_volunteer_year' => '2025', + 'pf_volunteer_body' => 'Hogar de niñas con discapacidad | Loja, Ecuador. Alineado a la visión y misión de responsabilidad social de la Fundación FACES Microfinanzas.', +]); +$ok[] = '✓ Métricas (5) + Highlights (4) + Impacto (3) + Voluntariado'; + +?> +Datos CV cargados + + +

✅ CV de Patricia Flores — datos cargados con CMB2

+
    $r"; ?>
+ +

⚠ Elimina este archivo una vez verificado.

+ diff --git a/backend/wordpress/wp-content/themes/apex-cv/assets/css/theme.css b/backend/wordpress/wp-content/themes/apex-cv/assets/css/theme.css new file mode 100644 index 0000000..0390eb9 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/assets/css/theme.css @@ -0,0 +1,1194 @@ +/* ========================================================================== + Apex CV — theme.css + Dark professional CV theme · Space Grotesk + ========================================================================== */ + +/* -------------------------------------------------------------------------- + 0. CSS custom properties + -------------------------------------------------------------------------- */ +:root { + --ax-bg: #0b0d12; + --ax-surface: #11141c; + --ax-surface-2: #161a26; + --ax-surface-3: #1c2133; + --ax-border: #1e2235; + --ax-border-light: #252b40; + --ax-text: #e0e3ef; + --ax-muted: #7a8099; + --ax-subtle: #4a5268; + --ax-cyan: #22d3ee; + --ax-cyan-dim: #0e7490; + --ax-cyan-glow: rgba(34, 211, 238, .15); + --ax-gold: #f0b429; + --ax-gold-dim: rgba(240, 180, 41, .12); + --ax-green: #22c55e; + --ax-green-dim: rgba(34, 197, 94, .15); + --ax-red: #f87171; + + --sidebar-w: 280px; + --sidebar-w-sm: 240px; + + --radius-sm: 4px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-xl: 16px; + --radius-full: 9999px; + + --shadow-card: 0 1px 3px rgba(0,0,0,.5), 0 1px 2px rgba(0,0,0,.4); + --shadow-raised: 0 4px 16px rgba(0,0,0,.6); + --transition: 150ms cubic-bezier(.4,0,.2,1); +} + +/* -------------------------------------------------------------------------- + 1. Reset & base + -------------------------------------------------------------------------- */ +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +html { + font-size: 16px; + scroll-behavior: smooth; + -webkit-text-size-adjust: 100%; +} + +body { + font-family: 'Space Grotesk', system-ui, sans-serif; + background: var(--ax-bg); + color: var(--ax-text); + line-height: 1.65; + min-height: 100vh; + -webkit-font-smoothing: antialiased; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 600; + line-height: 1.25; + color: var(--ax-text); +} + +a { + color: var(--ax-cyan); + text-decoration: none; + transition: color var(--transition), opacity var(--transition); +} +a:hover { opacity: .8; } + +img { display: block; max-width: 100%; height: auto; } + +ul, ol { list-style: none; } + +/* -------------------------------------------------------------------------- + 2. Layout — shell + -------------------------------------------------------------------------- */ +body.apex-shell { overflow-x: hidden; } + +.ax-layout { + display: flex; + min-height: 100vh; +} + +/* -------------------------------------------------------------------------- + 3. Sidebar + -------------------------------------------------------------------------- */ +.ax-sidebar { + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: var(--sidebar-w); + background: var(--ax-surface); + border-right: 1px solid var(--ax-border); + overflow-y: auto; + overflow-x: hidden; + display: flex; + flex-direction: column; + gap: 0; + z-index: 100; + scrollbar-width: thin; + scrollbar-color: var(--ax-border) transparent; + transition: transform var(--transition), box-shadow var(--transition); +} +.ax-sidebar::-webkit-scrollbar { width: 4px; } +.ax-sidebar::-webkit-scrollbar-track { background: transparent; } +.ax-sidebar::-webkit-scrollbar-thumb { background: var(--ax-border); border-radius: var(--radius-full); } + +/* subtle radial glow in the top-left corner */ +.ax-sidebar::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 260px; + background: radial-gradient(ellipse 140px 120px at 50% -10%, rgba(34,211,238,.08) 0%, transparent 70%); + pointer-events: none; + z-index: 0; +} + +/* -------------------------------------------------------------------------- + 4. Profile block + -------------------------------------------------------------------------- */ +.ax-profile { + position: relative; + z-index: 1; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 2rem 1.25rem 1.5rem; + gap: .5rem; +} + +.ax-profile__avatar-wrap { + position: relative; + margin-bottom: .5rem; +} + +.ax-profile__avatar { + width: 108px; + height: 108px; + border-radius: 50%; + object-fit: cover; + border: 2px solid var(--ax-border-light); + /* pulsing cyan ring */ + box-shadow: + 0 0 0 3px var(--ax-surface), + 0 0 0 5px var(--ax-cyan-dim), + 0 0 0 6px var(--ax-surface); + animation: ax-avatar-ring 3s ease-in-out infinite; +} + +@keyframes ax-avatar-ring { + 0%, 100% { box-shadow: 0 0 0 3px var(--ax-surface), 0 0 0 5px var(--ax-cyan-dim), 0 0 0 6px var(--ax-surface); } + 50% { box-shadow: 0 0 0 3px var(--ax-surface), 0 0 0 6px rgba(34,211,238,.35), 0 0 0 8px var(--ax-surface); } +} + +/* green availability dot */ +.ax-profile__status { + position: absolute; + bottom: 4px; + right: 4px; + width: 13px; + height: 13px; + background: var(--ax-green); + border-radius: 50%; + border: 2px solid var(--ax-surface); + animation: ax-blink 2.5s ease-in-out infinite; +} + +@keyframes ax-blink { + 0%, 100% { opacity: 1; } + 50% { opacity: .4; } +} + +.ax-profile__name { + font-size: 1rem; + font-weight: 700; + letter-spacing: -.01em; + color: var(--ax-text); + line-height: 1.3; +} + +.ax-profile__role { + font-size: .75rem; + font-weight: 600; + color: var(--ax-cyan); + letter-spacing: .02em; + text-transform: uppercase; + line-height: 1.4; +} + +.ax-profile__role2 { + font-size: .7rem; + color: var(--ax-muted); + line-height: 1.4; +} + +/* -------------------------------------------------------------------------- + 5. Sidebar navigation + -------------------------------------------------------------------------- */ +.ax-nav { + position: relative; + z-index: 1; + padding: 0 .75rem; +} + +.ax-nav__list { + display: flex; + flex-direction: column; + gap: .125rem; +} + +.ax-nav__item { position: relative; } + +.ax-nav__link { + display: flex; + align-items: center; + gap: .625rem; + padding: .55rem .875rem; + border-radius: var(--radius-md); + font-size: .8125rem; + font-weight: 500; + color: var(--ax-muted); + transition: background var(--transition), color var(--transition); + position: relative; +} + +.ax-nav__link::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%) scaleY(0); + width: 3px; + height: 60%; + background: var(--ax-cyan); + border-radius: 0 var(--radius-sm) var(--radius-sm) 0; + transition: transform var(--transition); + border-radius: var(--radius-full); +} + +.ax-nav__link:hover { + background: var(--ax-surface-2); + color: var(--ax-text); + opacity: 1; +} + +.ax-nav__link.is-active { + background: rgba(34, 211, 238, .08); + color: var(--ax-cyan); + font-weight: 600; +} +.ax-nav__link.is-active::before { transform: translateY(-50%) scaleY(1); } + +/* -------------------------------------------------------------------------- + 6. Sidebar section blocks + -------------------------------------------------------------------------- */ +.ax-sidebar-section { + position: relative; + z-index: 1; + padding: 1rem 1.25rem; + border-top: 1px solid var(--ax-border); +} + +.ax-sidebar-label { + display: block; + font-size: .6875rem; + font-weight: 700; + letter-spacing: .1em; + text-transform: uppercase; + color: var(--ax-subtle); + margin-bottom: .625rem; +} + +.ax-sidebar-text { + font-size: .75rem; + color: var(--ax-muted); + line-height: 1.55; +} + +/* -------------------------------------------------------------------------- + 7. Contact list + -------------------------------------------------------------------------- */ +.ax-contact-list { + display: flex; + flex-direction: column; + gap: .5rem; +} + +.ax-contact-list__item { + display: flex; + align-items: flex-start; + gap: .5rem; + font-size: .75rem; + color: var(--ax-muted); + word-break: break-all; +} +.ax-contact-list__item a { + color: var(--ax-muted); + transition: color var(--transition); + word-break: break-all; +} +.ax-contact-list__item a:hover { color: var(--ax-cyan); opacity: 1; } + +.ax-icon { + width: 14px; + height: 14px; + flex-shrink: 0; + margin-top: 1px; + color: var(--ax-cyan); +} + +/* -------------------------------------------------------------------------- + 8. Skill pills + -------------------------------------------------------------------------- */ +.ax-skill-pills { + display: flex; + flex-wrap: wrap; + gap: .35rem; +} + +.ax-skill-group-label { + width: 100%; + font-size: .625rem; + font-weight: 700; + letter-spacing: .08em; + text-transform: uppercase; + color: var(--ax-subtle); + margin-top: .5rem; + margin-bottom: .15rem; +} +.ax-skill-group-label:first-child { margin-top: 0; } + +.ax-skill-pill { + display: inline-block; + padding: .2rem .6rem; + background: var(--ax-surface-2); + border: 1px solid var(--ax-border-light); + border-radius: var(--radius-full); + font-size: .65rem; + font-weight: 500; + color: var(--ax-muted); + line-height: 1.5; + transition: border-color var(--transition), color var(--transition), background var(--transition); + white-space: nowrap; +} +.ax-skill-pill:hover { + border-color: var(--ax-cyan); + color: var(--ax-cyan); + background: rgba(34,211,238,.06); +} + +/* -------------------------------------------------------------------------- + 9. Sidebar action buttons + -------------------------------------------------------------------------- */ +.ax-sidebar-section--actions { + display: flex; + flex-direction: column; + gap: .625rem; + margin-top: auto; +} + +.ax-btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: .5rem; + padding: .6rem 1rem; + border-radius: var(--radius-md); + font-family: inherit; + font-size: .8125rem; + font-weight: 600; + cursor: pointer; + border: 1px solid transparent; + transition: background var(--transition), color var(--transition), border-color var(--transition), box-shadow var(--transition); + text-align: center; + width: 100%; +} +.ax-btn .ax-icon { width: 15px; height: 15px; } + +.ax-btn--primary { + background: var(--ax-cyan); + color: #0b0d12; + border-color: var(--ax-cyan); +} +.ax-btn--primary:hover { + background: #38e4f5; + border-color: #38e4f5; + box-shadow: 0 0 12px rgba(34,211,238,.4); + color: #0b0d12; + opacity: 1; +} + +.ax-btn--ghost { + background: transparent; + color: var(--ax-muted); + border-color: var(--ax-border-light); +} +.ax-btn--ghost:hover { + color: var(--ax-text); + border-color: var(--ax-muted); + background: var(--ax-surface-2); + opacity: 1; +} + +/* -------------------------------------------------------------------------- + 10. Mobile hamburger toggle + -------------------------------------------------------------------------- */ +.ax-mobile-toggle { + display: none; + position: fixed; + top: 1rem; + left: 1rem; + z-index: 200; + width: 40px; + height: 40px; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 5px; + background: var(--ax-surface); + border: 1px solid var(--ax-border); + border-radius: var(--radius-md); + cursor: pointer; + padding: 0; + transition: background var(--transition), border-color var(--transition); +} +.ax-mobile-toggle:hover { + background: var(--ax-surface-2); + border-color: var(--ax-border-light); +} + +.ax-mobile-toggle span { + display: block; + width: 20px; + height: 2px; + background: var(--ax-text); + border-radius: var(--radius-full); + transform-origin: center; + transition: transform var(--transition), opacity var(--transition), width var(--transition); +} + +/* X state when open */ +.ax-mobile-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); } +.ax-mobile-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; width: 0; } +.ax-mobile-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); } + +/* -------------------------------------------------------------------------- + 11. Main content area + -------------------------------------------------------------------------- */ +.ax-main { + margin-left: var(--sidebar-w); + flex: 1; + min-width: 0; +} + +.ax-content-wrap { + max-width: 860px; + padding: 3rem 3rem 4rem; + margin: 0 auto; +} + +/* -------------------------------------------------------------------------- + 12. Section base + -------------------------------------------------------------------------- */ +.ax-section { + padding-bottom: 3.5rem; + border-bottom: 1px solid var(--ax-border); + margin-bottom: 3.5rem; +} +.ax-section:last-child { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; +} + +.ax-section__head { margin-bottom: 1.5rem; } + +.ax-section__eyebrow { + display: block; + font-size: .6875rem; + font-weight: 700; + letter-spacing: .12em; + text-transform: uppercase; + color: var(--ax-cyan); + margin-bottom: .4rem; +} + +.ax-section__title { + font-size: 1.375rem; + font-weight: 700; + color: var(--ax-text); + line-height: 1.3; +} + +.ax-lead { + font-size: .9375rem; + color: var(--ax-muted); + line-height: 1.75; + max-width: 72ch; +} + +/* -------------------------------------------------------------------------- + 13. Metrics grid (5 columns) + -------------------------------------------------------------------------- */ +.ax-metrics { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: .75rem; + margin-top: 1.75rem; +} + +.ax-metric-card { + background: var(--ax-surface); + border: 1px solid var(--ax-border); + border-radius: var(--radius-lg); + padding: 1rem .875rem; + display: flex; + flex-direction: column; + gap: .35rem; + transition: border-color var(--transition), box-shadow var(--transition); +} +.ax-metric-card:hover { + border-color: var(--ax-border-light); + box-shadow: var(--shadow-card); +} + +.ax-metric-card__value { + font-size: 1.25rem; + font-weight: 700; + color: var(--ax-gold); + line-height: 1; + letter-spacing: -.02em; +} + +.ax-metric-card__label { + font-size: .6875rem; + color: var(--ax-muted); + line-height: 1.45; + font-weight: 400; +} + +/* -------------------------------------------------------------------------- + 14. Highlights 2×2 + -------------------------------------------------------------------------- */ +.ax-highlights { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; + margin-bottom: 1.75rem; +} + +.ax-highlight-card { + background: var(--ax-surface); + border: 1px solid var(--ax-border); + border-radius: var(--radius-lg); + padding: 1.25rem 1.5rem; + display: flex; + flex-direction: column; + gap: .4rem; + transition: border-color var(--transition); +} +.ax-highlight-card:hover { border-color: var(--ax-cyan-dim); } + +.ax-highlight-card__value { + font-size: 1.875rem; + font-weight: 700; + color: var(--ax-cyan); + letter-spacing: -.03em; + line-height: 1; +} + +.ax-highlight-card__label { + font-size: .8125rem; + color: var(--ax-muted); + line-height: 1.5; +} + +/* -------------------------------------------------------------------------- + 15. Impact cards (3 columns) + -------------------------------------------------------------------------- */ +.ax-impact-cards { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1rem; +} + +.ax-impact-card { + background: var(--ax-surface); + border: 1px solid var(--ax-border); + border-left: 3px solid var(--ax-cyan); + border-radius: 0 var(--radius-md) var(--radius-md) 0; + padding: 1rem 1.125rem; + transition: border-left-color var(--transition), box-shadow var(--transition); +} +.ax-impact-card:hover { + border-left-color: #38e4f5; + box-shadow: var(--shadow-card); +} + +.ax-impact-card__title { + font-size: .875rem; + font-weight: 700; + color: var(--ax-text); + margin-bottom: .4rem; +} + +.ax-impact-card__body { + font-size: .8rem; + color: var(--ax-muted); + line-height: 1.6; +} + +/* -------------------------------------------------------------------------- + 16. Timeline (experience) + -------------------------------------------------------------------------- */ +.ax-timeline { + display: flex; + flex-direction: column; + gap: 0; + position: relative; +} + +.ax-timeline__item { + display: grid; + grid-template-columns: 180px 1fr; + gap: 0 1.5rem; + position: relative; + padding-bottom: 2.5rem; +} +.ax-timeline__item:last-child { padding-bottom: 0; } + +/* vertical line along the dot column */ +.ax-timeline__item:not(:last-child)::after { + content: ''; + position: absolute; + left: calc(180px + 1.5rem / 2 - 1px); + top: 8px; + bottom: 0; + width: 1px; + background: var(--ax-border); +} + +.ax-timeline__period { + text-align: right; + padding-top: 2px; + position: relative; + display: flex; + align-items: flex-start; + justify-content: flex-end; + gap: .75rem; +} + +.ax-timeline__period-text { + font-size: .75rem; + font-weight: 600; + color: var(--ax-subtle); + line-height: 1.4; + letter-spacing: .01em; +} + +.ax-timeline__dot { + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--ax-surface); + border: 2px solid var(--ax-cyan); + flex-shrink: 0; + margin-top: 3px; + position: relative; + z-index: 1; + transition: background var(--transition), box-shadow var(--transition); +} +.ax-timeline__item:hover .ax-timeline__dot { + background: var(--ax-cyan); + box-shadow: 0 0 8px rgba(34,211,238,.5); +} + +.ax-timeline__content { padding-top: 0; } + +.ax-timeline__job-title { + font-size: 1rem; + font-weight: 700; + color: var(--ax-text); + margin-bottom: .2rem; +} + +.ax-timeline__meta { + font-size: .8125rem; + color: var(--ax-muted); + margin-bottom: .5rem; + display: flex; + align-items: center; + flex-wrap: wrap; + gap: .25rem; +} + +.ax-timeline__sep { + color: var(--ax-subtle); +} + +.ax-timeline__lead { + font-size: .8375rem; + color: var(--ax-muted); + line-height: 1.65; + margin-bottom: .75rem; + font-style: italic; +} + +.ax-timeline__bullets { + display: flex; + flex-direction: column; + gap: .375rem; +} + +.ax-timeline__bullets li { + font-size: .8125rem; + color: var(--ax-muted); + line-height: 1.6; + padding-left: 1.1rem; + position: relative; +} +.ax-timeline__bullets li::before { + content: '›'; + position: absolute; + left: 0; + top: 0; + color: var(--ax-cyan); + font-weight: 700; + line-height: 1.6; +} + +/* -------------------------------------------------------------------------- + 17. Education cards + -------------------------------------------------------------------------- */ +.ax-edu-cards { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.ax-edu-card { + display: flex; + align-items: flex-start; + gap: 1.25rem; + background: var(--ax-surface); + border: 1px solid var(--ax-border); + border-radius: var(--radius-lg); + padding: 1.25rem 1.5rem; + transition: border-color var(--transition), box-shadow var(--transition); +} +.ax-edu-card:hover { + border-color: var(--ax-border-light); + box-shadow: var(--shadow-card); +} + +.ax-edu-card__year { + flex-shrink: 0; + font-size: 1.125rem; + font-weight: 700; + color: var(--ax-gold); + letter-spacing: -.02em; + min-width: 48px; + padding-top: 2px; +} + +.ax-edu-card__title { + font-size: .9375rem; + font-weight: 700; + color: var(--ax-text); + margin-bottom: .3rem; +} + +.ax-edu-card__institution { + font-size: .8125rem; + color: var(--ax-muted); + margin-bottom: .25rem; +} + +.ax-edu-card__detail { + font-size: .75rem; + color: var(--ax-subtle); + font-style: italic; +} + +/* -------------------------------------------------------------------------- + 18. Certifications list + -------------------------------------------------------------------------- */ +.ax-cert-list { + display: flex; + flex-direction: column; + gap: .625rem; +} + +.ax-cert-item { + display: flex; + align-items: flex-start; + gap: 1rem; + padding: .875rem 1.125rem; + background: var(--ax-surface); + border: 1px solid var(--ax-border); + border-radius: var(--radius-md); + transition: border-color var(--transition); +} +.ax-cert-item:hover { border-color: var(--ax-border-light); } + +.ax-cert-item__year { + flex-shrink: 0; + display: inline-flex; + align-items: center; + justify-content: center; + padding: .15rem .6rem; + background: rgba(34,211,238,.1); + border: 1px solid var(--ax-cyan-dim); + border-radius: var(--radius-full); + font-size: .6875rem; + font-weight: 700; + color: var(--ax-cyan); + letter-spacing: .04em; + white-space: nowrap; + margin-top: 2px; +} + +.ax-cert-item__title { + font-size: .875rem; + font-weight: 600; + color: var(--ax-text); + margin-bottom: .2rem; + line-height: 1.35; +} + +.ax-cert-item__issuer { + font-size: .75rem; + color: var(--ax-muted); + line-height: 1.45; +} + +/* -------------------------------------------------------------------------- + 19. Extras grid (contacto section) + -------------------------------------------------------------------------- */ +.ax-extras-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; +} + +.ax-extras-grid__card--bcard { + grid-column: 1 / -1; +} + +.ax-extras-grid__card { + background: var(--ax-surface); + border: 1px solid var(--ax-border); + border-radius: var(--radius-lg); + padding: 1.25rem 1.5rem; +} + +.ax-extras__heading { + font-size: .9375rem; + font-weight: 700; + color: var(--ax-text); + margin-bottom: .2rem; + margin-top: .125rem; +} + +.ax-extras__year { + font-size: .75rem; + font-weight: 700; + color: var(--ax-gold); + margin-bottom: .5rem; +} + +.ax-extras__body { + font-size: .8125rem; + color: var(--ax-muted); + line-height: 1.6; +} + +/* -------------------------------------------------------------------------- + 20. Data list (additional info) + -------------------------------------------------------------------------- */ +.ax-data-list { + display: flex; + flex-direction: column; + gap: .5rem; + margin-top: .25rem; +} + +.ax-data-list__row { + display: flex; + flex-wrap: wrap; + gap: .25rem .5rem; +} + +.ax-data-list dt { + font-size: .75rem; + font-weight: 700; + color: var(--ax-subtle); + min-width: 120px; + flex-shrink: 0; +} + +.ax-data-list dd { + font-size: .8rem; + color: var(--ax-muted); + flex: 1; + min-width: 120px; + line-height: 1.5; +} + +/* -------------------------------------------------------------------------- + 21. Business card + -------------------------------------------------------------------------- */ +.ax-bcard { + background: linear-gradient(135deg, var(--ax-surface-2) 0%, var(--ax-surface-3) 100%); + border: 1px solid var(--ax-border-light); + border-radius: var(--radius-lg); + overflow: hidden; + margin-top: .75rem; +} + +.ax-bcard__header { + padding: 1rem 1.25rem .875rem; + border-bottom: 1px solid var(--ax-border); + background: rgba(34,211,238,.04); +} + +.ax-bcard__name { + font-size: .9375rem; + font-weight: 700; + color: var(--ax-text); + margin-bottom: .2rem; +} + +.ax-bcard__role { + font-size: .75rem; + color: var(--ax-cyan); + font-weight: 500; +} + +.ax-bcard__body { + display: flex; + gap: 1rem; + padding: 1rem 1.25rem; + align-items: center; +} + +.ax-bcard__qr { + flex-shrink: 0; + padding: .375rem; + background: #fff; + border-radius: var(--radius-sm); +} +.ax-bcard__qr img { + display: block; + width: 100px; + height: 100px; + border-radius: 2px; +} + +.ax-bcard__info { + display: flex; + flex-direction: column; + gap: .35rem; +} +.ax-bcard__info p, .ax-bcard__info a { + font-size: .75rem; + color: var(--ax-muted); + line-height: 1.45; +} +.ax-bcard__info a:hover { color: var(--ax-cyan); opacity: 1; } + +/* -------------------------------------------------------------------------- + 22. Sidebar overlay (mobile backdrop) + -------------------------------------------------------------------------- */ +.ax-sidebar-overlay { + display: none; + position: fixed; + inset: 0; + background: rgba(0,0,0,.65); + z-index: 99; + opacity: 0; + transition: opacity 200ms ease; +} +.ax-sidebar-overlay.is-visible { + display: block; + opacity: 1; +} + +/* -------------------------------------------------------------------------- + 23. Responsive — 1024px: narrower sidebar, 3-col metrics, flat timeline + -------------------------------------------------------------------------- */ +@media (max-width: 1024px) { + .ax-sidebar { width: var(--sidebar-w-sm); } + .ax-main { margin-left: var(--sidebar-w-sm); } + + .ax-content-wrap { padding: 2.5rem 2rem 3rem; } + + .ax-metrics { + grid-template-columns: repeat(3, 1fr); + } + + .ax-impact-cards { + grid-template-columns: 1fr 1fr; + } + + /* Flatten timeline: full-width blocks stacked */ + .ax-timeline__item { + grid-template-columns: 1fr; + padding-left: 1.25rem; + padding-bottom: 2rem; + } + .ax-timeline__item::after { + left: 0; + top: 14px; + } + + .ax-timeline__period { + text-align: left; + justify-content: flex-start; + flex-direction: row-reverse; + margin-bottom: .5rem; + } + .ax-timeline__dot { + position: absolute; + left: -5px; + top: 4px; + margin-top: 0; + } +} + +/* -------------------------------------------------------------------------- + 24. Responsive — 768px: mobile sidebar + -------------------------------------------------------------------------- */ +@media (max-width: 768px) { + .ax-mobile-toggle { display: flex; } + + .ax-sidebar { + transform: translateX(-100%); + box-shadow: none; + width: var(--sidebar-w); + } + .ax-sidebar.is-open { + transform: translateX(0); + box-shadow: var(--shadow-raised); + } + + .ax-main { margin-left: 0; } + + .ax-content-wrap { + padding: 5rem 1.25rem 3rem; + max-width: 100%; + } + + .ax-metrics { + grid-template-columns: repeat(2, 1fr); + } + + .ax-highlights { + grid-template-columns: 1fr; + } + + .ax-impact-cards { + grid-template-columns: 1fr; + } + + .ax-section__title { font-size: 1.125rem; } + + .ax-highlight-card__value { font-size: 1.5rem; } + + .ax-extras-grid { + grid-template-columns: 1fr; + } + .ax-extras-grid__card--bcard { + grid-column: 1; + } +} + +@media (max-width: 480px) { + .ax-metrics { grid-template-columns: 1fr 1fr; } + + .ax-bcard__body { flex-direction: column; } + + .ax-timeline__item { + padding-left: 1rem; + } +} + +/* -------------------------------------------------------------------------- + 25. Print styles + -------------------------------------------------------------------------- */ +@media print { + :root { + --ax-bg: #fff; + --ax-surface: #f8f8f8; + --ax-surface-2: #f0f0f0; + --ax-surface-3: #e8e8e8; + --ax-border: #ddd; + --ax-border-light: #ccc; + --ax-text: #111; + --ax-muted: #444; + --ax-subtle: #666; + --ax-cyan: #0077aa; + --ax-cyan-dim: #0077aa; + --ax-gold: #c07800; + --ax-green: #007700; + } + + body { background: #fff; color: #111; } + + .ax-mobile-toggle { display: none !important; } + + .ax-layout { display: block; } + + .ax-sidebar { + position: static; + width: 100%; + border: none; + border-bottom: 2px solid #ccc; + overflow: visible; + transform: none !important; + animation: none !important; + page-break-after: avoid; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: .5rem 1rem; + padding: 1rem; + } + + .ax-sidebar::before { display: none; } + + .ax-profile { + grid-column: 1; + text-align: left; + align-items: flex-start; + padding: 0; + } + + .ax-profile__avatar { + width: 64px; + height: 64px; + animation: none; + box-shadow: none; + } + .ax-profile__status { display: none; } + + .ax-nav { grid-column: 2; } + .ax-nav__list { flex-direction: row; flex-wrap: wrap; gap: .25rem; } + .ax-nav__link { color: #333; font-size: .75rem; padding: .25rem .5rem; } + .ax-nav__link.is-active { color: var(--ax-cyan); } + .ax-nav__link::before { display: none; } + + .ax-sidebar-section { grid-column: 3; border: none; padding: 0; } + .ax-sidebar-section--actions { display: none; } + + .ax-skill-pill { + background: #eee; + border-color: #ccc; + color: #333; + } + + .ax-main { margin-left: 0; } + + .ax-content-wrap { max-width: 100%; padding: 1.5rem 0 0; } + + .ax-section { page-break-inside: avoid; } + + .ax-metric-card, + .ax-highlight-card, + .ax-impact-card, + .ax-edu-card, + .ax-cert-item { + background: #f8f8f8; + border-color: #ddd; + box-shadow: none; + } + + .ax-metrics { grid-template-columns: repeat(5, 1fr); } + .ax-highlights { grid-template-columns: repeat(2, 1fr); } + .ax-impact-cards { grid-template-columns: repeat(3, 1fr); } + + .ax-timeline__item::after { background: #ccc; } + + a { color: inherit; text-decoration: none; } + a[href]::after { content: none; } +} diff --git a/backend/wordpress/wp-content/themes/apex-cv/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx b/backend/wordpress/wp-content/themes/apex-cv/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx new file mode 100644 index 0000000000000000000000000000000000000000..544bf3d781cd85ddc8becbc624bf639c8ba6fe11 GIT binary patch literal 19375 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

}m|)H;34nU|q@|s4__NYn(gcG+~g* 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 literal 0 HcmV?d00001 diff --git a/backend/wordpress/wp-content/themes/apex-cv/assets/images/patricia-flores-qr.png b/backend/wordpress/wp-content/themes/apex-cv/assets/images/patricia-flores-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..55703ad812dff9f68d5f2e853e2b507c27c2c478 GIT binary patch literal 535 zcmV+y0_gpTP)00006P)t-s|Ns90 z0033O(|!N|010qNS#tmY4#WTe4#WYKD-Ig~00Fm2L_t(|obB2%u7fZP24EuwMvjo9 za5OktkHQf;c6h2^?AS>tm7c0c3d8RykdIDQoVX$SC}uA4@RwtJScrPQ(^Snrp`lyo zr;|SF5E1{V))2iofQD|R2c1w|M;AXM(VfoUprOB^gNy_PStAJ=`r=x4lUm+Gsq@g# z&9#MRtUd%mw#GVuhHj&|M77skby0C?z?$t=%aPc*qEO-NL?b$ z&oP#F-3dtQLPNLF@-oDiIXEY3uY=hSKG4t?&@l$CqSSe|2IoSS->J?+Lm#Z?bV9!g z8X~F_wcplxXy_)I$Plx4DlJl-*Lal54-I{;&iQShSzoh?mz^mzbSqslHrIL92_5X} zJT&y-I%h0znnM$_UmJpkzLMtLTi?e+n@hA`W1*q{ueT9=ew8OH`0}s#+m<{u^bvaA zB&KM3x!1dN)p-XR`fRUM;qk%414pXz2D@!|qht z^4a-EZ*KuZL!YWMV!y{hI$VATKs002ovPDHLkV1nW!_Bj9m literal 0 HcmV?d00001 diff --git a/backend/wordpress/wp-content/themes/apex-cv/assets/images/profile-placeholder.svg b/backend/wordpress/wp-content/themes/apex-cv/assets/images/profile-placeholder.svg new file mode 100644 index 0000000..3d7dbb0 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/assets/images/profile-placeholder.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/backend/wordpress/wp-content/themes/apex-cv/assets/js/theme.js b/backend/wordpress/wp-content/themes/apex-cv/assets/js/theme.js new file mode 100644 index 0000000..5c4fe90 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/assets/js/theme.js @@ -0,0 +1,183 @@ +/** + * Apex CV — theme.js + * Mobile sidebar toggle · Print button · Scroll spy + */ +(function () { + 'use strict'; + + /* ----------------------------------------------------------------------- + Helpers + ----------------------------------------------------------------------- */ + function qs(selector, ctx) { + return (ctx || document).querySelector(selector); + } + function qsa(selector, ctx) { + return Array.from((ctx || document).querySelectorAll(selector)); + } + + /* ----------------------------------------------------------------------- + Mobile sidebar + ----------------------------------------------------------------------- */ + var sidebar = qs('#ax-sidebar'); + var toggle = qs('.ax-mobile-toggle'); + var overlay = null; + + function createOverlay() { + if (overlay) return overlay; + overlay = document.createElement('div'); + overlay.className = 'ax-sidebar-overlay'; + overlay.setAttribute('aria-hidden', 'true'); + document.body.appendChild(overlay); + overlay.addEventListener('click', closeSidebar); + return overlay; + } + + function openSidebar() { + if (!sidebar || !toggle) return; + sidebar.classList.add('is-open'); + toggle.setAttribute('aria-expanded', 'true'); + var ov = createOverlay(); + // force reflow before adding class for transition + ov.offsetHeight; // eslint-disable-line no-unused-expressions + ov.classList.add('is-visible'); + document.body.style.overflow = 'hidden'; + } + + function closeSidebar() { + if (!sidebar || !toggle) return; + sidebar.classList.remove('is-open'); + toggle.setAttribute('aria-expanded', 'false'); + if (overlay) overlay.classList.remove('is-visible'); + document.body.style.overflow = ''; + } + + function isMobile() { + return window.innerWidth <= 768; + } + + if (toggle) { + toggle.addEventListener('click', function () { + var isOpen = sidebar && sidebar.classList.contains('is-open'); + if (isOpen) { + closeSidebar(); + } else { + openSidebar(); + } + }); + } + + /* Close sidebar when clicking outside on mobile */ + document.addEventListener('click', function (e) { + if (!isMobile()) return; + if (!sidebar || !sidebar.classList.contains('is-open')) return; + if (sidebar.contains(e.target)) return; + if (toggle && toggle.contains(e.target)) return; + closeSidebar(); + }); + + /* Close sidebar on nav link click (mobile) */ + qsa('.ax-nav__link').forEach(function (link) { + link.addEventListener('click', function () { + if (isMobile()) { + closeSidebar(); + } + }); + }); + + /* Close sidebar on resize back to desktop */ + window.addEventListener('resize', function () { + if (!isMobile() && sidebar && sidebar.classList.contains('is-open')) { + closeSidebar(); + } + }); + + /* ----------------------------------------------------------------------- + Print button + ----------------------------------------------------------------------- */ + qsa('[data-apex-print]').forEach(function (btn) { + btn.addEventListener('click', function () { + window.print(); + }); + }); + + /* ----------------------------------------------------------------------- + Scroll spy via IntersectionObserver + ----------------------------------------------------------------------- */ + var navLinks = qsa('.ax-nav__link'); + + if ('IntersectionObserver' in window && navLinks.length > 0) { + var activeSection = null; + + function setActive(sectionId) { + if (activeSection === sectionId) return; + activeSection = sectionId; + navLinks.forEach(function (link) { + var target = link.getAttribute('data-section') || link.getAttribute('href').replace('#', ''); + if (target === sectionId) { + link.classList.add('is-active'); + link.setAttribute('aria-current', 'true'); + } else { + link.classList.remove('is-active'); + link.removeAttribute('aria-current'); + } + }); + } + + // Collect sections that correspond to nav links + var sectionIds = navLinks.map(function (link) { + return link.getAttribute('data-section') || link.getAttribute('href').replace('#', ''); + }); + + var sectionEls = sectionIds + .map(function (id) { return document.getElementById(id); }) + .filter(Boolean); + + // Track which sections are currently intersecting + var visibleSections = new Set(); + + var observer = new IntersectionObserver( + function (entries) { + entries.forEach(function (entry) { + if (entry.isIntersecting) { + visibleSections.add(entry.target.id); + } else { + visibleSections.delete(entry.target.id); + } + }); + + // Activate the topmost visible section (matches reading order) + var toActivate = null; + sectionEls.forEach(function (el) { + if (visibleSections.has(el.id) && toActivate === null) { + toActivate = el.id; + } + }); + + if (toActivate) { + setActive(toActivate); + } + }, + { + rootMargin: '-10% 0px -60% 0px', + threshold: 0 + } + ); + + sectionEls.forEach(function (el) { observer.observe(el); }); + } + + /* ----------------------------------------------------------------------- + Smooth scroll for anchor links (fallback for older browsers) + ----------------------------------------------------------------------- */ + qsa('a[href^="#"]').forEach(function (link) { + link.addEventListener('click', function (e) { + var href = link.getAttribute('href'); + if (!href || href === '#') return; + var target = document.querySelector(href); + if (!target) return; + e.preventDefault(); + target.scrollIntoView({ behavior: 'smooth', block: 'start' }); + }); + }); + +})(); diff --git a/backend/wordpress/wp-content/themes/apex-cv/footer.php b/backend/wordpress/wp-content/themes/apex-cv/footer.php new file mode 100644 index 0000000..4acbb15 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/footer.php @@ -0,0 +1,5 @@ + +

+ + + diff --git a/backend/wordpress/wp-content/themes/apex-cv/front-page.php b/backend/wordpress/wp-content/themes/apex-cv/front-page.php new file mode 100644 index 0000000..b9997a0 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/front-page.php @@ -0,0 +1,351 @@ + + + + + + +
+
+ + +
+
+ +

+
+

+ + +
+ +
+ + +
+ +
+
+ + +
+
+ +

+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+

+

+
+ +
+
+ + +
+
+ +

+
+ +
+ +
+
+ + +
+
+

+

+ + + +

+

+ +
    + +
  • + +
+ +
+
+ +
+
+ + +
+
+ +

+
+ +
+ +
+ +
+

+

+ +

+ +
+
+ +
+
+ + +
+
+ +

+
+ +
+ +
+ +
+

+

+
+
+ +
+
+ + +
+
+ +

+
+ +
+ + +
+ +

+

+

+
+ + +
+ +
+ $value) : ?> +
+
+
+
+ +
+
+ + +
+ + +
+ +
+
+ +
+
+ + diff --git a/backend/wordpress/wp-content/themes/apex-cv/functions.php b/backend/wordpress/wp-content/themes/apex-cv/functions.php new file mode 100644 index 0000000..16db93e --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/functions.php @@ -0,0 +1,118 @@ + __('Menú principal', 'apex'), + ]); +} +add_action('after_setup_theme', 'apex_setup'); + +// --------------------------------------------------------------------------- +// Enqueue assets +// --------------------------------------------------------------------------- +function apex_enqueue_assets(): void +{ + wp_enqueue_style( + 'apex-fonts', + 'https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&display=swap', + [], + null + ); + + wp_enqueue_style( + 'apex-theme', + get_template_directory_uri() . '/assets/css/theme.css', + ['apex-fonts'], + wp_get_theme()->get('Version') + ); + + wp_enqueue_script( + 'apex-theme', + get_template_directory_uri() . '/assets/js/theme.js', + [], + wp_get_theme()->get('Version'), + true + ); +} +add_action('wp_enqueue_scripts', 'apex_enqueue_assets'); + +// --------------------------------------------------------------------------- +// Body classes +// --------------------------------------------------------------------------- +function apex_body_classes(array $classes): array +{ + $classes[] = 'apex-shell'; + + if (is_front_page()) { + $classes[] = 'apex-front-page'; + } + + return $classes; +} +add_filter('body_class', 'apex_body_classes'); + +// --------------------------------------------------------------------------- +// Navigation: render sidebar nav list +// --------------------------------------------------------------------------- +function apex_render_nav(): string +{ + $items = [ + '#sobre-mi' => __('Sobre mí', 'apex'), + '#impacto' => __('Impacto', 'apex'), + '#experiencia' => __('Experiencia', 'apex'), + '#formacion' => __('Formación', 'apex'), + '#certificaciones' => __('Certificaciones', 'apex'), + '#contacto' => __('Contacto', 'apex'), + ]; + + $html = '
    '; + foreach ($items as $href => $label) { + $html .= sprintf( + '
  • %s
  • ', + esc_url($href), + esc_attr(ltrim($href, '#')), + esc_html($label) + ); + } + $html .= '
'; + + return $html; +} + +// --------------------------------------------------------------------------- +// Redirect sample page +// --------------------------------------------------------------------------- +function apex_redirect_default_sample_page(): void +{ + if (! is_page()) { + return; + } + + $page = get_queried_object(); + if (! $page instanceof WP_Post) { + return; + } + + if ($page->post_name === 'pagina-ejemplo' || $page->post_name === 'sample-page') { + wp_safe_redirect(home_url('/'), 301); + exit; + } +} +add_action('template_redirect', 'apex_redirect_default_sample_page', 1); diff --git a/backend/wordpress/wp-content/themes/apex-cv/header.php b/backend/wordpress/wp-content/themes/apex-cv/header.php new file mode 100644 index 0000000..69d52e0 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/header.php @@ -0,0 +1,14 @@ + + +> + + + + + +> + + +
diff --git a/backend/wordpress/wp-content/themes/apex-cv/inc/customizer.php b/backend/wordpress/wp-content/themes/apex-cv/inc/customizer.php new file mode 100644 index 0000000..4548bc0 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/inc/customizer.php @@ -0,0 +1,5 @@ + [ + 'name' => 'Patricia Soledad Flores Sánchez', + 'role' => 'Gerente / Jefa de Operaciones Financieras', + 'role2' => 'Sector financiero y microfinanzas', + 'intro' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas. Máster en Dirección y Planificación Financiera, reconocido por la SENECYT en Ecuador, con especialización en gestión operativa, transformación digital de procesos, control interno y liderazgo de equipos multidisciplinarios.', + 'location' => 'Loja, Ecuador', + 'email' => 'patricflorsanchez@gmail.com', + 'phone' => '+593 99 469 8405', + 'linkedin' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/', + 'availability' => 'Inmediata | Presencial / Híbrida / Remota', + 'focus' => 'Operaciones financieras, control interno y transformación digital', + ], + + 'metrics' => [ + ['value' => '22+', 'label' => 'años de experiencia en banca y microfinanzas'], + ['value' => '26', 'label' => 'agencias bajo liderazgo operativo nacional'], + ['value' => '48', 'label' => 'personas a cargo en la estructura operativa'], + ['value' => 'USD 5 M', 'label' => 'en operaciones mensuales de microcrédito'], + ['value' => '28.000', 'label' => 'clientes coordinados en recaudación por canales internos y externos'], + ], + + 'highlights' => [ + ['value' => '9/10', 'label' => 'calificación de gestión con resultado excelente en cuatro trimestres consecutivos'], + ['value' => '74 %', 'label' => 'reducción de requerimientos de soporte desde Dirección por descentralización de procesos'], + ['value' => '1,68 días', 'label' => 'tiempo de desembolso logrado en Q3 2025, mejor resultado del año'], + ['value' => '75 %', 'label' => 'reducción del índice de rotación del área entre 2022 y 2026'], + ], + + 'summary' => [ + 'title' => 'Perfil estratégico con enfoque en eficiencia, control y ejecución sostenible', + 'body' => 'Actualmente lidera la operatividad de 26 agencias a nivel nacional y coordina aproximadamente 1.500 operaciones de microcrédito mensuales, por un monto cercano a USD 5 millones. También articula la recaudación de cerca de 28.000 clientes por canales internos y externos, integrando visión operativa, criterio financiero, disciplina de control y liderazgo sostenido del desempeño.', + ], + + 'impact' => [ + [ + 'title' => 'Transformación digital', + 'body' => 'Lideró desembolsos por transferencia bancaria, integración de APIs bancarias y digitalización de expedientes y pagarés en 13 agencias.', + ], + [ + 'title' => 'Automatización crítica', + 'body' => 'Automatizó el seguro de desgravamen, desde el cálculo de prima hasta la liquidación contable, reduciendo tiempos de 17 a 10 días.', + ], + [ + 'title' => 'Supervisión nacional', + 'body' => 'Implementó una matriz de supervisión y certificación por agencia, elevando el índice de cumplimiento operativo del 65 % al 88 %.', + ], + ], + + 'experience' => [ + [ + 'period' => 'Abr. 2022 – Presente', + 'title' => 'Jefa de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Responsable del desempeño operativo nacional, cumplimiento del POA, control interno, digitalización de procesos y gestión de equipos.', + 'bullets' => [ + 'Cumplimiento del POA: 98 % (Q2 2025), 96 % (Q3 2025), 100 % (Q4 2025) y 105 % (Q1 2026).', + 'La transformación digital logró que los desembolsos por transferencia representen el 47,80 % del monto total en Q1 2026.', + 'Redujo los requerimientos de soporte desde Dirección en un 74 %, de 1.489 a 382, mediante la descentralización de procesos hacia las agencias.', + 'Automatizó el proceso del seguro de desgravamen con cálculo de prima, conciliación mensual, liquidación de siniestros y asientos contables automatizados.', + 'Elevó el índice de cumplimiento operativo nacional del 65 % al 88 % con la matriz de supervisión y certificación por agencia.', + 'Redujo el tiempo de atención del seguro de desgravamen de 17 a 10 días.', + 'Redujo los tiempos de desembolso a 1,68 días en Q3 2025, mejor resultado del año frente a la meta institucional máxima de 2 días.', + 'La efectividad de recuperación de mora alcanzó 90,60 % en Q1 2026, con USD 3,06 millones recuperados sobre USD 3,37 millones en mora.', + 'Redujo el índice de rotación del área del 41,46 % al 10,24 % entre diciembre de 2022 y marzo de 2026 mediante mejoras salariales, remuneración variable, evaluación trimestral y un plan de carrera con certificación de 60 horas para asistentes de caja.', + 'Participa en comités estratégicos, auditorías internas y externas, y en representación institucional ante organismos financieros internacionales de desarrollo.', + ], + ], + [ + 'period' => 'Feb. 2021 – Mar. 2022', + 'title' => 'Supervisora de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Supervisó operaciones de 18 agencias a nivel nacional y regularizó procesos críticos inexistentes o incompletos.', + 'bullets' => [ + 'Reconstruyó desde cero las bases de cálculo del seguro de desgravamen y regularizó pagos pendientes desde enero de 2021.', + 'Elaboró el instructivo de constitución de garantías hipotecarias, proceso que no existía previamente en la institución.', + 'Inició el proyecto de automatización de pagos por depósitos y transferencias.', + ], + ], + [ + 'period' => '2019 – 2021', + 'title' => 'Actualización y formación profesional', + 'company' => 'Formación independiente', + 'location' => 'Ecuador', + 'lead' => 'Etapa enfocada en fortalecimiento técnico y actualización profesional tras su salida de Mutualista Pichincha.', + 'bullets' => [ + 'SAP FI (30 h).', + 'Excel Empresarial (24 h).', + 'Prevención de Lavado de Activos — UAFE (5 h).', + ], + ], + [ + 'period' => 'Ago. 2004 – May. 2019', + 'title' => 'Oficial Operativa Regional / Jefa Operativa', + 'company' => 'Mutualista Pichincha', + 'location' => 'Loja, Ecuador', + 'lead' => 'Trayectoria ascendente de 15 años desde Cajera hasta Jefa Operativa Regional.', + 'bullets' => [ + 'Reconocida a nivel nacional por excelencia en control operativo.', + 'La agencia se mantuvo consistentemente por encima del 80 % en gestión de excepciones de crédito hipotecario.', + 'Administró proyecto inmobiliario institucional en Loja.', + 'Gestionó alertas ALA/FT con 100 % de cumplimiento en comités trimestrales y auditorías internas sin observaciones significativas de forma sostenida.', + ], + ], + [ + 'period' => 'Ene. 2002 – Nov. 2003', + 'title' => 'Cajera', + 'company' => 'Cooperativa de Ahorro y Crédito El Porvenir', + 'location' => 'Loja, Ecuador', + 'lead' => 'Inicio de carrera en el frente operativo financiero con disciplina de caja y apoyo contable.', + 'bullets' => [ + 'Gestión de caja sin faltantes ni sobrantes.', + 'Contrato renovado de forma anticipada a los tres meses.', + 'Apoyo al área de Contabilidad y reemplazo temporal de la contadora durante vacaciones.', + ], + ], + ], + + 'education' => [ + [ + 'year' => '2021', + 'title' => 'Máster Universitario en Dirección y Planificación Financiera', + 'institution' => 'Universidad Europea Miguel de Cervantes — Valladolid, España', + 'detail' => 'Título reconocido por la SENECYT — Ecuador, febrero de 2023 | Reg. 2021/394270.', + ], + [ + 'year' => '2007', + 'title' => 'Ingeniera en Administración en Banca y Finanzas', + 'institution' => 'Universidad Técnica Particular de Loja (UTPL)', + 'detail' => '', + ], + ], + + 'certifications' => [ + ['year' => '2026', 'title' => 'Mujeres que Lideran: Alta Gerencia', 'issuer' => 'Foro UNIR — Universidad Internacional de La Rioja'], + ['year' => '2025', 'title' => 'Programa Internacional de Habilidades Gerenciales (48 h)', 'issuer' => 'IDEASGROUP — Ecuador / México'], + ['year' => '2025', 'title' => 'Transforma tu Trabajo con Inteligencia Artificial (12 h)', 'issuer' => 'Red de Instituciones Financieras de Desarrollo'], + ['year' => '2025', 'title' => 'Excel: Básico a Dashboard (40 h)', 'issuer' => 'DMARURI Training & Consulting'], + ['year' => '2024', 'title' => 'Administración por Procesos — BPM (64 h)', 'issuer' => 'Escuela Politécnica Nacional — CEC'], + ['year' => '2023', 'title' => 'Formación de Formadores (80 h)', 'issuer' => 'Ministerio del Trabajo del Ecuador | Certificación vigente hasta 2028'], + ['year' => '2023', 'title' => 'Power BI (40 h) | Indicadores Clave de Desempeño — KPI (12 h)', 'issuer' => 'Liderazgo Capacitación & Eventos'], + ['year' => '2020', 'title' => 'Gestión Financiera ERP SAP FI — Key User (30 h)', 'issuer' => 'Socio SAP certificado'], + ['year' => '2020', 'title' => 'Prevención de Lavado de Activos y Financiamiento de Delitos', 'issuer' => 'UAFE — Ecuador'], + ['year' => '2013', 'title' => 'Tributación Integral (36 h)', 'issuer' => 'Universidad Técnica Particular de Loja'], + ], + + 'competencies' => [ + 'Finanzas y Operaciones' => [ + ['name' => 'Gestión de operaciones financieras', 'pct' => 98], + ['name' => 'Conciliación bancaria', 'pct' => 97], + ['name' => 'Originación de crédito', 'pct' => 95], + ['name' => 'Gestión de cartera', 'pct' => 95], + ['name' => 'Control interno', 'pct' => 96], + ['name' => 'Tesorería operativa', 'pct' => 94], + ['name' => 'Microfinanzas', 'pct' => 97], + ['name' => 'ALA/FT', 'pct' => 95], + ], + 'Tecnología y Procesos' => [ + ['name' => 'Transformación digital', 'pct' => 92], + ['name' => 'BPM', 'pct' => 88], + ['name' => 'Integración de APIs / Web Services','pct' => 82], + ['name' => 'SAP FI', 'pct' => 80], + ['name' => 'Excel avanzado y dashboards', 'pct' => 90], + ['name' => 'Power BI', 'pct' => 85], + ['name' => 'IA aplicada', 'pct' => 78], + ['name' => 'Core financiero', 'pct' => 93], + ], + 'Liderazgo' => [ + ['name' => 'Equipos de hasta 48 personas', 'pct' => 95], + ['name' => 'Remuneración variable', 'pct' => 90], + ['name' => 'Gestión del cambio', 'pct' => 92], + ['name' => 'Formación de formadores', 'pct' => 88], + ['name' => 'Diversidad, equidad e inclusión', 'pct' => 87], + ], + ], + + 'volunteer' => [ + 'title' => 'Voluntaria — Hogar San Camilo de Lellis', + 'year' => '2025', + 'body' => 'Hogar de niñas con discapacidad | Loja, Ecuador. Alineado a la visión y misión de responsabilidad social de la Fundación FACES Microfinanzas.', + ], + + 'additional' => [ + 'Idiomas' => 'Español nativo | Inglés básico en formación activa', + 'Disponibilidad' => 'Inmediata | Presencial / Híbrida / Remota', + 'C.I.' => '1103591648', + 'Fecha de nacimiento'=> '3 de agosto de 1980', + 'Web profesional' => 'pflores.linkedcorp.net', + ], + ]; +} diff --git a/backend/wordpress/wp-content/themes/apex-cv/inc/visits.php b/backend/wordpress/wp-content/themes/apex-cv/inc/visits.php new file mode 100644 index 0000000..2caeb12 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/inc/visits.php @@ -0,0 +1,130 @@ + 0) { + $views = (int) get_post_meta($frontPage, '_apex_views', true); + update_post_meta($frontPage, '_apex_views', $views + 1); + } + + return; + } + + $postId = get_queried_object_id(); + if ($postId > 0) { + $views = (int) get_post_meta($postId, '_apex_views', true); + update_post_meta($postId, '_apex_views', $views + 1); + } +} +add_action('template_redirect', 'apex_track_visit'); + +function apex_get_client_ip(): string +{ + $keys = [ + 'HTTP_X_FORWARDED_FOR', + 'HTTP_CLIENT_IP', + 'REMOTE_ADDR', + ]; + + foreach ($keys as $key) { + if (! empty($_SERVER[$key])) { + $value = explode(',', (string) $_SERVER[$key]); + return trim($value[0]); + } + } + + return '0.0.0.0'; +} + +// --------------------------------------------------------------------------- +// Dashboard widget +// --------------------------------------------------------------------------- + +function apex_register_visits_dashboard_widget(): void +{ + wp_add_dashboard_widget( + 'apex_visits_widget', + __('Apex CV: Visitas', 'apex'), + 'apex_render_visits_dashboard_widget' + ); +} +add_action('wp_dashboard_setup', 'apex_register_visits_dashboard_widget'); + +function apex_render_visits_dashboard_widget(): void +{ + $total = (int) get_option('apex_total_visits', 0); + $frontPage = (int) get_option('page_on_front'); + $frontViews = $frontPage > 0 ? (int) get_post_meta($frontPage, '_apex_views', true) : 0; + ?> +
+

+

+

+
+ +
+
+ + +
> +

+
+ +
+
+ + +

+ +
+
+ diff --git a/backend/wordpress/wp-content/themes/apex-cv/style.css b/backend/wordpress/wp-content/themes/apex-cv/style.css new file mode 100644 index 0000000..4ed22b4 --- /dev/null +++ b/backend/wordpress/wp-content/themes/apex-cv/style.css @@ -0,0 +1,9 @@ +/* +Theme Name: Apex CV +Theme URI: https://pflores.linkedcorp.net +Description: Tema oscuro y elegante. Sidebar fijo izquierdo, paleta dark con acento cian. +Version: 1.0.0 +Requires at least: 6.8 +Requires PHP: 8.1 +Text Domain: apex +*/ diff --git a/backend/wordpress/wp-content/themes/lumina b/backend/wordpress/wp-content/themes/lumina new file mode 120000 index 0000000..c28285b --- /dev/null +++ b/backend/wordpress/wp-content/themes/lumina @@ -0,0 +1 @@ +/home/mgonzalez/desarrollo/web/pflores.linkedcorp.net/frontend/lumina-cv-theme \ No newline at end of file diff --git a/backend/wordpress/wp-content/themes/persona-cv b/backend/wordpress/wp-content/themes/persona-cv new file mode 120000 index 0000000..5bb0adc --- /dev/null +++ b/backend/wordpress/wp-content/themes/persona-cv @@ -0,0 +1 @@ +/home/mgonzalez/desarrollo/web/pflores.linkedcorp.net/frontend/persona-cv-theme \ No newline at end of file diff --git a/docs/instalacion-wordpress.md b/docs/instalacion-wordpress.md index 6a444f4..91c79fa 100644 --- a/docs/instalacion-wordpress.md +++ b/docs/instalacion-wordpress.md @@ -1,31 +1,45 @@ # Instalación local -## Puerto +## Acceso -El primer puerto libre detectado fue `8081`. +| Desde | URL | +|---|---| +| Este equipo | `http://127.0.0.1:8081` | +| Red local | `http://192.168.222.40:8081` | +| Admin WP | `http://192.168.222.40:8081/wp-admin` | -## Requisitos faltantes en este entorno +## Arranque -Para que WordPress quede ejecutable aquí mismo, el sistema necesita: +```bash +bash backend/start-wordpress.sh +``` -- PHP con `mysqli` o `pdo_mysql` -- PHP con `dom/xml` -- Recomendado: `mbstring`, `curl`, `gd`, `zip` -- Un servidor MariaDB/MySQL activo o credenciales de una base existente +El servidor escucha en `0.0.0.0:8081` (todas las interfaces). La URL se genera dinámicamente según el host de la petición, por lo que funciona desde cualquier IP sin cambiar configuración. + +## Temas disponibles + +| Slug | Descripción | +|---|---| +| `persona-cv` | **Activo** — Una página, Personage-style, rojo, timeline central | +| `lumina` | Claro, teal+ámbar, sidebar izquierdo | +| `apex-cv` | Oscuro, cian eléctrico, sidebar fijo izquierdo | +| `cvolio` | Oscuro clásico, glassmorphism, paleta café | + +Para cambiar de tema: +```sql +UPDATE cv_options SET option_value = 'slug-del-tema' +WHERE option_name IN ('template','stylesheet'); +``` ## Archivos clave -- Configuración principal: `backend/wordpress/wp-config.php` -- Tema editable: `frontend/cvfolio-theme` +- Configuración: `backend/wordpress/wp-config.php` +- Temas: `frontend/*/` +- Variables de entorno: `.env` - Script de arranque: `backend/start-wordpress.sh` -## Uso del tema +## Requisitos -1. Activa el tema `CVolio`. -2. Crea una página de inicio y asígnala como portada. -3. Edita el contenido principal con bloques de WordPress. -4. Personaliza cabecera, contacto y habilidades desde `Apariencia > Personalizar`. - -## Siguiente paso recomendado - -Instalar las extensiones PHP faltantes y levantar MariaDB local, o apuntar WordPress a una base existente. +- PHP con `mysqli` y `dom` +- Recomendado: `mbstring`, `curl`, `gd`, `zip` +- Base de datos MariaDB en `192.168.222.20` diff --git a/frontend/cvfolio-theme/assets/css/theme.css b/frontend/cvfolio-theme/assets/css/theme.css index d4d0a7f..de58936 100644 --- a/frontend/cvfolio-theme/assets/css/theme.css +++ b/frontend/cvfolio-theme/assets/css/theme.css @@ -1,16 +1,20 @@ :root { - --bg: #f4efe7; - --bg-strong: #eadfd1; - --surface: rgba(255, 255, 255, 0.78); - --surface-strong: #fffdf8; - --text: #1f1d1a; - --muted: #6f685f; - --line: rgba(31, 29, 26, 0.1); - --accent: #d4582b; - --accent-dark: #9f3814; - --accent-soft: #f6c9ae; - --shadow: 0 24px 60px rgba(89, 57, 32, 0.12); - --radius-lg: 28px; + --bg: #ece8e1; + --bg-soft: #f7f5f0; + --surface: rgba(255, 255, 255, 0.82); + --surface-strong: #ffffff; + --surface-dark: #10161d; + --text: #17202a; + --muted: #5d6773; + --line: rgba(23, 32, 42, 0.1); + --accent: #9a7b4f; + --accent-strong: #7b5f39; + --accent-soft: #ece2d1; + --deep: #13202d; + --success: #2f6c60; + --shadow: 0 24px 60px rgba(16, 22, 29, 0.08); + --radius-xl: 32px; + --radius-lg: 24px; --radius-md: 18px; --radius-sm: 999px; --container: 1180px; @@ -28,12 +32,11 @@ html { body { margin: 0; - font-family: "Outfit", sans-serif; color: var(--text); + font-family: "Manrope", sans-serif; background: - radial-gradient(circle at top left, rgba(212, 88, 43, 0.14), transparent 34%), - radial-gradient(circle at right 20%, rgba(135, 148, 255, 0.12), transparent 24%), - linear-gradient(180deg, #f6f1e8 0%, #f9f6f1 48%, #efe5d8 100%); + radial-gradient(circle at top left, rgba(154, 123, 79, 0.15), transparent 26%), + linear-gradient(180deg, #f8f6f2 0%, #f0ece5 46%, #e6e0d5 100%); } a { @@ -41,13 +44,18 @@ a { text-decoration: none; } +img { + max-width: 100%; +} + .site-bg { position: fixed; inset: 0; - background-image: linear-gradient(rgba(31, 29, 26, 0.03) 1px, transparent 1px), - linear-gradient(90deg, rgba(31, 29, 26, 0.03) 1px, transparent 1px); - background-size: 24px 24px; - mask-image: radial-gradient(circle at center, black 45%, transparent 90%); + background: + linear-gradient(rgba(19, 32, 45, 0.028) 1px, transparent 1px), + linear-gradient(90deg, rgba(19, 32, 45, 0.028) 1px, transparent 1px); + background-size: 28px 28px; + mask-image: radial-gradient(circle at center, black 38%, transparent 86%); pointer-events: none; } @@ -67,19 +75,19 @@ a { } .site-header { - padding: 1.2rem 0 0; + padding-top: 1.2rem; } .site-header__inner { - display: flex; + display: grid; + grid-template-columns: auto 1fr auto; align-items: center; - justify-content: space-between; gap: 1rem; - padding: 1rem 1.25rem; - border: 1px solid var(--line); + padding: 0.95rem 1.2rem; + border: 1px solid rgba(19, 32, 45, 0.08); border-radius: var(--radius-sm); - background: rgba(255, 253, 248, 0.78); - backdrop-filter: blur(18px); + background: rgba(255, 255, 255, 0.72); + backdrop-filter: blur(16px); box-shadow: var(--shadow); } @@ -87,94 +95,182 @@ a { h1, h2, h3 { - font-family: "Fraunces", serif; + font-family: "Cormorant Garamond", serif; } .site-brand { - font-size: 1.1rem; + font-size: 1.5rem; font-weight: 700; + letter-spacing: 0.02em; } -.site-nav-toggle { - display: none; - border: 0; - border-radius: var(--radius-sm); - background: var(--accent); - color: #fff; - padding: 0.85rem 1rem; - font: inherit; +.site-nav { + justify-self: center; } .site-nav__menu { display: flex; align-items: center; - gap: 1rem; + justify-content: center; + gap: 1.1rem; + list-style: none; padding: 0; margin: 0; - list-style: none; } .site-nav__menu a { color: var(--muted); - font-weight: 500; + font-size: 0.95rem; + font-weight: 600; +} + +.site-nav__menu a:hover, +.site-nav__menu a:focus-visible { + color: var(--text); +} + +.site-nav-toggle, +.site-print, +.btn, +.cv-chip, +.skill-pill { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 44px; + border-radius: var(--radius-sm); + font: inherit; +} + +.site-nav-toggle { + display: none; + border: 0; + padding: 0.75rem 1rem; + background: var(--deep); + color: #fff; +} + +.site-print { + border: 1px solid rgba(19, 32, 45, 0.12); + background: rgba(255, 255, 255, 0.7); + color: var(--text); + padding: 0.7rem 1rem; + cursor: pointer; } .hero { display: grid; - grid-template-columns: minmax(0, 1.55fr) minmax(300px, 0.95fr); + grid-template-columns: minmax(0, 1.6fr) minmax(320px, 0.9fr); gap: 1.5rem; - padding: 2rem 0 1.5rem; + padding: 1.8rem 0; } .hero__copy, .profile-card, .content-card, .side-card { - border: 1px solid rgba(31, 29, 26, 0.08); + border: 1px solid rgba(19, 32, 45, 0.08); background: var(--surface); backdrop-filter: blur(14px); box-shadow: var(--shadow); } .hero__copy { - padding: 2rem; + position: relative; + overflow: hidden; + padding: 2.1rem; border-radius: 40px; } +.hero__copy::after { + content: ""; + position: absolute; + right: -80px; + bottom: -80px; + width: 260px; + height: 260px; + border-radius: 50%; + background: radial-gradient(circle, rgba(154, 123, 79, 0.14), transparent 68%); +} + .eyebrow { - margin: 0 0 1rem; - font-size: 0.82rem; + margin: 0 0 0.9rem; + color: var(--accent-strong); + font-size: 0.8rem; + font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; - color: var(--accent-dark); } .hero h1 { margin: 0; - font-size: clamp(2.6rem, 5vw, 5.5rem); - line-height: 0.95; + font-size: clamp(3.1rem, 6vw, 5.5rem); + line-height: 0.92; + letter-spacing: -0.03em; } .hero__role { margin: 1rem 0 0; - font-size: clamp(1.2rem, 2vw, 1.6rem); - color: var(--accent-dark); + color: var(--deep); + font-size: clamp(1.2rem, 2vw, 1.55rem); + font-weight: 700; } .hero__intro, .entry-content, -.side-card p { +.side-card p, +.timeline__item p, +.demo-panel li, +.profile-card__label, +.profile-card__highlights span, +.metric-card span, +.achievement-card span { color: var(--muted); - line-height: 1.7; - font-size: 1rem; + line-height: 1.75; } +.hero__intro { + max-width: 58ch; + margin-top: 1rem; +} + +.hero__metrics, .hero__actions, .chip-grid, -.skill-cloud { +.skill-cloud, +.contact-stack { display: flex; flex-wrap: wrap; - gap: 0.8rem; + gap: 0.85rem; +} + +.hero__metrics { + margin-top: 1.5rem; +} + +.hero__metrics--wide .metric-card { + flex: 1 1 180px; +} + +.metric-card { + min-width: 170px; + padding: 1rem 1.05rem; + border-radius: 22px; + background: rgba(255, 255, 255, 0.7); + border: 1px solid rgba(19, 32, 45, 0.08); +} + +.hero__metrics--wide { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.metric-card strong, +.achievement-card strong { + display: block; + color: var(--deep); + font-size: 1.5rem; + font-weight: 800; } .hero__actions { @@ -184,59 +280,121 @@ h3 { .btn, .cv-chip, .skill-pill { - display: inline-flex; - align-items: center; - justify-content: center; - min-height: 44px; padding: 0.75rem 1.05rem; - border-radius: var(--radius-sm); +} + +.btn { + border: 0; + cursor: pointer; } .btn--primary { - background: var(--accent); + background: var(--deep); color: #fff; - font-weight: 600; + font-weight: 700; +} + +.btn--secondary { + border: 1px solid rgba(19, 32, 45, 0.12); + background: rgba(255, 255, 255, 0.6); + color: var(--text); } .cv-chip, .skill-pill { - background: rgba(255, 255, 255, 0.8); - border: 1px solid rgba(31, 29, 26, 0.08); - color: var(--text); + border: 1px solid rgba(19, 32, 45, 0.08); + background: rgba(255, 255, 255, 0.78); } .profile-card { - border-radius: 30px; - padding: 1.5rem; height: 100%; + padding: 1.45rem; + border-radius: 30px; +} + +.profile-card__media { + margin-bottom: 1.2rem; + border-radius: 24px; + overflow: hidden; + background: + radial-gradient(circle at top left, rgba(154, 123, 79, 0.2), transparent 40%), + linear-gradient(180deg, #f9f5ef 0%, #ede4d7 100%); } .profile-card__label { - margin: 0 0 0.5rem; - color: var(--muted); - font-size: 0.95rem; + margin: 0 0 0.45rem; + font-size: 0.92rem; } .profile-card h2, .side-card h2, -.entry-title { +.entry-title, +.demo-section h2 { margin: 0 0 1rem; - font-size: clamp(1.5rem, 2vw, 2rem); + font-size: clamp(1.9rem, 3vw, 2.45rem); + line-height: 1.04; +} + +.profile-card__highlights { + display: grid; + gap: 0.8rem; + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid rgba(19, 32, 45, 0.08); +} + +.profile-card__highlights strong { + display: block; + margin-top: 0.15rem; +} + +.profile-card__contact { + display: flex; + flex-wrap: wrap; + gap: 0.65rem; +} + +.profile-card--executive .profile-card__media--portrait { + aspect-ratio: 4 / 4.35; +} + +.profile-card--executive .profile-card__media--portrait img { + width: 100%; + height: 100%; + object-fit: cover; } .content-wrap { display: grid; - padding: 0 0 2rem; + padding-bottom: 2rem; } .content-wrap--front { - grid-template-columns: minmax(0, 1.5fr) minmax(280px, 0.8fr); + grid-template-columns: minmax(0, 1.48fr) minmax(290px, 0.82fr); gap: 1.5rem; } .content-card { - border-radius: 32px; padding: 2rem; + border-radius: var(--radius-xl); +} + +.content-card--resume { + padding: 2.2rem; +} + +.resume-section + .resume-section { + margin-top: 2.6rem; +} + +.section-head { + display: grid; + gap: 0.35rem; + margin-bottom: 1.15rem; +} + +.lead-copy { + font-size: 1.08rem; } .entry-content > *:first-child { @@ -245,23 +403,213 @@ h3 { .entry-content h2, .entry-content h3 { - margin-top: 1.8rem; - margin-bottom: 0.75rem; -} - -.entry-content .wp-block-group, -.entry-content .wp-block-columns, -.entry-content .wp-block-cover, -.entry-content .wp-block-media-text { - margin-top: 1.5rem; - margin-bottom: 1.5rem; + margin-top: 1.6rem; + margin-bottom: 0.8rem; } .entry-content .wp-block-group.cv-section { padding: 1.5rem; + border-radius: 22px; + background: rgba(255, 255, 255, 0.58); + border: 1px solid rgba(19, 32, 45, 0.08); +} + +.demo-section + .demo-section, +.demo-section + .demo-grid, +.demo-grid + .demo-section { + margin-top: 2rem; +} + +.achievement-grid, +.demo-grid { + display: grid; + gap: 1rem; +} + +.achievement-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.achievement-card, +.timeline__item, +.demo-panel { + padding: 1.25rem; + border: 1px solid rgba(19, 32, 45, 0.08); border-radius: 24px; - background: rgba(255, 255, 255, 0.52); - border: 1px solid rgba(31, 29, 26, 0.08); + background: rgba(255, 255, 255, 0.68); +} + +.achievement-card { + background: linear-gradient(180deg, rgba(19, 32, 45, 0.96) 0%, rgba(24, 39, 55, 0.96) 100%); +} + +.achievement-grid--executive { + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin-bottom: 1rem; +} + +.achievement-card strong, +.achievement-card span { + color: #fff; +} + +.achievement-card--stat { + min-height: 172px; +} + +.impact-grid, +.credentials-grid { + display: grid; + gap: 1rem; +} + +.impact-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.impact-card, +.credential-card, +.cert-item { + padding: 1.25rem; + border: 1px solid rgba(19, 32, 45, 0.08); + border-radius: 22px; + background: rgba(255, 255, 255, 0.74); +} + +.impact-card h3, +.credential-card h3, +.cert-item h3, +.competency-block h3 { + margin: 0 0 0.55rem; + font-size: 1.2rem; +} + +.credentials-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.credential-card__year, +.cert-item__year { + display: inline-flex; + margin-bottom: 0.9rem; + padding: 0.3rem 0.7rem; + border-radius: var(--radius-sm); + background: var(--accent-soft); + color: var(--accent-strong); + font-size: 0.8rem; + font-weight: 800; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +.credential-card__detail, +.side-card__meta, +.timeline__meta, +.cert-item p { + color: var(--muted); +} + +.timeline__meta { + margin-top: -0.15rem; + margin-bottom: 0.75rem; + font-weight: 700; +} + +.timeline__bullets { + margin: 0.9rem 0 0; + padding-left: 1rem; + color: var(--muted); + line-height: 1.7; +} + +.timeline__bullets li + li { + margin-top: 0.45rem; +} + +.cert-list { + display: grid; + gap: 0.9rem; +} + +.cert-item { + display: grid; + grid-template-columns: 92px 1fr; + gap: 1rem; + align-items: start; +} + +.cert-item__year { + justify-content: center; + width: 100%; + margin-bottom: 0; +} + +.timeline { + position: relative; + display: grid; + gap: 1rem; +} + +.timeline::before { + content: ""; + position: absolute; + top: 0.5rem; + bottom: 0.5rem; + left: 0.75rem; + width: 1px; + background: rgba(154, 123, 79, 0.4); +} + +.timeline__item { + position: relative; + padding-left: 2.25rem; +} + +.timeline__item::before { + content: ""; + position: absolute; + top: 1.2rem; + left: 0.35rem; + width: 0.8rem; + height: 0.8rem; + border-radius: 50%; + background: var(--accent); + box-shadow: 0 0 0 6px rgba(154, 123, 79, 0.18); +} + +.timeline__year { + display: inline-flex; + margin-bottom: 0.75rem; + padding: 0.36rem 0.78rem; + border-radius: var(--radius-sm); + background: var(--accent-soft); + color: var(--accent-strong); + font-size: 0.82rem; + font-weight: 800; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.timeline__item h3 { + margin: 0 0 0.45rem; + font-size: 1.35rem; +} + +.timeline__item--rich { + padding-right: 1.2rem; +} + +.demo-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.demo-panel ul { + margin: 0; + padding-left: 1.05rem; +} + +.demo-panel--accent { + background: linear-gradient(180deg, rgba(236, 226, 209, 0.75), rgba(255, 255, 255, 0.72)); } .side-stack { @@ -270,42 +618,157 @@ h3 { align-content: start; } +.side-stack--resume { + position: sticky; + top: 1.5rem; + align-self: start; +} + .side-card { - padding: 1.5rem; - border-radius: 26px; + padding: 1.45rem; + border-radius: 28px; +} + +.side-card--business-card { + background: linear-gradient(180deg, rgba(19, 32, 45, 0.98) 0%, rgba(20, 31, 43, 0.98) 100%); + color: #fff; +} + +.side-card--business-card .eyebrow, +.side-card--business-card p, +.side-card--business-card h2 { + color: #fff; +} + +.competency-block + .competency-block { + margin-top: 1.25rem; +} + +.skill-cloud { + gap: 0.75rem; +} + +.skill-pill { + color: var(--text); + font-weight: 600; } .site-footer { - padding: 0 0 2.5rem; + padding-bottom: 2rem; } .site-footer__inner { - padding: 1rem 0; + padding: 0.8rem 0; color: var(--muted); text-align: center; } -@media (max-width: 920px) { - .hero, - .content-wrap--front { - grid-template-columns: 1fr; +.info-list { + display: grid; + gap: 0.95rem; + margin: 0 0 1.2rem; +} + +.info-list div { + display: grid; + gap: 0.2rem; +} + +.info-list dt { + color: var(--accent-strong); + font-size: 0.82rem; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.info-list dd { + margin: 0; + color: var(--text); +} + +.business-card { + padding: 1rem; + border-radius: 22px; + background: + radial-gradient(circle at top left, rgba(154, 123, 79, 0.35), transparent 34%), + linear-gradient(160deg, rgba(255, 255, 255, 0.09), rgba(255, 255, 255, 0.04)); + border: 1px solid rgba(255, 255, 255, 0.12); +} + +.business-card__top { + margin-bottom: 1rem; +} + +.business-card__name { + margin: 0; + font-family: "Cormorant Garamond", serif; + font-size: 1.55rem; + font-weight: 700; + line-height: 1; +} + +.business-card__role { + margin: 0.45rem 0 0; + color: rgba(255, 255, 255, 0.82); + font-size: 0.94rem; + line-height: 1.5; +} + +.business-card__body { + display: grid; + grid-template-columns: 110px 1fr; + gap: 1rem; + align-items: center; +} + +.business-card__qr { + padding: 0.55rem; + border-radius: 18px; + background: #fff; +} + +.business-card__qr img { + display: block; + width: 100%; + height: auto; +} + +.business-card__info { + display: grid; + gap: 0.35rem; +} + +.business-card__info p, +.business-card__info a { + margin: 0; + color: rgba(255, 255, 255, 0.88); + word-break: break-word; +} + +@media (max-width: 980px) { + .site-header__inner { + grid-template-columns: auto auto; } .site-nav-toggle { display: inline-flex; + justify-self: end; + } + + .site-print { + order: 4; + grid-column: 1 / -1; + justify-self: start; } .site-nav { - position: absolute; - top: calc(100% + 0.75rem); - right: 1rem; - left: 1rem; + grid-column: 1 / -1; display: none; - padding: 1rem; - border: 1px solid var(--line); - border-radius: 20px; - background: rgba(255, 253, 248, 0.96); - box-shadow: var(--shadow); + padding: 0.95rem; + border-radius: 18px; + border: 1px solid rgba(19, 32, 45, 0.08); + background: rgba(255, 255, 255, 0.92); } .site-nav.is-open { @@ -313,29 +776,96 @@ h3 { } .site-nav__menu { - flex-direction: column; align-items: flex-start; + flex-direction: column; + } + + .hero, + .content-wrap--front { + grid-template-columns: 1fr; + } + + .achievement-grid { + grid-template-columns: 1fr; + } + + .hero__metrics--wide { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .impact-grid, + .credentials-grid { + grid-template-columns: 1fr; + } + + .side-stack--resume { + position: static; } } @media (max-width: 640px) { - .site-header__inner, - .hero__copy, - .profile-card, - .content-card, - .side-card { - border-radius: 24px; - } - .site-header__inner, .hero__copy, .profile-card, .content-card, .side-card { padding: 1.2rem; + border-radius: 22px; } .hero h1 { - font-size: 2.5rem; + font-size: 2.75rem; + } + + .metric-card { + min-width: unset; + width: 100%; + } + + .hero__metrics--wide { + grid-template-columns: 1fr; + } + + .demo-grid { + grid-template-columns: 1fr; + } + + .cert-item { + grid-template-columns: 1fr; + } + + .business-card__body { + grid-template-columns: 1fr; + } +} + +@media print { + .site-header, + .site-footer, + .site-bg, + .hero__actions, + .site-print, + .site-nav-toggle { + display: none !important; + } + + body { + background: #fff; + } + + .hero, + .content-wrap--front { + grid-template-columns: 1fr; + } + + .hero__copy, + .profile-card, + .content-card, + .side-card, + .timeline__item, + .demo-panel, + .achievement-card { + box-shadow: none; + background: #fff; } } diff --git a/frontend/cvfolio-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx b/frontend/cvfolio-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx new file mode 100644 index 0000000000000000000000000000000000000000..544bf3d781cd85ddc8becbc624bf639c8ba6fe11 GIT binary patch literal 19375 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

}m|)H;34nU|q@|s4__NYn(gcG+~g* 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 literal 0 HcmV?d00001 diff --git a/frontend/cvfolio-theme/assets/images/patricia-flores-qr.png b/frontend/cvfolio-theme/assets/images/patricia-flores-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..55703ad812dff9f68d5f2e853e2b507c27c2c478 GIT binary patch literal 535 zcmV+y0_gpTP)00006P)t-s|Ns90 z0033O(|!N|010qNS#tmY4#WTe4#WYKD-Ig~00Fm2L_t(|obB2%u7fZP24EuwMvjo9 za5OktkHQf;c6h2^?AS>tm7c0c3d8RykdIDQoVX$SC}uA4@RwtJScrPQ(^Snrp`lyo zr;|SF5E1{V))2iofQD|R2c1w|M;AXM(VfoUprOB^gNy_PStAJ=`r=x4lUm+Gsq@g# z&9#MRtUd%mw#GVuhHj&|M77skby0C?z?$t=%aPc*qEO-NL?b$ z&oP#F-3dtQLPNLF@-oDiIXEY3uY=hSKG4t?&@l$CqSSe|2IoSS->J?+Lm#Z?bV9!g z8X~F_wcplxXy_)I$Plx4DlJl-*Lal54-I{;&iQShSzoh?mz^mzbSqslHrIL92_5X} zJT&y-I%h0znnM$_UmJpkzLMtLTi?e+n@hA`W1*q{ueT9=ew8OH`0}s#+m<{u^bvaA zB&KM3x!1dN)p-XR`fRUM;qk%414pXz2D@!|qht z^4a-EZ*KuZL!YWMV!y{hI$VATKs002ovPDHLkV1nW!_Bj9m literal 0 HcmV?d00001 diff --git a/frontend/cvfolio-theme/assets/images/profile-placeholder.svg b/frontend/cvfolio-theme/assets/images/profile-placeholder.svg new file mode 100644 index 0000000..3d7dbb0 --- /dev/null +++ b/frontend/cvfolio-theme/assets/images/profile-placeholder.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/frontend/cvfolio-theme/assets/js/theme.js b/frontend/cvfolio-theme/assets/js/theme.js index 75207ac..fff06f3 100644 --- a/frontend/cvfolio-theme/assets/js/theme.js +++ b/frontend/cvfolio-theme/assets/js/theme.js @@ -1,6 +1,7 @@ document.addEventListener("DOMContentLoaded", () => { const toggle = document.querySelector(".site-nav-toggle"); const nav = document.querySelector(".site-nav"); + const printButtons = document.querySelectorAll("[data-cvolio-print]"); if (toggle && nav) { toggle.addEventListener("click", () => { @@ -9,4 +10,10 @@ document.addEventListener("DOMContentLoaded", () => { nav.classList.toggle("is-open", !expanded); }); } + + printButtons.forEach((button) => { + button.addEventListener("click", () => { + window.print(); + }); + }); }); diff --git a/frontend/cvfolio-theme/front-page.php b/frontend/cvfolio-theme/front-page.php index ae43fcd..bede85f 100644 --- a/frontend/cvfolio-theme/front-page.php +++ b/frontend/cvfolio-theme/front-page.php @@ -4,64 +4,235 @@ declare(strict_types=1); get_header(); -$hero_name = get_theme_mod('cvolio_hero_name', get_bloginfo('name')); -$hero_role = get_theme_mod('cvolio_hero_role', __('Profesional creativo y estratega digital', 'cvolio')); -$hero_intro = get_theme_mod('cvolio_hero_intro', __('Presenta tu experiencia, logros, proyectos y propuesta de valor con un formato claro, elegante y listo para cualquier dispositivo.', 'cvolio')); -$hero_location = get_theme_mod('cvolio_contact_location', 'Guayaquil, Ecuador'); -$hero_email = get_theme_mod('cvolio_contact_email', 'hola@ejemplo.com'); -$hero_phone = get_theme_mod('cvolio_contact_phone', '+593 999 999 999'); -$hero_cta_label = get_theme_mod('cvolio_hero_cta_label', __('Ver experiencia', 'cvolio')); -$hero_cta_url = get_theme_mod('cvolio_hero_cta_url', '#perfil'); -$skills = array_filter(array_map('trim', explode(',', (string) get_theme_mod('cvolio_skills_list', 'UX Strategy, Liderazgo, Frontend, WordPress, SEO, Analitica')))); -$linkedin = get_theme_mod('cvolio_social_linkedin', ''); -$github = get_theme_mod('cvolio_social_github', ''); -$portfolio = get_theme_mod('cvolio_social_portfolio', ''); +$cv = function_exists('pflores_get_cv_data') ? pflores_get_cv_data() : cvolio_cv_data(); +$hero = $cv['hero']; +$metrics = $cv['metrics']; +$highlights = $cv['highlights']; +$summary = $cv['summary']; +$impact = $cv['impact']; +$experience = $cv['experience']; +$education = $cv['education']; +$certifications = $cv['certifications']; +$competencies = $cv['competencies']; +$volunteer = $cv['volunteer']; +$additional = $cv['additional']; +$qrImage = get_template_directory_uri() . '/assets/images/patricia-flores-qr.png'; +$publicUrl = 'https://pflores.linkedcorp.net'; + +$heroName = $hero['name']; +$heroRole = $hero['role']; +$heroIntro = $hero['intro']; +$heroLocation = $hero['location']; +$heroEmail = $hero['email']; +$heroPhone = $hero['phone']; +$heroCtaLabel = 'Ver trayectoria'; +$heroCtaUrl = '#experiencia'; +$linkedin = $hero['linkedin']; +// Compatibilidad CVolio: skills como array plano para pills +$skillsFlat = []; +foreach ($competencies as $groupItems) { + foreach ((array) $groupItems as $item) { + $skillsFlat[] = is_array($item) ? ($item['name'] ?? '') : (string) $item; + } +} +$skills = array_filter($skillsFlat); +$acfPhoto = $cv['photo'] ?? ''; +$profileImage = $acfPhoto ?: get_template_directory_uri() . '/assets/images/patricia-flores-profile.jpeg'; +$cvFile = get_template_directory_uri() . '/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx'; ?> -

+
-

-

-

-

+

+

+

+

+ +
+ +
+ + +
+ +
+
- - + + - + + + +
-
-
+
+
+
+
+

+

+
+

+
+ +
+
+

+

+
+ +
+ +
+ + +
+ +
+ +
+ +
+

+

+
+ +
+
+ +
+
+

+

+
+ +
+ +
+ +
+

+

+

+
    + +
  • + +
+
+
+ +
+
+ +
+
+

+

+
+ +
+ +
+ +

+

+ +

+ +
+ +
+
+ +
+
+

+

+
+ +
+ +
+ +
+

+

+
+
+ +
+
+ -
> -
- -
-
+ +
+
+

+

+
+
+ +
+
+
-
diff --git a/frontend/cvfolio-theme/functions.php b/frontend/cvfolio-theme/functions.php index ac20564..7d2eca5 100644 --- a/frontend/cvfolio-theme/functions.php +++ b/frontend/cvfolio-theme/functions.php @@ -3,7 +3,9 @@ declare(strict_types=1); require_once get_template_directory() . '/inc/customizer.php'; +require_once get_template_directory() . '/inc/cv-data.php'; require_once get_template_directory() . '/inc/patterns.php'; +require_once get_template_directory() . '/inc/visits.php'; function cvolio_setup(): void { @@ -24,7 +26,7 @@ function cvolio_enqueue_assets(): void { wp_enqueue_style( 'cvolio-fonts', - 'https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=Fraunces:opsz,wght@9..144,600;9..144,700&display=swap', + 'https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Cormorant+Garamond:wght@500;600;700&display=swap', [], null ); @@ -58,6 +60,60 @@ function cvolio_body_classes(array $classes): array } add_filter('body_class', 'cvolio_body_classes'); +function cvolio_redirect_default_sample_page(): void +{ + if (! is_page()) { + return; + } + + $samplePage = get_queried_object(); + if (! $samplePage instanceof WP_Post) { + return; + } + + if ($samplePage->post_name !== 'pagina-ejemplo') { + return; + } + + wp_safe_redirect(home_url('/'), 301); + exit; +} +add_action('template_redirect', 'cvolio_redirect_default_sample_page', 1); + +function cvolio_render_primary_menu(): string +{ + if (has_nav_menu('primary')) { + return trim((string) wp_nav_menu([ + 'theme_location' => 'primary', + 'container' => false, + 'fallback_cb' => false, + 'menu_class' => 'site-nav__menu', + 'echo' => false, + ])); + } + + $items = [ + '#resumen' => __('Resumen', 'cvolio'), + '#impacto' => __('Impacto', 'cvolio'), + '#experiencia' => __('Experiencia', 'cvolio'), + '#formacion' => __('Formación', 'cvolio'), + '#certificaciones' => __('Certificaciones', 'cvolio'), + '#contacto' => __('Contacto', 'cvolio'), + ]; + + $html = ''; + + return $html; +} + function cvolio_render_contact_link(string $type, string $value): string { if ($value === '') { diff --git a/frontend/cvfolio-theme/header.php b/frontend/cvfolio-theme/header.php index 880ab98..e3e8838 100644 --- a/frontend/cvfolio-theme/header.php +++ b/frontend/cvfolio-theme/header.php @@ -23,15 +23,9 @@ $brand = get_theme_mod('cvolio_hero_name', get_bloginfo('name')); Menu +
diff --git a/frontend/cvfolio-theme/inc/customizer.php b/frontend/cvfolio-theme/inc/customizer.php index 528f8df..4681cec 100644 --- a/frontend/cvfolio-theme/inc/customizer.php +++ b/frontend/cvfolio-theme/inc/customizer.php @@ -10,20 +10,31 @@ function cvolio_customize_register(WP_Customize_Manager $wp_customize): void ]); $fields = [ - 'cvolio_hero_name' => ['label' => __('Nombre principal', 'cvolio'), 'default' => 'Patricia Flores'], - 'cvolio_hero_role' => ['label' => __('Rol o titular', 'cvolio'), 'default' => 'Directora de proyectos, estratega digital y lider de producto'], - 'cvolio_hero_intro' => ['label' => __('Introduccion', 'cvolio'), 'default' => 'Perfil profesional con enfoque humano, resultados medibles y una presentacion visual moderna.'], - 'cvolio_hero_cta_label' => ['label' => __('Texto del boton', 'cvolio'), 'default' => 'Ver experiencia'], - 'cvolio_hero_cta_url' => ['label' => __('Enlace del boton', 'cvolio'), 'default' => '#perfil'], - 'cvolio_contact_location' => ['label' => __('Ubicacion', 'cvolio'), 'default' => 'Guayaquil, Ecuador'], - 'cvolio_contact_email' => ['label' => __('Correo', 'cvolio'), 'default' => 'hola@ejemplo.com'], - 'cvolio_contact_phone' => ['label' => __('Telefono', 'cvolio'), 'default' => '+593 999 999 999'], - 'cvolio_skills_list' => ['label' => __('Habilidades separadas por coma', 'cvolio'), 'default' => 'Liderazgo, Comunicacion, WordPress, UX, SEO, Analitica'], - 'cvolio_social_linkedin' => ['label' => __('LinkedIn', 'cvolio'), 'default' => ''], + 'cvolio_hero_name' => ['label' => __('Nombre principal', 'cvolio'), 'default' => 'Patricia Soledad Flores Sánchez'], + 'cvolio_hero_role' => ['label' => __('Rol o titular', 'cvolio'), 'default' => 'Gerente / Jefa de Operaciones Financieras | Sector financiero y microfinanzas'], + 'cvolio_hero_intro' => ['label' => __('Introduccion', 'cvolio'), 'default' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas. Especialista en gestión operativa, transformación digital de procesos, control interno y liderazgo de equipos multidisciplinarios.'], + 'cvolio_hero_cta_label' => ['label' => __('Texto del boton', 'cvolio'), 'default' => 'Ver trayectoria'], + 'cvolio_hero_cta_url' => ['label' => __('Enlace del boton', 'cvolio'), 'default' => '#experiencia'], + 'cvolio_contact_location' => ['label' => __('Ubicacion', 'cvolio'), 'default' => 'Loja, Ecuador'], + 'cvolio_contact_email' => ['label' => __('Correo', 'cvolio'), 'default' => 'patricflorsanchez@gmail.com'], + 'cvolio_contact_phone' => ['label' => __('Telefono', 'cvolio'), 'default' => '+593 99 469 8405'], + 'cvolio_skills_list' => ['label' => __('Habilidades separadas por coma', 'cvolio'), 'default' => 'Liderazgo, Gestión de operaciones financieras, Control interno, Transformación digital, Microfinanzas, Gestión de cartera, SAP FI, Power BI'], + 'cvolio_social_linkedin' => ['label' => __('LinkedIn', 'cvolio'), 'default' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/'], 'cvolio_social_github' => ['label' => __('GitHub', 'cvolio'), 'default' => ''], 'cvolio_social_portfolio' => ['label' => __('Portfolio', 'cvolio'), 'default' => ''], ]; + $wp_customize->add_setting('cvolio_profile_image', [ + 'default' => '', + 'sanitize_callback' => 'esc_url_raw', + ]); + + $wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'cvolio_profile_image', [ + 'label' => __('Foto de perfil', 'cvolio'), + 'section' => 'cvolio_hero', + 'settings' => 'cvolio_profile_image', + ])); + foreach ($fields as $key => $field) { $wp_customize->add_setting($key, [ 'default' => $field['default'], diff --git a/frontend/cvfolio-theme/inc/cv-data.php b/frontend/cvfolio-theme/inc/cv-data.php new file mode 100644 index 0000000..b379ce0 --- /dev/null +++ b/frontend/cvfolio-theme/inc/cv-data.php @@ -0,0 +1,189 @@ + [ + 'eyebrow' => 'Currículum ejecutivo', + 'name' => 'Patricia Soledad Flores Sánchez', + 'role' => 'Gerente / Jefa de Operaciones Financieras | Sector financiero y microfinanzas', + 'intro' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas. Máster en Dirección y Planificación Financiera, reconocido por la SENECYT en Ecuador, con especialización en gestión operativa, transformación digital de procesos, control interno y liderazgo de equipos multidisciplinarios.', + 'location' => 'Loja, Ecuador', + 'email' => 'patricflorsanchez@gmail.com', + 'phone' => '+593 99 469 8405', + 'linkedin' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/', + 'availability' => 'Inmediata | Presencial / Híbrida / Remota', + 'focus' => 'Operaciones financieras, control interno y transformación digital', + ], + 'metrics' => [ + ['value' => '22+', 'label' => 'años de experiencia en banca y microfinanzas'], + ['value' => '26', 'label' => 'agencias bajo liderazgo operativo nacional'], + ['value' => '48', 'label' => 'personas a cargo en la estructura operativa'], + ['value' => 'USD 5 M', 'label' => 'en operaciones mensuales de microcrédito'], + ['value' => '28.000', 'label' => 'clientes coordinados en recaudación por canales internos y externos'], + ], + 'highlights' => [ + ['value' => '9/10', 'label' => 'calificación de gestión con resultado excelente en cuatro trimestres consecutivos'], + ['value' => '74 %', 'label' => 'reducción de requerimientos de soporte desde Dirección por descentralización de procesos'], + ['value' => '1,68 días', 'label' => 'tiempo de desembolso logrado en Q3 2025, mejor resultado del año'], + ['value' => '75 %', 'label' => 'reducción del índice de rotación del área entre 2022 y 2026'], + ], + 'summary' => [ + 'title' => 'Perfil estratégico con enfoque en eficiencia, control y ejecución sostenible', + 'body' => 'Actualmente lidera la operatividad de 26 agencias a nivel nacional y coordina aproximadamente 1.500 operaciones de microcrédito mensuales, por un monto cercano a USD 5 millones. También articula la recaudación de cerca de 28.000 clientes por canales internos y externos, integrando visión operativa, criterio financiero, disciplina de control y liderazgo sostenido del desempeño.', + ], + 'impact' => [ + [ + 'title' => 'Transformación digital', + 'body' => 'Lideró desembolsos por transferencia bancaria, integración de APIs bancarias y digitalización de expedientes y pagarés en 13 agencias.', + ], + [ + 'title' => 'Automatización crítica', + 'body' => 'Automatizó el seguro de desgravamen, desde el cálculo de prima hasta la liquidación contable, reduciendo tiempos de 17 a 10 días.', + ], + [ + 'title' => 'Supervisión nacional', + 'body' => 'Implementó una matriz de supervisión y certificación por agencia, elevando el índice de cumplimiento operativo del 65 % al 88 %.', + ], + ], + 'experience' => [ + [ + 'period' => 'Abr. 2022 – Presente', + 'title' => 'Jefa de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Responsable del desempeño operativo nacional, cumplimiento del POA, control interno, digitalización de procesos y gestión de equipos.', + 'bullets' => [ + 'Cumplimiento del POA: 98 % (Q2 2025), 96 % (Q3 2025), 100 % (Q4 2025) y 105 % (Q1 2026).', + 'La transformación digital logró que los desembolsos por transferencia representen el 47,80 % del monto total en Q1 2026.', + 'Redujo los requerimientos de soporte desde Dirección en un 74 %, de 1.489 a 382, mediante la descentralización de procesos hacia las agencias.', + 'Automatizó el proceso del seguro de desgravamen con cálculo de prima, conciliación mensual, liquidación de siniestros y asientos contables automatizados.', + 'Elevó el índice de cumplimiento operativo nacional del 65 % al 88 % con la matriz de supervisión y certificación por agencia.', + 'Redujo el tiempo de atención del seguro de desgravamen de 17 a 10 días.', + 'Redujo los tiempos de desembolso a 1,68 días en Q3 2025, mejor resultado del año frente a la meta institucional máxima de 2 días.', + 'La efectividad de recuperación de mora alcanzó 90,60 % en Q1 2026, con USD 3,06 millones recuperados sobre USD 3,37 millones en mora.', + 'Redujo el índice de rotación del área del 41,46 % al 10,24 % entre diciembre de 2022 y marzo de 2026 mediante mejoras salariales, remuneración variable, evaluación trimestral y un plan de carrera con certificación de 60 horas para asistentes de caja.', + 'Participa en comités estratégicos, auditorías internas y externas, y en representación institucional ante organismos financieros internacionales de desarrollo.', + ], + ], + [ + 'period' => 'Feb. 2021 – Mar. 2022', + 'title' => 'Supervisora de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Supervisó operaciones de 18 agencias a nivel nacional y regularizó procesos críticos inexistentes o incompletos.', + 'bullets' => [ + 'Reconstruyó desde cero las bases de cálculo del seguro de desgravamen y regularizó pagos pendientes desde enero de 2021.', + 'Elaboró el instructivo de constitución de garantías hipotecarias, proceso que no existía previamente en la institución.', + 'Inició el proyecto de automatización de pagos por depósitos y transferencias.', + ], + ], + [ + 'period' => '2019 – 2021', + 'title' => 'Actualización y formación profesional', + 'company' => 'Formación independiente', + 'location' => 'Ecuador', + 'lead' => 'Etapa enfocada en fortalecimiento técnico y actualización profesional tras su salida de Mutualista Pichincha.', + 'bullets' => [ + 'SAP FI (30 h).', + 'Excel Empresarial (24 h).', + 'Prevención de Lavado de Activos — UAFE (5 h).', + ], + ], + [ + 'period' => 'Ago. 2004 – May. 2019', + 'title' => 'Oficial Operativa Regional / Jefa Operativa', + 'company' => 'Mutualista Pichincha', + 'location' => 'Loja, Ecuador', + 'lead' => 'Trayectoria ascendente de 15 años desde Cajera hasta Jefa Operativa Regional.', + 'bullets' => [ + 'Reconocida a nivel nacional por excelencia en control operativo.', + 'La agencia se mantuvo consistentemente por encima del 80 % en gestión de excepciones de crédito hipotecario.', + 'Administró proyecto inmobiliario institucional en Loja.', + 'Gestionó alertas ALA/FT con 100 % de cumplimiento en comités trimestrales y auditorías internas sin observaciones significativas de forma sostenida.', + ], + ], + [ + 'period' => 'Ene. 2002 – Nov. 2003', + 'title' => 'Cajera', + 'company' => 'Cooperativa de Ahorro y Crédito El Porvenir', + 'location' => 'Loja, Ecuador', + 'lead' => 'Inicio de carrera en el frente operativo financiero con disciplina de caja y apoyo contable.', + 'bullets' => [ + 'Gestión de caja sin faltantes ni sobrantes.', + 'Contrato renovado de forma anticipada a los tres meses.', + 'Apoyo al área de Contabilidad y reemplazo temporal de la contadora durante vacaciones.', + ], + ], + ], + 'education' => [ + [ + 'year' => '2021', + 'title' => 'Máster Universitario en Dirección y Planificación Financiera', + 'institution' => 'Universidad Europea Miguel de Cervantes — Valladolid, España', + 'detail' => 'Título reconocido por la SENECYT — Ecuador, febrero de 2023 | Reg. 2021/394270.', + ], + [ + 'year' => '2007', + 'title' => 'Ingeniera en Administración en Banca y Finanzas', + 'institution' => 'Universidad Técnica Particular de Loja (UTPL)', + 'detail' => '', + ], + ], + 'certifications' => [ + ['year' => '2026', 'title' => 'Mujeres que Lideran: Alta Gerencia', 'issuer' => 'Foro UNIR — Universidad Internacional de La Rioja'], + ['year' => '2025', 'title' => 'Programa Internacional de Habilidades Gerenciales (48 h)', 'issuer' => 'IDEASGROUP — Ecuador / México'], + ['year' => '2025', 'title' => 'Transforma tu Trabajo con Inteligencia Artificial (12 h)', 'issuer' => 'Red de Instituciones Financieras de Desarrollo'], + ['year' => '2025', 'title' => 'Excel: Básico a Dashboard (40 h)', 'issuer' => 'DMARURI Training & Consulting'], + ['year' => '2024', 'title' => 'Administración por Procesos — BPM (64 h)', 'issuer' => 'Escuela Politécnica Nacional — CEC'], + ['year' => '2023', 'title' => 'Formación de Formadores (80 h)', 'issuer' => 'Ministerio del Trabajo del Ecuador | Certificación vigente hasta 2028'], + ['year' => '2023', 'title' => 'Power BI (40 h) | Indicadores Clave de Desempeño — KPI (12 h)', 'issuer' => 'Liderazgo Capacitación & Eventos'], + ['year' => '2020', 'title' => 'Gestión Financiera ERP SAP FI — Key User (30 h)', 'issuer' => 'Socio SAP certificado'], + ['year' => '2020', 'title' => 'Prevención de Lavado de Activos y Financiamiento de Delitos', 'issuer' => 'UAFE — Ecuador'], + ['year' => '2013', 'title' => 'Tributación Integral (36 h)', 'issuer' => 'Universidad Técnica Particular de Loja'], + ], + 'competencies' => [ + 'Finanzas y Operaciones' => [ + 'Gestión de operaciones financieras', + 'Conciliación bancaria', + 'Originación de crédito', + 'Gestión de cartera', + 'Control interno', + 'Tesorería operativa', + 'Microfinanzas', + 'ALA/FT', + ], + 'Tecnología y Procesos' => [ + 'Transformación digital', + 'BPM', + 'Integración de APIs / Web Services', + 'SAP FI', + 'Excel avanzado y dashboards', + 'Power BI', + 'IA aplicada', + 'Core financiero', + ], + 'Liderazgo' => [ + 'Equipos de hasta 48 personas', + 'Remuneración variable', + 'Gestión del cambio', + 'Formación de formadores', + 'Diversidad, equidad e inclusión', + ], + ], + 'volunteer' => [ + 'title' => 'Voluntaria — Hogar San Camilo de Lellis', + 'year' => '2025', + 'body' => 'Hogar de niñas con discapacidad | Loja, Ecuador. Alineado a la visión y misión de responsabilidad social de la Fundación FACES Microfinanzas.', + ], + 'additional' => [ + 'Idiomas' => 'Español nativo | Inglés básico en formación activa', + 'Disponibilidad' => 'Inmediata | Presencial / Híbrida / Remota', + 'C.I.' => '1103591648', + 'Fecha de nacimiento' => '3 de agosto de 1980', + 'Web profesional' => 'pflres.linkedcorp.net', + ], + ]; +} diff --git a/frontend/cvfolio-theme/inc/visits.php b/frontend/cvfolio-theme/inc/visits.php new file mode 100644 index 0000000..e5dc0f7 --- /dev/null +++ b/frontend/cvfolio-theme/inc/visits.php @@ -0,0 +1,118 @@ + 0) { + $views = (int) get_post_meta($frontPage, '_cvolio_views', true); + update_post_meta($frontPage, '_cvolio_views', $views + 1); + } + + return; + } + + $postId = get_queried_object_id(); + if ($postId > 0) { + $views = (int) get_post_meta($postId, '_cvolio_views', true); + update_post_meta($postId, '_cvolio_views', $views + 1); + } +} +add_action('template_redirect', 'cvolio_track_visit'); + +function cvolio_get_client_ip(): string +{ + $keys = [ + 'HTTP_X_FORWARDED_FOR', + 'HTTP_CLIENT_IP', + 'REMOTE_ADDR', + ]; + + foreach ($keys as $key) { + if (! empty($_SERVER[$key])) { + $value = explode(',', (string) $_SERVER[$key]); + return trim($value[0]); + } + } + + return '0.0.0.0'; +} + +function cvolio_register_visits_dashboard_widget(): void +{ + wp_add_dashboard_widget( + 'cvolio_visits_widget', + __('CVolio: Visitas', 'cvolio'), + 'cvolio_render_visits_dashboard_widget' + ); +} +add_action('wp_dashboard_setup', 'cvolio_register_visits_dashboard_widget'); + +function cvolio_render_visits_dashboard_widget(): void +{ + $total = (int) get_option('cvolio_total_visits', 0); + $frontPage = (int) get_option('page_on_front'); + $frontViews = $frontPage > 0 ? (int) get_post_meta($frontPage, '_cvolio_views', true) : 0; + ?> +
+

+

+

+
+ div { + padding: var(--sp-3); + background: var(--lm-slate-50); + border-radius: var(--r-md); +} + +.lm-quick-info dt { + font-size: .7rem; + font-weight: 700; + letter-spacing: .08em; + text-transform: uppercase; + color: var(--lm-primary); + margin-bottom: var(--sp-1); +} + +.lm-quick-info dd { + font-size: .825rem; + color: var(--lm-slate-700); + line-height: 1.5; +} + +/* Widget — competencias */ +.lm-widget--skills { border-top: 3px solid var(--lm-teal-500); } + +.lm-skill-group { margin-bottom: var(--sp-4); } +.lm-skill-group:last-child { margin-bottom: 0; } + +.lm-skill-group h3 { + font-size: .75rem; + font-weight: 700; + letter-spacing: .07em; + text-transform: uppercase; + color: var(--lm-slate-500); + margin-bottom: var(--sp-2); +} + +.lm-pills { + display: flex; + flex-wrap: wrap; + gap: var(--sp-1) var(--sp-2); +} + +.lm-pill { + display: inline-block; + padding: .25rem .6rem; + font-size: .75rem; + font-weight: 600; + background: var(--lm-teal-50); + color: var(--lm-teal-700); + border: 1px solid var(--lm-teal-100); + border-radius: var(--r-full); + line-height: 1.4; + transition: background .15s; +} + +.lm-pill:hover { background: var(--lm-teal-100); } + +/* Info list */ +.lm-info-list { + display: flex; + flex-direction: column; + gap: var(--sp-3); + margin-bottom: var(--sp-4); +} + +.lm-info-list > div { + padding-bottom: var(--sp-3); + border-bottom: 1px solid var(--lm-border); +} + +.lm-info-list > div:last-child { border-bottom: none; padding-bottom: 0; } + +.lm-info-list dt { + font-size: .7rem; + font-weight: 700; + letter-spacing: .07em; + text-transform: uppercase; + color: var(--lm-text-faint); + margin-bottom: var(--sp-1); +} + +.lm-info-list dd { + font-size: .825rem; + color: var(--lm-slate-700); +} + +.lm-contact-links { + display: flex; + flex-wrap: wrap; + gap: var(--sp-2); + margin-top: var(--sp-2); +} + +/* Business card */ +.lm-widget--card { border-top: 3px solid var(--lm-accent); } + +.lm-bcard { + margin-top: var(--sp-3); + border: 1px solid var(--lm-border); + border-radius: var(--r-lg); + overflow: hidden; + font-size: .8rem; +} + +.lm-bcard__header { + padding: var(--sp-4); + background: linear-gradient(135deg, var(--lm-teal-700), var(--lm-teal-900)); + color: #fff; +} + +.lm-bcard__name { + font-size: .9rem; + font-weight: 700; + color: #fff; + margin-bottom: var(--sp-1); +} + +.lm-bcard__role { + font-size: .7rem; + color: var(--lm-teal-100); + line-height: 1.4; +} + +.lm-bcard__body { + display: grid; + grid-template-columns: 80px 1fr; + gap: var(--sp-3); + padding: var(--sp-4); + background: var(--lm-slate-50); +} + +.lm-bcard__qr img { + width: 80px; + height: 80px; + border-radius: var(--r-sm); +} + +.lm-bcard__info { + display: flex; + flex-direction: column; + gap: var(--sp-1); + color: var(--lm-slate-600); + font-size: .75rem; +} + +.lm-bcard__info a { + color: var(--lm-primary); + font-weight: 600; + word-break: break-all; +} + +/* --- 11. Contenido principal ----------------------------- */ +.lm-content { + display: flex; + flex-direction: column; + gap: var(--sp-2); +} + +/* Sección interna */ +.lm-section-inner { + background: var(--lm-surface); + border: 1px solid var(--lm-border); + border-radius: var(--r-xl); + padding: var(--sp-8); + box-shadow: var(--shadow-sm); +} + +.lm-section-inner + .lm-section-inner { + margin-top: var(--sp-4); +} + +.lm-section-head { + margin-bottom: var(--sp-8); + padding-bottom: var(--sp-5); + border-bottom: 2px solid var(--lm-teal-50); +} + +.lm-section-head h2 { + font-size: clamp(1.15rem, 2vw, 1.4rem); + font-weight: 700; + color: var(--lm-slate-800); +} + +/* --- 12. Timeline de experiencia ------------------------- */ +.lm-timeline { + display: flex; + flex-direction: column; + gap: 0; +} + +.lm-timeline__item { + display: grid; + grid-template-columns: 16px 1fr; + gap: 0 var(--sp-5); + position: relative; + padding-bottom: var(--sp-8); +} + +.lm-timeline__item:last-child { padding-bottom: 0; } + +/* Línea vertical */ +.lm-timeline__item::before { + content: ''; + position: absolute; + left: 7px; + top: 16px; + bottom: 0; + width: 2px; + background: var(--lm-teal-100); +} + +.lm-timeline__item:last-child::before { display: none; } + +/* Dot */ +.lm-timeline__marker { + width: 16px; + height: 16px; + border-radius: 50%; + background: var(--lm-surface); + border: 3px solid var(--lm-accent); + flex-shrink: 0; + margin-top: 4px; + position: relative; + z-index: 1; + box-shadow: 0 0 0 3px var(--lm-amber-100); +} + +.lm-timeline__body { min-width: 0; } + +.lm-timeline__period { + display: inline-block; + font-size: .72rem; + font-weight: 700; + letter-spacing: .06em; + text-transform: uppercase; + color: var(--lm-primary); + background: var(--lm-teal-50); + border: 1px solid var(--lm-teal-100); + border-radius: var(--r-full); + padding: .15rem .6rem; + margin-bottom: var(--sp-2); +} + +.lm-timeline__body h3 { + font-size: 1.05rem; + font-weight: 700; + color: var(--lm-slate-900); + margin-bottom: var(--sp-1); +} + +.lm-timeline__meta { + font-size: .82rem; + color: var(--lm-text-muted); + margin-bottom: var(--sp-2); +} + +.lm-timeline__meta strong { color: var(--lm-slate-700); } + +.lm-timeline__lead { + font-size: .875rem; + color: var(--lm-slate-700); + font-style: italic; + margin-bottom: var(--sp-3); + line-height: 1.6; +} + +.lm-timeline__bullets { + display: flex; + flex-direction: column; + gap: var(--sp-2); + list-style: none; +} + +.lm-timeline__bullets li { + font-size: .85rem; + color: var(--lm-text-muted); + line-height: 1.6; + padding-left: var(--sp-5); + position: relative; +} + +.lm-timeline__bullets li::before { + content: ''; + position: absolute; + left: 0; + top: .5em; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--lm-teal-400); +} + +/* --- 13. Formación académica ----------------------------- */ +.lm-edu-grid { + display: flex; + flex-direction: column; + gap: var(--sp-4); +} + +.lm-edu-card { + display: grid; + grid-template-columns: 64px 1fr; + gap: var(--sp-4); + padding: var(--sp-5); + background: var(--lm-slate-50); + border: 1px solid var(--lm-border); + border-left: 4px solid var(--lm-accent); + border-radius: var(--r-lg); + transition: box-shadow .2s; +} + +.lm-edu-card:hover { box-shadow: var(--shadow-md); } + +.lm-edu-card__year { + display: flex; + align-items: flex-start; + justify-content: center; + padding-top: 2px; + font-size: 1.2rem; + font-weight: 800; + color: var(--lm-amber-500); + line-height: 1; +} + +.lm-edu-card h3 { + font-size: .95rem; + font-weight: 700; + color: var(--lm-slate-800); + margin-bottom: var(--sp-1); +} + +.lm-edu-card p { + font-size: .82rem; + color: var(--lm-text-muted); + line-height: 1.5; +} + +.lm-edu-card__detail { + margin-top: var(--sp-2) !important; + font-size: .78rem !important; + color: var(--lm-primary) !important; + font-weight: 500; +} + +/* --- 14. Certificaciones --------------------------------- */ +.lm-cert-list { + display: flex; + flex-direction: column; + gap: var(--sp-1); +} + +.lm-cert-item { + display: grid; + grid-template-columns: 56px 1fr; + gap: var(--sp-4); + align-items: center; + padding: var(--sp-3) var(--sp-4); + border-radius: var(--r-md); + transition: background .15s; +} + +.lm-cert-item:hover { background: var(--lm-slate-50); } + +.lm-cert-item__year { + font-size: .72rem; + font-weight: 700; + background: var(--lm-teal-600); + color: #fff; + padding: .2rem .4rem; + border-radius: var(--r-sm); + text-align: center; + letter-spacing: .04em; +} + +.lm-cert-item h3 { + font-size: .875rem; + font-weight: 600; + color: var(--lm-slate-800); + margin-bottom: var(--sp-1); +} + +.lm-cert-item p { + font-size: .78rem; + color: var(--lm-text-muted); +} + +/* --- 15. Footer ------------------------------------------ */ +.lm-footer { + background: var(--lm-teal-900); + color: var(--lm-teal-100); + padding-block: var(--sp-6); + margin-top: var(--sp-12); +} + +.lm-footer__inner { + max-width: 1240px; + margin-inline: auto; + padding-inline: var(--sp-6); + display: flex; + justify-content: space-between; + align-items: center; +} + +.lm-footer__copy { font-size: .825rem; opacity: .7; } + +.lm-footer__top { + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + background: rgba(255,255,255,.1); + color: #fff; + border-radius: var(--r-full); + font-size: 1.1rem; + text-decoration: none; + transition: background .2s; +} +.lm-footer__top:hover { background: rgba(255,255,255,.2); color: #fff; } + +/* --- 16. Main --- */ +.lm-main { min-height: 60vh; } + +/* --- 17. Sección de texto simple (index.php) ------------ */ +.lm-wrap { + max-width: 800px; + margin: var(--sp-16) auto; + padding-inline: var(--sp-6); +} + +.lm-card { + background: var(--lm-surface); + border: 1px solid var(--lm-border); + border-radius: var(--r-xl); + padding: var(--sp-10); + box-shadow: var(--shadow-sm); +} + +.lm-entry__title { + font-size: 2rem; + margin-bottom: var(--sp-6); + color: var(--lm-slate-900); +} + +.lm-entry__body { line-height: 1.75; color: var(--lm-text-muted); } +.lm-entry__body p + p { margin-top: var(--sp-4); } + +/* --- 18. Responsive: 1024px ----------------------------- */ +@media (max-width: 1024px) { + .lm-body { + grid-template-columns: 300px 1fr; + gap: var(--sp-6); + } + + .lm-hero__metrics { + grid-template-columns: repeat(3, 1fr); + } + + .lm-metric:nth-child(4), + .lm-metric:nth-child(5) { + border-top: 1px solid rgba(255,255,255,.08); + } +} + +/* --- 19. Responsive: 860px ------------------------------ */ +@media (max-width: 860px) { + .lm-body { + grid-template-columns: 1fr; + } + + .lm-sidebar { + position: static; + max-height: none; + overflow-y: visible; + display: grid; + grid-template-columns: repeat(2, 1fr); + } + + .lm-widget--card { grid-column: 1 / -1; } + + .lm-highlights-grid { + grid-template-columns: repeat(2, 1fr); + } + + .lm-impact-row { + grid-template-columns: 1fr; + } +} + +/* --- 20. Responsive: 640px ------------------------------ */ +@media (max-width: 640px) { + :root { --header-h: 56px; } + + .lm-nav { + display: none; + position: absolute; + top: var(--header-h); + left: 0; + right: 0; + background: var(--lm-surface); + border-bottom: 1px solid var(--lm-border); + padding: var(--sp-4); + box-shadow: var(--shadow-md); + z-index: 99; + } + + .lm-nav.is-open { display: block; } + + .lm-nav__list { + flex-direction: column; + gap: 0; + } + + .lm-nav__list li a { padding: var(--sp-3) var(--sp-4); } + + .lm-nav-toggle { display: flex; } + .lm-header__actions { display: none; } + + .lm-hero { padding-top: var(--sp-10); } + .lm-hero__avatar { width: 110px; height: 110px; } + .lm-hero__actions { gap: var(--sp-2); } + + .lm-hero__metrics { grid-template-columns: repeat(2, 1fr); } + .lm-metric:last-child { + grid-column: 1 / -1; + border-top: 1px solid rgba(255,255,255,.08); + } + + .lm-highlights-section { padding-block: var(--sp-10); } + .lm-highlights-grid { grid-template-columns: repeat(2, 1fr); gap: var(--sp-3); } + .lm-impact-row { grid-template-columns: 1fr; gap: var(--sp-4); } + + .lm-body { padding-block: var(--sp-6); gap: var(--sp-6); } + + .lm-sidebar { grid-template-columns: 1fr; } + .lm-widget--card { grid-column: auto; } + + .lm-section-inner { padding: var(--sp-5); } + .lm-section-inner + .lm-section-inner { margin-top: var(--sp-3); } + + .lm-edu-card { grid-template-columns: 50px 1fr; } +} + +/* --- 21. Print ------------------------------------------ */ +@media print { + :root { --header-h: 0px; } + + .lm-header, + .lm-hero__actions, + .lm-footer, + .lm-nav-toggle, + .lm-header__actions { display: none !important; } + + .lm-hero { + background: none !important; + color: #000; + padding-top: var(--sp-8); + page-break-inside: avoid; + } + + .lm-hero__bg-pattern, + .lm-hero__wave { display: none; } + + .lm-hero__name, + .lm-hero__role { color: #000 !important; } + .lm-hero__intro { color: #333 !important; } + .lm-hero__chips .lm-chip--hero { color: #000 !important; border-color: #ccc !important; background: #f5f5f5 !important; } + + .lm-hero__metrics { background: #f0f0f0 !important; } + .lm-metric strong { color: #000 !important; } + .lm-metric span { color: #444 !important; } + + .lm-body { + grid-template-columns: 280px 1fr; + gap: var(--sp-6); + padding-top: var(--sp-4); + } + + .lm-sidebar { position: static; max-height: none; overflow: visible; } + + .lm-widget, + .lm-section-inner { box-shadow: none; border-color: #ddd; page-break-inside: avoid; } + + .lm-timeline__item { page-break-inside: avoid; } + .lm-edu-card { page-break-inside: avoid; } + + body { font-size: 11pt; } + a { color: #000 !important; text-decoration: none !important; } + .lm-chip { border-color: #ccc !important; background: #f5f5f5 !important; color: #333 !important; } +} diff --git a/frontend/lumina-cv-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx b/frontend/lumina-cv-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx new file mode 100644 index 0000000000000000000000000000000000000000..544bf3d781cd85ddc8becbc624bf639c8ba6fe11 GIT binary patch literal 19375 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

}m|)H;34nU|q@|s4__NYn(gcG+~g* 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 literal 0 HcmV?d00001 diff --git a/frontend/lumina-cv-theme/assets/images/patricia-flores-qr.png b/frontend/lumina-cv-theme/assets/images/patricia-flores-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..55703ad812dff9f68d5f2e853e2b507c27c2c478 GIT binary patch literal 535 zcmV+y0_gpTP)00006P)t-s|Ns90 z0033O(|!N|010qNS#tmY4#WTe4#WYKD-Ig~00Fm2L_t(|obB2%u7fZP24EuwMvjo9 za5OktkHQf;c6h2^?AS>tm7c0c3d8RykdIDQoVX$SC}uA4@RwtJScrPQ(^Snrp`lyo zr;|SF5E1{V))2iofQD|R2c1w|M;AXM(VfoUprOB^gNy_PStAJ=`r=x4lUm+Gsq@g# z&9#MRtUd%mw#GVuhHj&|M77skby0C?z?$t=%aPc*qEO-NL?b$ z&oP#F-3dtQLPNLF@-oDiIXEY3uY=hSKG4t?&@l$CqSSe|2IoSS->J?+Lm#Z?bV9!g z8X~F_wcplxXy_)I$Plx4DlJl-*Lal54-I{;&iQShSzoh?mz^mzbSqslHrIL92_5X} zJT&y-I%h0znnM$_UmJpkzLMtLTi?e+n@hA`W1*q{ueT9=ew8OH`0}s#+m<{u^bvaA zB&KM3x!1dN)p-XR`fRUM;qk%414pXz2D@!|qht z^4a-EZ*KuZL!YWMV!y{hI$VATKs002ovPDHLkV1nW!_Bj9m literal 0 HcmV?d00001 diff --git a/frontend/lumina-cv-theme/assets/images/profile-placeholder.svg b/frontend/lumina-cv-theme/assets/images/profile-placeholder.svg new file mode 100644 index 0000000..3d7dbb0 --- /dev/null +++ b/frontend/lumina-cv-theme/assets/images/profile-placeholder.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/frontend/lumina-cv-theme/assets/js/theme.js b/frontend/lumina-cv-theme/assets/js/theme.js new file mode 100644 index 0000000..6b0caf6 --- /dev/null +++ b/frontend/lumina-cv-theme/assets/js/theme.js @@ -0,0 +1,60 @@ +document.addEventListener("DOMContentLoaded", () => { + const toggle = document.querySelector(".lm-nav-toggle"); + const nav = document.querySelector(".lm-nav"); + + if (toggle && nav) { + toggle.addEventListener("click", () => { + const expanded = toggle.getAttribute("aria-expanded") === "true"; + toggle.setAttribute("aria-expanded", String(!expanded)); + nav.classList.toggle("is-open", !expanded); + }); + + document.addEventListener("click", (e) => { + if (!nav.contains(e.target) && !toggle.contains(e.target)) { + nav.classList.remove("is-open"); + toggle.setAttribute("aria-expanded", "false"); + } + }); + } + + document.querySelectorAll("[data-lumina-print]").forEach((btn) => { + btn.addEventListener("click", () => window.print()); + }); + + const header = document.querySelector(".lm-header"); + if (header) { + let lastY = window.scrollY; + window.addEventListener("scroll", () => { + const currentY = window.scrollY; + if (currentY > 80) { + header.style.boxShadow = "0 2px 16px rgba(0,0,0,.12)"; + } else { + header.style.boxShadow = ""; + } + lastY = currentY; + }, { passive: true }); + } + + const sections = document.querySelectorAll("[id]"); + const navLinks = document.querySelectorAll(".lm-nav__list a[href^='#']"); + + if (navLinks.length && sections.length) { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + navLinks.forEach((link) => { + link.classList.toggle( + "is-active", + link.getAttribute("href") === `#${entry.target.id}` + ); + }); + } + }); + }, + { rootMargin: "-20% 0px -70% 0px" } + ); + + sections.forEach((section) => observer.observe(section)); + } +}); diff --git a/frontend/lumina-cv-theme/footer.php b/frontend/lumina-cv-theme/footer.php new file mode 100644 index 0000000..eaf0f9a --- /dev/null +++ b/frontend/lumina-cv-theme/footer.php @@ -0,0 +1,18 @@ + +

+ +
+ +
+ + + + diff --git a/frontend/lumina-cv-theme/front-page.php b/frontend/lumina-cv-theme/front-page.php new file mode 100644 index 0000000..40a0ebf --- /dev/null +++ b/frontend/lumina-cv-theme/front-page.php @@ -0,0 +1,343 @@ + + + +
+ + +
+
+ <?php echo esc_attr($heroName); ?> +
+ +

+

+

+

+ +
+ + + + + + + + + + + + + + + + + + + + LinkedIn + + +
+ +
+ + + + + + + + +
+
+ + +
+ +
+ + +
+ +
+ + + +
+ + +
+
+
+

+

+
+ +
+ +
+ + +
+ +
+ +
+ +
+ +

+

+
+ +
+
+
+ + +
+ + + + + +
+ + +
+
+

+

+
+ +
+ +
+ +
+ +

+

+ + · +

+

+
    + +
  • + +
+
+
+ +
+
+ + +
+
+

+

+
+ +
+ +
+ +
+

+

+ +

+ +
+
+ +
+
+ + +
+
+

+

+
+ +
+ +
+ +
+

+

+
+
+ +
+
+ + + + +
+
+

+

+
+
+ +
+
+ + + +
+ +
+ + diff --git a/frontend/lumina-cv-theme/functions.php b/frontend/lumina-cv-theme/functions.php new file mode 100644 index 0000000..9fc2e4f --- /dev/null +++ b/frontend/lumina-cv-theme/functions.php @@ -0,0 +1,133 @@ + __('Menú principal', 'lumina'), + ]); +} +add_action('after_setup_theme', 'lumina_setup'); + +function lumina_enqueue_assets(): void +{ + wp_enqueue_style( + 'lumina-fonts', + 'https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap', + [], + null + ); + + wp_enqueue_style( + 'lumina-theme', + get_template_directory_uri() . '/assets/css/theme.css', + ['lumina-fonts'], + wp_get_theme()->get('Version') + ); + + wp_enqueue_script( + 'lumina-theme', + get_template_directory_uri() . '/assets/js/theme.js', + [], + wp_get_theme()->get('Version'), + true + ); +} +add_action('wp_enqueue_scripts', 'lumina_enqueue_assets'); + +function lumina_body_classes(array $classes): array +{ + $classes[] = 'lumina-shell'; + + if (is_front_page()) { + $classes[] = 'lumina-front'; + } + + return $classes; +} +add_filter('body_class', 'lumina_body_classes'); + +function lumina_redirect_sample_page(): void +{ + if (! is_page()) { + return; + } + + $page = get_queried_object(); + if (! $page instanceof WP_Post) { + return; + } + + if ($page->post_name !== 'pagina-ejemplo') { + return; + } + + wp_safe_redirect(home_url('/'), 301); + exit; +} +add_action('template_redirect', 'lumina_redirect_sample_page', 1); + +function lumina_render_primary_menu(): string +{ + if (has_nav_menu('primary')) { + return trim((string) wp_nav_menu([ + 'theme_location' => 'primary', + 'container' => false, + 'fallback_cb' => false, + 'menu_class' => 'lm-nav__list', + 'echo' => false, + ])); + } + + $items = [ + '#resumen' => __('Perfil', 'lumina'), + '#impacto' => __('Impacto', 'lumina'), + '#experiencia' => __('Experiencia', 'lumina'), + '#formacion' => __('Formación', 'lumina'), + '#certificaciones' => __('Certificaciones', 'lumina'), + '#contacto' => __('Contacto', 'lumina'), + ]; + + $html = '
    '; + foreach ($items as $href => $label) { + $html .= sprintf( + '
  • %s
  • ', + esc_url($href), + esc_html($label) + ); + } + $html .= '
'; + + return $html; +} + +function lumina_contact_link(string $type, string $value): string +{ + if ($value === '') { + return ''; + } + + $href = match ($type) { + 'email' => 'mailto:' . antispambot($value), + 'phone' => 'tel:' . preg_replace('/[^0-9+]/', '', $value), + default => esc_url($value), + }; + + return sprintf( + '%s', + esc_url($href), + esc_html($value) + ); +} diff --git a/frontend/lumina-cv-theme/header.php b/frontend/lumina-cv-theme/header.php new file mode 100644 index 0000000..f2604d8 --- /dev/null +++ b/frontend/lumina-cv-theme/header.php @@ -0,0 +1,41 @@ + + +> + + + + + +> + + +
+
+ + + + + + + + + + +
+
+ +
diff --git a/frontend/lumina-cv-theme/inc/customizer.php b/frontend/lumina-cv-theme/inc/customizer.php new file mode 100644 index 0000000..4fc8dc2 --- /dev/null +++ b/frontend/lumina-cv-theme/inc/customizer.php @@ -0,0 +1,53 @@ +add_section('lumina_hero', [ + 'title' => __('Lumina CV: Presentación', 'lumina'), + 'priority' => 30, + ]); + + $fields = [ + 'lm_hero_name' => ['label' => __('Nombre principal', 'lumina'), 'default' => 'Patricia Soledad Flores Sánchez'], + 'lm_hero_role' => ['label' => __('Rol o titular', 'lumina'), 'default' => 'Gerente / Jefa de Operaciones Financieras | Sector financiero y microfinanzas'], + 'lm_hero_intro' => ['label' => __('Introducción', 'lumina'), 'default' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas. Máster en Dirección y Planificación Financiera, reconocido por la SENECYT en Ecuador, con especialización en gestión operativa, transformación digital de procesos, control interno y liderazgo de equipos multidisciplinarios.'], + 'lm_hero_cta_label' => ['label' => __('Texto del botón', 'lumina'), 'default' => 'Ver trayectoria'], + 'lm_hero_cta_url' => ['label' => __('Enlace del botón', 'lumina'), 'default' => '#experiencia'], + 'lm_contact_location'=> ['label' => __('Ubicación', 'lumina'), 'default' => 'Loja, Ecuador'], + 'lm_contact_email' => ['label' => __('Correo', 'lumina'), 'default' => 'patricflorsanchez@gmail.com'], + 'lm_contact_phone' => ['label' => __('Teléfono', 'lumina'), 'default' => '+593 99 469 8405'], + 'lm_social_linkedin' => ['label' => __('LinkedIn', 'lumina'), 'default' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/'], + 'lm_social_github' => ['label' => __('GitHub', 'lumina'), 'default' => ''], + ]; + + $wp_customize->add_setting('lm_profile_image', [ + 'default' => '', + 'sanitize_callback' => 'esc_url_raw', + ]); + + $wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'lm_profile_image', [ + 'label' => __('Foto de perfil', 'lumina'), + 'section' => 'lumina_hero', + 'settings' => 'lm_profile_image', + ])); + + foreach ($fields as $key => $field) { + $isUrl = str_contains($key, 'url') + || str_contains($key, 'linkedin') + || str_contains($key, 'github'); + + $wp_customize->add_setting($key, [ + 'default' => $field['default'], + 'sanitize_callback' => $isUrl ? 'esc_url_raw' : 'sanitize_text_field', + ]); + + $wp_customize->add_control($key, [ + 'label' => $field['label'], + 'section' => 'lumina_hero', + 'type' => $key === 'lm_hero_intro' ? 'textarea' : 'text', + ]); + } +} +add_action('customize_register', 'lumina_customize_register'); diff --git a/frontend/lumina-cv-theme/inc/cv-data.php b/frontend/lumina-cv-theme/inc/cv-data.php new file mode 100644 index 0000000..eb498c3 --- /dev/null +++ b/frontend/lumina-cv-theme/inc/cv-data.php @@ -0,0 +1,189 @@ + [ + 'eyebrow' => 'Currículum ejecutivo', + 'name' => 'Patricia Soledad Flores Sánchez', + 'role' => 'Gerente / Jefa de Operaciones Financieras | Sector financiero y microfinanzas', + 'intro' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas. Máster en Dirección y Planificación Financiera, reconocido por la SENECYT en Ecuador, con especialización en gestión operativa, transformación digital de procesos, control interno y liderazgo de equipos multidisciplinarios.', + 'location' => 'Loja, Ecuador', + 'email' => 'patricflorsanchez@gmail.com', + 'phone' => '+593 99 469 8405', + 'linkedin' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/', + 'availability' => 'Inmediata | Presencial / Híbrida / Remota', + 'focus' => 'Operaciones financieras, control interno y transformación digital', + ], + 'metrics' => [ + ['value' => '22+', 'label' => 'años de experiencia en banca y microfinanzas'], + ['value' => '26', 'label' => 'agencias bajo liderazgo operativo nacional'], + ['value' => '48', 'label' => 'personas a cargo en la estructura operativa'], + ['value' => 'USD 5 M', 'label' => 'en operaciones mensuales de microcrédito'], + ['value' => '28.000', 'label' => 'clientes coordinados en recaudación por canales internos y externos'], + ], + 'highlights' => [ + ['value' => '9/10', 'label' => 'calificación de gestión con resultado excelente en cuatro trimestres consecutivos'], + ['value' => '74 %', 'label' => 'reducción de requerimientos de soporte desde Dirección por descentralización de procesos'], + ['value' => '1,68 días', 'label' => 'tiempo de desembolso logrado en Q3 2025, mejor resultado del año'], + ['value' => '75 %', 'label' => 'reducción del índice de rotación del área entre 2022 y 2026'], + ], + 'summary' => [ + 'title' => 'Perfil estratégico con enfoque en eficiencia, control y ejecución sostenible', + 'body' => 'Actualmente lidera la operatividad de 26 agencias a nivel nacional y coordina aproximadamente 1.500 operaciones de microcrédito mensuales, por un monto cercano a USD 5 millones. También articula la recaudación de cerca de 28.000 clientes por canales internos y externos, integrando visión operativa, criterio financiero, disciplina de control y liderazgo sostenido del desempeño.', + ], + 'impact' => [ + [ + 'title' => 'Transformación digital', + 'body' => 'Lideró desembolsos por transferencia bancaria, integración de APIs bancarias y digitalización de expedientes y pagarés en 13 agencias.', + ], + [ + 'title' => 'Automatización crítica', + 'body' => 'Automatizó el seguro de desgravamen, desde el cálculo de prima hasta la liquidación contable, reduciendo tiempos de 17 a 10 días.', + ], + [ + 'title' => 'Supervisión nacional', + 'body' => 'Implementó una matriz de supervisión y certificación por agencia, elevando el índice de cumplimiento operativo del 65 % al 88 %.', + ], + ], + 'experience' => [ + [ + 'period' => 'Abr. 2022 – Presente', + 'title' => 'Jefa de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Responsable del desempeño operativo nacional, cumplimiento del POA, control interno, digitalización de procesos y gestión de equipos.', + 'bullets' => [ + 'Cumplimiento del POA: 98 % (Q2 2025), 96 % (Q3 2025), 100 % (Q4 2025) y 105 % (Q1 2026).', + 'La transformación digital logró que los desembolsos por transferencia representen el 47,80 % del monto total en Q1 2026.', + 'Redujo los requerimientos de soporte desde Dirección en un 74 %, de 1.489 a 382, mediante la descentralización de procesos hacia las agencias.', + 'Automatizó el proceso del seguro de desgravamen con cálculo de prima, conciliación mensual, liquidación de siniestros y asientos contables automatizados.', + 'Elevó el índice de cumplimiento operativo nacional del 65 % al 88 % con la matriz de supervisión y certificación por agencia.', + 'Redujo el tiempo de atención del seguro de desgravamen de 17 a 10 días.', + 'Redujo los tiempos de desembolso a 1,68 días en Q3 2025, mejor resultado del año frente a la meta institucional máxima de 2 días.', + 'La efectividad de recuperación de mora alcanzó 90,60 % en Q1 2026, con USD 3,06 millones recuperados sobre USD 3,37 millones en mora.', + 'Redujo el índice de rotación del área del 41,46 % al 10,24 % entre diciembre de 2022 y marzo de 2026 mediante mejoras salariales, remuneración variable, evaluación trimestral y un plan de carrera con certificación de 60 horas para asistentes de caja.', + 'Participa en comités estratégicos, auditorías internas y externas, y en representación institucional ante organismos financieros internacionales de desarrollo.', + ], + ], + [ + 'period' => 'Feb. 2021 – Mar. 2022', + 'title' => 'Supervisora de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', + 'location' => 'Loja, Ecuador', + 'lead' => 'Supervisó operaciones de 18 agencias a nivel nacional y regularizó procesos críticos inexistentes o incompletos.', + 'bullets' => [ + 'Reconstruyó desde cero las bases de cálculo del seguro de desgravamen y regularizó pagos pendientes desde enero de 2021.', + 'Elaboró el instructivo de constitución de garantías hipotecarias, proceso que no existía previamente en la institución.', + 'Inició el proyecto de automatización de pagos por depósitos y transferencias.', + ], + ], + [ + 'period' => '2019 – 2021', + 'title' => 'Actualización y formación profesional', + 'company' => 'Formación independiente', + 'location' => 'Ecuador', + 'lead' => 'Etapa enfocada en fortalecimiento técnico y actualización profesional tras su salida de Mutualista Pichincha.', + 'bullets' => [ + 'SAP FI (30 h).', + 'Excel Empresarial (24 h).', + 'Prevención de Lavado de Activos — UAFE (5 h).', + ], + ], + [ + 'period' => 'Ago. 2004 – May. 2019', + 'title' => 'Oficial Operativa Regional / Jefa Operativa', + 'company' => 'Mutualista Pichincha', + 'location' => 'Loja, Ecuador', + 'lead' => 'Trayectoria ascendente de 15 años desde Cajera hasta Jefa Operativa Regional.', + 'bullets' => [ + 'Reconocida a nivel nacional por excelencia en control operativo.', + 'La agencia se mantuvo consistentemente por encima del 80 % en gestión de excepciones de crédito hipotecario.', + 'Administró proyecto inmobiliario institucional en Loja.', + 'Gestionó alertas ALA/FT con 100 % de cumplimiento en comités trimestrales y auditorías internas sin observaciones significativas de forma sostenida.', + ], + ], + [ + 'period' => 'Ene. 2002 – Nov. 2003', + 'title' => 'Cajera', + 'company' => 'Cooperativa de Ahorro y Crédito El Porvenir', + 'location' => 'Loja, Ecuador', + 'lead' => 'Inicio de carrera en el frente operativo financiero con disciplina de caja y apoyo contable.', + 'bullets' => [ + 'Gestión de caja sin faltantes ni sobrantes.', + 'Contrato renovado de forma anticipada a los tres meses.', + 'Apoyo al área de Contabilidad y reemplazo temporal de la contadora durante vacaciones.', + ], + ], + ], + 'education' => [ + [ + 'year' => '2021', + 'title' => 'Máster Universitario en Dirección y Planificación Financiera', + 'institution' => 'Universidad Europea Miguel de Cervantes — Valladolid, España', + 'detail' => 'Título reconocido por la SENECYT — Ecuador, febrero de 2023 | Reg. 2021/394270.', + ], + [ + 'year' => '2007', + 'title' => 'Ingeniera en Administración en Banca y Finanzas', + 'institution' => 'Universidad Técnica Particular de Loja (UTPL)', + 'detail' => '', + ], + ], + 'certifications' => [ + ['year' => '2026', 'title' => 'Mujeres que Lideran: Alta Gerencia', 'issuer' => 'Foro UNIR — Universidad Internacional de La Rioja'], + ['year' => '2025', 'title' => 'Programa Internacional de Habilidades Gerenciales (48 h)', 'issuer' => 'IDEASGROUP — Ecuador / México'], + ['year' => '2025', 'title' => 'Transforma tu Trabajo con Inteligencia Artificial (12 h)', 'issuer' => 'Red de Instituciones Financieras de Desarrollo'], + ['year' => '2025', 'title' => 'Excel: Básico a Dashboard (40 h)', 'issuer' => 'DMARURI Training & Consulting'], + ['year' => '2024', 'title' => 'Administración por Procesos — BPM (64 h)', 'issuer' => 'Escuela Politécnica Nacional — CEC'], + ['year' => '2023', 'title' => 'Formación de Formadores (80 h)', 'issuer' => 'Ministerio del Trabajo del Ecuador | Certificación vigente hasta 2028'], + ['year' => '2023', 'title' => 'Power BI (40 h) | Indicadores Clave de Desempeño — KPI (12 h)', 'issuer' => 'Liderazgo Capacitación & Eventos'], + ['year' => '2020', 'title' => 'Gestión Financiera ERP SAP FI — Key User (30 h)', 'issuer' => 'Socio SAP certificado'], + ['year' => '2020', 'title' => 'Prevención de Lavado de Activos y Financiamiento de Delitos', 'issuer' => 'UAFE — Ecuador'], + ['year' => '2013', 'title' => 'Tributación Integral (36 h)', 'issuer' => 'Universidad Técnica Particular de Loja'], + ], + 'competencies' => [ + 'Finanzas y Operaciones' => [ + 'Gestión de operaciones financieras', + 'Conciliación bancaria', + 'Originación de crédito', + 'Gestión de cartera', + 'Control interno', + 'Tesorería operativa', + 'Microfinanzas', + 'ALA/FT', + ], + 'Tecnología y Procesos' => [ + 'Transformación digital', + 'BPM', + 'Integración de APIs / Web Services', + 'SAP FI', + 'Excel avanzado y dashboards', + 'Power BI', + 'IA aplicada', + 'Core financiero', + ], + 'Liderazgo' => [ + 'Equipos de hasta 48 personas', + 'Remuneración variable', + 'Gestión del cambio', + 'Formación de formadores', + 'Diversidad, equidad e inclusión', + ], + ], + 'volunteer' => [ + 'title' => 'Voluntaria — Hogar San Camilo de Lellis', + 'year' => '2025', + 'body' => 'Hogar de niñas con discapacidad | Loja, Ecuador. Alineado a la visión y misión de responsabilidad social de la Fundación FACES Microfinanzas.', + ], + 'additional' => [ + 'Idiomas' => 'Español nativo | Inglés básico en formación activa', + 'Disponibilidad' => 'Inmediata | Presencial / Híbrida / Remota', + 'C.I.' => '1103591648', + 'Fecha de nacimiento' => '3 de agosto de 1980', + 'Web profesional' => 'pflres.linkedcorp.net', + ], + ]; +} diff --git a/frontend/lumina-cv-theme/inc/visits.php b/frontend/lumina-cv-theme/inc/visits.php new file mode 100644 index 0000000..590c2a1 --- /dev/null +++ b/frontend/lumina-cv-theme/inc/visits.php @@ -0,0 +1,116 @@ + 0) { + $views = (int) get_post_meta($frontPage, '_lumina_views', true); + update_post_meta($frontPage, '_lumina_views', $views + 1); + } + + return; + } + + $postId = get_queried_object_id(); + if ($postId > 0) { + $views = (int) get_post_meta($postId, '_lumina_views', true); + update_post_meta($postId, '_lumina_views', $views + 1); + } +} +add_action('template_redirect', 'lumina_track_visit'); + +function lumina_get_client_ip(): string +{ + $keys = [ + 'HTTP_X_FORWARDED_FOR', + 'HTTP_CLIENT_IP', + 'REMOTE_ADDR', + ]; + + foreach ($keys as $key) { + if (! empty($_SERVER[$key])) { + $value = explode(',', (string) $_SERVER[$key]); + return trim($value[0]); + } + } + + return '0.0.0.0'; +} + +function lumina_register_visits_widget(): void +{ + wp_add_dashboard_widget( + 'lumina_visits_widget', + __('Lumina CV: Visitas', 'lumina'), + 'lumina_render_visits_widget' + ); +} +add_action('wp_dashboard_setup', 'lumina_register_visits_widget'); + +function lumina_render_visits_widget(): void +{ + $total = (int) get_option('lumina_total_visits', 0); + $frontPage = (int) get_option('page_on_front'); + $frontViews = $frontPage > 0 ? (int) get_post_meta($frontPage, '_lumina_views', true) : 0; + ?> +

+

+

+ + +
+
+ + +
> +

+
+ +
+
+ + +
+

+

+
+ +
+
+ + diff --git a/frontend/lumina-cv-theme/style.css b/frontend/lumina-cv-theme/style.css new file mode 100644 index 0000000..5522307 --- /dev/null +++ b/frontend/lumina-cv-theme/style.css @@ -0,0 +1,11 @@ +/* +Theme Name: Lumina CV +Theme URI: https://pflres.linkedcorp.net +Author: mgonzalez +Description: Tema WordPress moderno, alegre y profesional para hoja de vida ejecutiva. Diseño claro con paleta teal y ámbar, tipografía limpia y layout de sidebar izquierdo. +Version: 1.0.0 +Requires at least: 6.8 +Tested up to: 6.8 +Requires PHP: 8.1 +Text Domain: lumina +*/ diff --git a/frontend/persona-cv-theme/assets/css/theme.css b/frontend/persona-cv-theme/assets/css/theme.css new file mode 100644 index 0000000..b4b6d0f --- /dev/null +++ b/frontend/persona-cv-theme/assets/css/theme.css @@ -0,0 +1,458 @@ +/* ========================================================= + Persona CV — Inspirado en Personage / Pixflow + Raleway + Open Sans | Secciones alternas | Timeline central + ========================================================= */ + +:root { + --pn-accent: #c0392b; + --pn-accent-h: #a93226; + --pn-dark: #1a2332; + --pn-dark-2: #243045; + --pn-white: #ffffff; + --pn-gray: #f5f6f8; + --pn-text: #2d3436; + --pn-muted: #636e72; + --pn-border: #e0e3e8; + --pn-header-h: 70px; + --pn-container: 1140px; + --radius: 6px; + --shadow: 0 4px 20px rgba(0,0,0,.1); + --shadow-lg: 0 8px 40px rgba(0,0,0,.15); +} + +*,*::before,*::after{box-sizing:border-box;margin:0;padding:0} +html{scroll-behavior:smooth;scroll-padding-top:var(--pn-header-h);font-size:16px} +body{font-family:'Open Sans',system-ui,sans-serif;color:var(--pn-text);background:var(--pn-white);-webkit-font-smoothing:antialiased;overflow-x:hidden} +img{display:block;max-width:100%} +a{color:var(--pn-accent);text-decoration:none;transition:color .2s,opacity .2s} +a:hover{color:var(--pn-accent-h)} +ul{list-style:none} +h1,h2,h3,h4{font-family:'Raleway',sans-serif;line-height:1.25;color:var(--pn-text)} + +/* ── CONTENEDOR ── */ +.pn-container{max-width:var(--pn-container);margin-inline:auto;padding-inline:2rem} + +/* ── HEADER ── */ +.pn-header{ + position:fixed;top:0;left:0;right:0;z-index:100; + height:var(--pn-header-h); + background:rgba(255,255,255,.97); + border-bottom:1px solid var(--pn-border); + box-shadow:0 2px 12px rgba(0,0,0,.06); + transition:background .3s,box-shadow .3s; +} +.pn-header.is-scrolled{background:#fff;box-shadow:var(--shadow)} +.pn-header__inner{ + max-width:var(--pn-container);margin-inline:auto;padding-inline:2rem; + height:100%;display:flex;align-items:center;gap:2rem; +} +.pn-brand{ + display:flex;align-items:center;gap:.5rem; + font-family:'Raleway',sans-serif;font-size:.95rem;font-weight:700; + color:var(--pn-text);letter-spacing:.04em;text-decoration:none;white-space:nowrap;flex-shrink:0; +} +.pn-brand:hover{color:var(--pn-accent)} +.pn-brand__dot{width:8px;height:8px;border-radius:50%;background:var(--pn-accent);flex-shrink:0} + +.pn-nav{margin-left:auto} +.pn-nav__list{display:flex;align-items:center;gap:.25rem} +.pn-nav__list li a{ + display:block;padding:.4rem .75rem; + font-family:'Raleway',sans-serif;font-size:.72rem;font-weight:600; + letter-spacing:.1em;text-transform:uppercase;color:var(--pn-muted); + border-radius:var(--radius);transition:color .2s;text-decoration:none; +} +.pn-nav__list li a:hover,.pn-nav__list li a.is-active{color:var(--pn-accent)} +.pn-header__actions{flex-shrink:0} + +.pn-hamburger{ + display:none;flex-direction:column;justify-content:center;align-items:center; + gap:5px;width:40px;height:40px;background:none;border:none;cursor:pointer;margin-left:auto; +} +.pn-hamburger span{display:block;width:22px;height:2px;background:var(--pn-text);border-radius:2px;transition:transform .25s,opacity .25s} + +/* ── BOTONES ── */ +.pn-btn{ + display:inline-flex;align-items:center;gap:.5rem; + padding:.75rem 1.75rem;border-radius:var(--radius); + font-family:'Raleway',sans-serif;font-size:.8rem;font-weight:700; + letter-spacing:.08em;text-transform:uppercase;cursor:pointer; + border:2px solid transparent;transition:all .25s;text-decoration:none;line-height:1; +} +.pn-btn svg{width:14px;height:14px;flex-shrink:0} +.pn-btn--accent{background:var(--pn-accent);color:#fff;border-color:var(--pn-accent)} +.pn-btn--accent:hover{background:var(--pn-accent-h);border-color:var(--pn-accent-h);color:#fff} +.pn-btn--white{background:transparent;color:#fff;border-color:rgba(255,255,255,.7)} +.pn-btn--white:hover{background:#fff;color:var(--pn-accent)} +.pn-btn--outline{background:transparent;color:var(--pn-accent);border-color:var(--pn-accent)} +.pn-btn--outline:hover{background:var(--pn-accent);color:#fff} +.pn-btn--sm{padding:.5rem 1.1rem;font-size:.72rem} + +/* ── SECCIONES ── */ +.pn-section{padding:5rem 0} +.pn-section--white{background:var(--pn-white)} +.pn-section--gray{background:var(--pn-gray)} +.pn-section--dark{background:var(--pn-dark)} +.pn-main{padding-top:var(--pn-header-h)} + +/* ── CABECERA DE SECCIÓN ── */ +.pn-section-head{text-align:center;margin-bottom:3.5rem} +.pn-eyebrow{ + display:block;font-family:'Raleway',sans-serif;font-size:.72rem; + font-weight:600;letter-spacing:.2em;text-transform:uppercase; + color:var(--pn-muted);margin-bottom:1rem; +} +.pn-eyebrow--light{color:rgba(255,255,255,.5)} +.pn-section-head h2{ + font-family:'Raleway',sans-serif;font-size:clamp(1.8rem,3vw,2.5rem); + font-weight:700;color:var(--pn-text);letter-spacing:.02em;margin-bottom:.75rem; +} +.pn-section-head__title--light,.pn-section--dark .pn-section-head h2{color:#fff} +.pn-section-bar{width:48px;height:3px;background:var(--pn-accent);border-radius:2px;margin:0 auto} + +/* ── HERO ── */ +.pn-hero{ + position:relative;width:100%;height:100vh;min-height:600px; + display:flex;align-items:center;justify-content:center;overflow:hidden; +} +.pn-hero__bg{ + position:absolute;inset:0;background-size:cover;background-position:center top; + filter:grayscale(20%) brightness(.4);transform:scale(1.05); + transition:transform 8s ease; +} +.pn-hero:hover .pn-hero__bg{transform:scale(1)} +.pn-hero__overlay{ + position:absolute;inset:0; + background:linear-gradient(160deg,rgba(10,18,36,.85) 0%,rgba(192,57,43,.2) 100%); +} +.pn-hero__content{ + position:relative;z-index:2;text-align:center; + display:flex;flex-direction:column;align-items:center;gap:1.25rem; + padding-inline:2rem;max-width:800px; +} +.pn-hero__avatar{ + width:130px;height:130px;border-radius:50%;overflow:hidden; + border:4px solid rgba(255,255,255,.9); + box-shadow:0 0 0 8px rgba(192,57,43,.25),var(--shadow-lg); + flex-shrink:0; +} +.pn-hero__avatar img{width:100%;height:100%;object-fit:cover} +.pn-hero__eyebrow{ + font-family:'Raleway',sans-serif;font-size:.72rem;font-weight:600; + letter-spacing:.25em;text-transform:uppercase;color:var(--pn-accent); +} +.pn-hero__name{ + font-family:'Raleway',sans-serif;font-size:clamp(2.2rem,5vw,3.5rem); + font-weight:800;color:#fff;letter-spacing:.03em;line-height:1.1; +} +.pn-hero__roles{ + font-family:'Raleway',sans-serif;font-size:clamp(.9rem,1.8vw,1.1rem); + font-weight:300;color:rgba(255,255,255,.8);letter-spacing:.05em; + display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.5rem; +} +.pn-hero__roles-sep{color:var(--pn-accent);font-weight:400} +.pn-hero__chips{display:flex;flex-wrap:wrap;justify-content:center;gap:.75rem} +.pn-hero__chip{ + display:inline-flex;align-items:center;gap:.4rem; + padding:.3rem .9rem;border-radius:var(--radius); + font-size:.75rem;font-weight:500; + background:rgba(255,255,255,.12);color:rgba(255,255,255,.85); + border:1px solid rgba(255,255,255,.2);backdrop-filter:blur(4px); +} +.pn-hero__chip--avail{color:#6fcf97;border-color:rgba(111,207,151,.4);background:rgba(111,207,151,.1)} +.pn-dot{width:6px;height:6px;border-radius:50%;background:#6fcf97;animation:pn-blink 2s ease-in-out infinite} +@keyframes pn-blink{0%,100%{opacity:1}50%{opacity:.3}} +.pn-hero__actions{display:flex;flex-wrap:wrap;justify-content:center;gap:.75rem} +.pn-hero__socials{display:flex;gap:.75rem;justify-content:center} +.pn-social-icon{ + width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center; + background:rgba(255,255,255,.12);color:#fff;border:1px solid rgba(255,255,255,.25); + transition:background .2s,border-color .2s,color .2s; +} +.pn-social-icon:hover{background:var(--pn-accent);border-color:var(--pn-accent);color:#fff} +.pn-social-icon svg{width:15px;height:15px} +.pn-social-icon--dark{background:var(--pn-gray);color:var(--pn-text);border-color:var(--pn-border)} +.pn-social-icon--dark:hover{background:var(--pn-accent);color:#fff;border-color:var(--pn-accent)} +.pn-scroll-hint{ + position:absolute;bottom:2rem;left:50%;transform:translateX(-50%); + width:26px;height:44px;border:2px solid rgba(255,255,255,.4);border-radius:13px; + display:flex;align-items:flex-start;justify-content:center;padding-top:6px; +} +.pn-scroll-hint span{ + width:4px;height:8px;background:rgba(255,255,255,.7);border-radius:2px; + animation:pn-scroll 2s ease-in-out infinite; +} +@keyframes pn-scroll{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(16px)}} + +/* ── SOBRE MÍ ── */ +.pn-about-grid{display:grid;grid-template-columns:280px 1fr;gap:4rem;align-items:start} +.pn-about-photo-col{text-align:center} +.pn-about-photo{ + width:220px;height:220px;border-radius:50%;overflow:hidden;margin:0 auto 1.25rem; + box-shadow:0 0 0 6px var(--pn-gray),0 0 0 10px var(--pn-accent),var(--shadow-lg); +} +.pn-about-photo img{width:100%;height:100%;object-fit:cover} +.pn-about-name{font-family:'Raleway',sans-serif;font-size:1.15rem;font-weight:700;margin-bottom:.25rem} +.pn-about-role{font-size:.82rem;color:var(--pn-muted);line-height:1.5;margin-bottom:1rem} +.pn-about-socials{display:flex;justify-content:center;gap:.5rem} +.pn-about-text-col h3{ + font-family:'Raleway',sans-serif;font-size:1.35rem;font-weight:700; + margin-bottom:1rem;color:var(--pn-text); +} +.pn-about-text-col p{font-size:.95rem;color:var(--pn-muted);line-height:1.8;margin-bottom:2rem} +.pn-personal-details{border-top:2px solid var(--pn-gray);padding-top:1.5rem;display:flex;flex-direction:column;gap:.75rem} +.pn-pd-row{display:grid;grid-template-columns:130px 1fr;gap:1rem;font-size:.875rem} +.pn-pd-row span{color:var(--pn-muted);font-weight:600;text-transform:uppercase;font-size:.72rem;letter-spacing:.06em;padding-top:2px} +.pn-pd-row strong{color:var(--pn-text);font-weight:500} +.pn-pd-row strong a{color:var(--pn-accent)} + +/* ── CONTADORES ── */ +.pn-counters{ + display:grid;grid-template-columns:repeat(5,1fr);gap:1px; + background:rgba(255,255,255,.08);border-radius:var(--radius);overflow:hidden; +} +.pn-counter{ + display:flex;flex-direction:column;align-items:center;gap:.75rem; + padding:2.5rem 1rem;text-align:center;background:transparent; + transition:background .2s;position:relative; +} +.pn-counter::after{ + content:'';position:absolute;right:0;top:25%;bottom:25%; + width:1px;background:rgba(255,255,255,.1); +} +.pn-counter:last-child::after{display:none} +.pn-counter:hover{background:rgba(255,255,255,.04)} +.pn-counter__number{ + font-family:'Raleway',sans-serif;font-size:clamp(2.2rem,4vw,3rem); + font-weight:800;color:var(--pn-accent);line-height:1; +} +.pn-counter__label{font-size:.78rem;color:rgba(255,255,255,.55);letter-spacing:.06em;text-transform:uppercase} + +/* ── HIGHLIGHTS ── */ +.pn-highlights-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5rem;margin-bottom:3rem} +.pn-highlight-card{ + text-align:center;padding:2rem 1.5rem;background:#fff; + border:1px solid var(--pn-border);border-radius:var(--radius); + box-shadow:var(--shadow);transition:transform .2s,box-shadow .2s;position:relative;overflow:hidden; +} +.pn-highlight-card::before{ + content:'';position:absolute;top:0;left:0;right:0;height:3px;background:var(--pn-accent); +} +.pn-highlight-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg)} +.pn-highlight-card__value{ + font-family:'Raleway',sans-serif;font-size:clamp(1.8rem,3vw,2.6rem); + font-weight:800;color:var(--pn-accent);line-height:1;margin-bottom:.75rem; +} +.pn-highlight-card p{font-size:.82rem;color:var(--pn-muted);line-height:1.5} +.pn-impact-row{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem} +.pn-impact-card{ + padding:2rem;background:#fff;border:1px solid var(--pn-border);border-radius:var(--radius); + box-shadow:var(--shadow);transition:transform .2s,box-shadow .2s; +} +.pn-impact-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)} +.pn-impact-card__icon{ + width:48px;height:48px;background:rgba(192,57,43,.08);border-radius:var(--radius); + color:var(--pn-accent);padding:.75rem;margin-bottom:1rem; +} +.pn-impact-card__icon svg{width:100%;height:100%} +.pn-impact-card h3{font-family:'Raleway',sans-serif;font-size:1rem;font-weight:700;margin-bottom:.5rem} +.pn-impact-card p{font-size:.875rem;color:var(--pn-muted);line-height:1.65} + +/* ── TIMELINE CENTRADO ── */ +.pn-timeline{position:relative;padding:1rem 0} +.pn-timeline::before{ + content:'';position:absolute;left:50%;transform:translateX(-50%); + top:0;bottom:0;width:2px;background:var(--pn-border); +} +.pn-tl-entry{ + display:flex;width:100%;position:relative;margin-bottom:3rem; +} +.pn-tl-entry--left{justify-content:flex-end;padding-right:calc(50% + 2.5rem)} +.pn-tl-entry--right{justify-content:flex-start;padding-left:calc(50% + 2.5rem)} +.pn-tl-content{ + width:100%;max-width:440px;background:#fff;border:1px solid var(--pn-border); + border-radius:var(--radius);padding:1.75rem;box-shadow:var(--shadow); + transition:transform .2s,box-shadow .2s; +} +.pn-tl-content:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)} +.pn-tl-dot{ + position:absolute;left:50%;top:1.75rem;transform:translateX(-50%); + width:16px;height:16px;border-radius:50%;background:#fff; + border:3px solid var(--pn-accent);z-index:1; + box-shadow:0 0 0 4px rgba(192,57,43,.15); +} +.pn-tl-period{ + display:inline-block;padding:.2rem .7rem;border-radius:var(--radius); + font-family:'Raleway',sans-serif;font-size:.68rem;font-weight:700; + letter-spacing:.06em;text-transform:uppercase; + background:rgba(192,57,43,.08);color:var(--pn-accent);margin-bottom:.75rem; +} +.pn-tl-content h3{font-family:'Raleway',sans-serif;font-size:1.05rem;font-weight:700;margin-bottom:.25rem} +.pn-tl-company{font-size:.83rem;font-weight:600;color:var(--pn-accent);margin-bottom:.5rem} +.pn-tl-company em{font-style:normal;color:var(--pn-muted);font-weight:400} +.pn-tl-lead{font-size:.875rem;color:var(--pn-muted);font-style:italic;line-height:1.65;margin-bottom:.75rem} +.pn-tl-bullets{display:flex;flex-direction:column;gap:.4rem} +.pn-tl-bullets li{font-size:.83rem;color:var(--pn-muted);line-height:1.6;padding-left:1rem;position:relative} +.pn-tl-bullets li::before{content:'▸';position:absolute;left:0;top:0;color:var(--pn-accent);font-size:.7rem;line-height:1.8} + +/* ── FORMACIÓN ── */ +.pn-edu-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:2rem} +.pn-edu-card{ + display:flex;gap:1.5rem;align-items:flex-start;padding:2rem; + background:#fff;border:1px solid var(--pn-border);border-radius:var(--radius); + box-shadow:var(--shadow);transition:transform .2s,box-shadow .2s; +} +.pn-edu-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)} +.pn-edu-card__year{ + font-family:'Raleway',sans-serif;font-size:1.4rem;font-weight:800; + color:var(--pn-accent);flex-shrink:0;line-height:1;padding-top:2px; +} +.pn-edu-card h3{font-family:'Raleway',sans-serif;font-size:.95rem;font-weight:700;margin-bottom:.4rem;line-height:1.4} +.pn-edu-card__inst{font-size:.83rem;color:var(--pn-muted);line-height:1.5} +.pn-edu-card__detail{font-size:.78rem;color:var(--pn-accent);margin-top:.4rem;font-style:italic} + +/* ── COMPETENCIAS / SKILLS ── */ +.pn-skills-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:3rem} +.pn-skills-group h3{ + font-family:'Raleway',sans-serif;font-size:.9rem;font-weight:700; + letter-spacing:.06em;text-transform:uppercase;color:var(--pn-text); + margin-bottom:1.5rem;padding-bottom:.5rem;border-bottom:2px solid var(--pn-accent); +} +.pn-skill{margin-bottom:1.25rem} +.pn-skill__header{ + display:flex;justify-content:space-between;align-items:center; + font-size:.82rem;color:var(--pn-text);margin-bottom:.4rem; +} +.pn-skill__header span:last-child{font-weight:700;color:var(--pn-accent);font-size:.78rem} +.pn-skill__bar{height:6px;background:var(--pn-border);border-radius:3px;overflow:hidden} +.pn-skill__fill{height:100%;background:var(--pn-accent);border-radius:3px;width:0%;transition:width .8s cubic-bezier(.4,0,.2,1)} + +/* ── CERTIFICACIONES ── */ +.pn-certs-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem} +.pn-cert{ + display:flex;gap:1.25rem;align-items:flex-start; + padding:1.25rem;background:#fff;border:1px solid var(--pn-border); + border-radius:var(--radius);transition:border-color .2s,box-shadow .2s; +} +.pn-cert:hover{border-color:var(--pn-accent);box-shadow:var(--shadow)} +.pn-cert__year{ + font-family:'Raleway',sans-serif;font-size:.72rem;font-weight:700; + background:var(--pn-accent);color:#fff;padding:.25rem .5rem; + border-radius:var(--radius);flex-shrink:0;letter-spacing:.04em; + align-self:flex-start; +} +.pn-cert h3{font-size:.875rem;font-weight:600;color:var(--pn-text);margin-bottom:.25rem;line-height:1.4} +.pn-cert p{font-size:.78rem;color:var(--pn-muted)} + +/* ── CONTACTO ── */ +.pn-contact-grid{display:grid;grid-template-columns:1fr 360px;gap:4rem;align-items:start} +.pn-contact-list{display:flex;flex-direction:column;gap:1.25rem;margin-bottom:2.5rem} +.pn-contact-list li{display:flex;align-items:flex-start;gap:.875rem;color:rgba(255,255,255,.7);font-size:.9rem} +.pn-contact-list li a{color:rgba(255,255,255,.7);transition:color .2s} +.pn-contact-list li a:hover{color:var(--pn-accent)} +.pn-contact-list__icon{width:18px;height:18px;flex-shrink:0;color:var(--pn-accent);margin-top:1px} +.pn-contact-list__icon svg{width:100%;height:100%} +.pn-contact-extra{ + padding:1.5rem;background:rgba(255,255,255,.05);border-radius:var(--radius); + border-left:3px solid var(--pn-accent);margin-bottom:2rem; +} +.pn-contact-extra h4{font-family:'Raleway',sans-serif;font-size:.72rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--pn-accent);margin-bottom:.5rem} +.pn-contact-extra__title{font-size:.9rem;font-weight:600;color:#fff;margin-bottom:.5rem} +.pn-contact-extra__title span{font-weight:400;color:rgba(255,255,255,.5);margin-left:.5rem} +.pn-contact-extra p:last-child{font-size:.83rem;color:rgba(255,255,255,.5);line-height:1.6} +.pn-extra-dl{display:flex;flex-direction:column;gap:.875rem} +.pn-extra-dl>div{display:grid;grid-template-columns:140px 1fr;gap:.5rem;padding-bottom:.875rem;border-bottom:1px solid rgba(255,255,255,.08)} +.pn-extra-dl>div:last-child{border-bottom:none} +.pn-extra-dl dt{font-size:.68rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:rgba(255,255,255,.3)} +.pn-extra-dl dd{font-size:.83rem;color:rgba(255,255,255,.65)} + +.pn-bcard-label{font-family:'Raleway',sans-serif;font-size:.68rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--pn-accent);margin-bottom:1rem} +.pn-bcard{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);border-radius:var(--radius);overflow:hidden} +.pn-bcard__front{display:flex;align-items:center;gap:1rem;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(255,255,255,.08)} +.pn-bcard__photo{width:52px;height:52px;border-radius:50%;overflow:hidden;flex-shrink:0;border:2px solid var(--pn-accent)} +.pn-bcard__photo img{width:100%;height:100%;object-fit:cover} +.pn-bcard__name{font-family:'Raleway',sans-serif;font-size:.92rem;font-weight:700;color:#fff;margin-bottom:.2rem} +.pn-bcard__role{font-size:.72rem;color:rgba(255,255,255,.5);line-height:1.4} +.pn-bcard__details{display:grid;grid-template-columns:80px 1fr;gap:1rem;padding:1.25rem 1.5rem} +.pn-bcard__qr img{width:80px;height:80px;border-radius:var(--radius);filter:invert(1) opacity(.85)} +.pn-bcard__info{display:flex;flex-direction:column;gap:3px;font-size:.75rem;color:rgba(255,255,255,.5)} +.pn-bcard__info a{color:var(--pn-accent);font-weight:500;word-break:break-all} + +.pn-footer-bar{ + margin-top:4rem;padding-top:2rem;border-top:1px solid rgba(255,255,255,.08); + text-align:center;font-size:.78rem;color:rgba(255,255,255,.3);letter-spacing:.04em; +} +.pn-wp-content{margin-top:2rem;padding:1.5rem;background:rgba(255,255,255,.05);border-radius:var(--radius);color:rgba(255,255,255,.7);font-size:.9rem;line-height:1.75} + +/* ── SCROLL TOP ── */ +.pn-scroll-top{ + position:fixed;bottom:2rem;right:2rem;z-index:90; + width:44px;height:44px;background:var(--pn-accent);color:#fff; + border-radius:50%;display:flex;align-items:center;justify-content:center; + font-size:1.4rem;box-shadow:var(--shadow); + opacity:0;visibility:hidden;transform:translateY(10px); + transition:opacity .3s,visibility .3s,transform .3s; +} +.pn-scroll-top.is-visible{opacity:1;visibility:visible;transform:translateY(0)} +.pn-scroll-top:hover{background:var(--pn-accent-h);color:#fff} + +/* ── RESPONSIVE 1024 ── */ +@media(max-width:1024px){ + .pn-counters{grid-template-columns:repeat(3,1fr)} + .pn-counter:nth-child(3)::after{display:none} + .pn-skills-cols{grid-template-columns:repeat(2,1fr)} + .pn-contact-grid{grid-template-columns:1fr} + .pn-about-grid{grid-template-columns:220px 1fr;gap:2.5rem} + .pn-highlights-grid{grid-template-columns:repeat(2,1fr)} +} + +/* ── RESPONSIVE 768 ── */ +@media(max-width:768px){ + :root{--pn-header-h:60px} + .pn-section{padding:3.5rem 0} + + .pn-hamburger{display:flex} + .pn-nav{ + display:none;position:absolute;top:var(--pn-header-h);left:0;right:0; + background:#fff;border-bottom:1px solid var(--pn-border); + padding:1rem;box-shadow:var(--shadow);z-index:99; + } + .pn-nav.is-open{display:block} + .pn-nav__list{flex-direction:column;gap:.25rem} + .pn-nav__list li a{padding:.6rem 1rem;font-size:.8rem} + .pn-header__actions{display:none} + + .pn-about-grid{grid-template-columns:1fr} + .pn-about-photo-col{max-width:280px;margin:0 auto} + + .pn-timeline::before{left:20px} + .pn-tl-entry--left,.pn-tl-entry--right{padding:0 0 0 50px;justify-content:flex-start} + .pn-tl-dot{left:14px;transform:none} + .pn-tl-content{max-width:100%} + + .pn-edu-grid{grid-template-columns:1fr} + .pn-skills-cols{grid-template-columns:1fr} + .pn-certs-grid{grid-template-columns:1fr} + .pn-impact-row{grid-template-columns:1fr} + .pn-highlights-grid{grid-template-columns:repeat(2,1fr)} + + .pn-counters{grid-template-columns:repeat(2,1fr)} + .pn-counter::after{display:none} + .pn-counter:nth-child(odd)::after{display:block} + + .pn-hero__avatar{width:100px;height:100px} +} + +/* ── PRINT ── */ +@media print{ + .pn-header,.pn-scroll-top,.pn-scroll-hint,.pn-hero__actions{display:none!important} + .pn-hero{height:auto;min-height:0;padding:3rem 2rem} + .pn-hero__bg{display:none} + .pn-hero__overlay{background:var(--pn-dark)!important} + .pn-main{padding-top:0} + .pn-section{padding:2rem 0} + .pn-tl-content,.pn-highlight-card,.pn-edu-card{box-shadow:none;page-break-inside:avoid} + .pn-skill__fill{background:var(--pn-accent)!important} + a{color:inherit!important} + .pn-section--dark{background:#1a2332!important} +} diff --git a/frontend/persona-cv-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx b/frontend/persona-cv-theme/assets/docs/CV_Patricia_Flores_Sanchez_ES_FINAL.docx new file mode 100644 index 0000000000000000000000000000000000000000..544bf3d781cd85ddc8becbc624bf639c8ba6fe11 GIT binary patch literal 19375 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

}m|)H;34nU|q@|s4__NYn(gcG+~g* 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 literal 0 HcmV?d00001 diff --git a/frontend/persona-cv-theme/assets/images/patricia-flores-qr.png b/frontend/persona-cv-theme/assets/images/patricia-flores-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..55703ad812dff9f68d5f2e853e2b507c27c2c478 GIT binary patch literal 535 zcmV+y0_gpTP)00006P)t-s|Ns90 z0033O(|!N|010qNS#tmY4#WTe4#WYKD-Ig~00Fm2L_t(|obB2%u7fZP24EuwMvjo9 za5OktkHQf;c6h2^?AS>tm7c0c3d8RykdIDQoVX$SC}uA4@RwtJScrPQ(^Snrp`lyo zr;|SF5E1{V))2iofQD|R2c1w|M;AXM(VfoUprOB^gNy_PStAJ=`r=x4lUm+Gsq@g# z&9#MRtUd%mw#GVuhHj&|M77skby0C?z?$t=%aPc*qEO-NL?b$ z&oP#F-3dtQLPNLF@-oDiIXEY3uY=hSKG4t?&@l$CqSSe|2IoSS->J?+Lm#Z?bV9!g z8X~F_wcplxXy_)I$Plx4DlJl-*Lal54-I{;&iQShSzoh?mz^mzbSqslHrIL92_5X} zJT&y-I%h0znnM$_UmJpkzLMtLTi?e+n@hA`W1*q{ueT9=ew8OH`0}s#+m<{u^bvaA zB&KM3x!1dN)p-XR`fRUM;qk%414pXz2D@!|qht z^4a-EZ*KuZL!YWMV!y{hI$VATKs002ovPDHLkV1nW!_Bj9m literal 0 HcmV?d00001 diff --git a/frontend/persona-cv-theme/assets/images/profile-placeholder.svg b/frontend/persona-cv-theme/assets/images/profile-placeholder.svg new file mode 100644 index 0000000..3d7dbb0 --- /dev/null +++ b/frontend/persona-cv-theme/assets/images/profile-placeholder.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/frontend/persona-cv-theme/assets/js/theme.js b/frontend/persona-cv-theme/assets/js/theme.js new file mode 100644 index 0000000..3d7c4d6 --- /dev/null +++ b/frontend/persona-cv-theme/assets/js/theme.js @@ -0,0 +1,97 @@ +document.addEventListener("DOMContentLoaded", () => { + + /* ── Header scroll ── */ + const header = document.querySelector(".pn-header"); + const scrollTop = document.querySelector(".pn-scroll-top"); + window.addEventListener("scroll", () => { + const y = window.scrollY; + if (header) header.classList.toggle("is-scrolled", y > 60); + if (scrollTop) scrollTop.classList.toggle("is-visible", y > 400); + }, { passive: true }); + + /* ── Mobile nav ── */ + const hamburger = document.querySelector(".pn-hamburger"); + const nav = document.querySelector(".pn-nav"); + if (hamburger && nav) { + hamburger.addEventListener("click", () => { + const open = nav.classList.toggle("is-open"); + hamburger.setAttribute("aria-expanded", String(open)); + const s = hamburger.querySelectorAll("span"); + if (s.length === 3) { + s[0].style.transform = open ? "rotate(45deg) translate(5px, 5px)" : ""; + s[1].style.opacity = open ? "0" : ""; + s[2].style.transform = open ? "rotate(-45deg) translate(5px, -5px)" : ""; + } + }); + document.addEventListener("click", e => { + if (!nav.contains(e.target) && !hamburger.contains(e.target)) { + nav.classList.remove("is-open"); + hamburger.setAttribute("aria-expanded", "false"); + hamburger.querySelectorAll("span").forEach(s => { s.style.transform = ""; s.style.opacity = ""; }); + } + }); + } + + /* ── Nav active on scroll ── */ + const navLinks = Array.from(document.querySelectorAll(".pn-nav__list a[href^='#']")); + const sections = Array.from(document.querySelectorAll("section[id]")); + if (navLinks.length && sections.length) { + const obs = new IntersectionObserver(entries => { + entries.forEach(e => { + if (e.isIntersecting) { + const id = "#" + e.target.id; + navLinks.forEach(l => l.classList.toggle("is-active", l.getAttribute("href") === id)); + } + }); + }, { rootMargin: "-20% 0px -70% 0px" }); + sections.forEach(s => obs.observe(s)); + } + navLinks.forEach(l => l.addEventListener("click", () => { + if (nav) nav.classList.remove("is-open"); + })); + + /* ── Animated counters ── */ + const counters = Array.from(document.querySelectorAll(".pn-counter__val")); + const counterObs = new IntersectionObserver(entries => { + entries.forEach(entry => { + if (!entry.isIntersecting) return; + counterObs.unobserve(entry.target); + const el = entry.target; + const end = parseInt(el.dataset.count, 10); + const duration = 1800; + const step = Math.ceil(end / (duration / 16)); + let current = 0; + const tick = () => { + current = Math.min(current + step, end); + el.textContent = current.toLocaleString("es-EC"); + if (current < end) requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); + }); + }, { threshold: 0.3 }); + counters.forEach(c => counterObs.observe(c)); + + /* ── Skill bars animation ── */ + const skillBars = Array.from(document.querySelectorAll(".pn-skill__fill")); + const skillObs = new IntersectionObserver(entries => { + entries.forEach(entry => { + if (!entry.isIntersecting) return; + skillObs.unobserve(entry.target); + const bar = entry.target; + const pct = bar.dataset.pct; + setTimeout(() => { bar.style.width = pct + "%"; }, 100); + }); + }, { threshold: 0.2 }); + skillBars.forEach(b => skillObs.observe(b)); + + /* ── Print ── */ + document.querySelectorAll("[data-persona-print]").forEach(b => b.addEventListener("click", () => window.print())); + + /* ── Scroll top ── */ + if (scrollTop) { + scrollTop.addEventListener("click", e => { + e.preventDefault(); + window.scrollTo({ top: 0, behavior: "smooth" }); + }); + } +}); diff --git a/frontend/persona-cv-theme/footer.php b/frontend/persona-cv-theme/footer.php new file mode 100644 index 0000000..fcb1e0c --- /dev/null +++ b/frontend/persona-cv-theme/footer.php @@ -0,0 +1,6 @@ + +

+⇧ + + + diff --git a/frontend/persona-cv-theme/front-page.php b/frontend/persona-cv-theme/front-page.php new file mode 100644 index 0000000..b6d456b --- /dev/null +++ b/frontend/persona-cv-theme/front-page.php @@ -0,0 +1,382 @@ + + + +
+
+
+
+
+ <?php echo esc_attr($heroName); ?> +
+

+

+
+ + | + +
+
+ + + + + + + + +
+
+ + + + + +
+
+ + + + + + + + + + + +
+
+ + + +
+ + +
+
+
+ ── ── +

+
+
+ +
+
+
+ <?php echo esc_attr($heroName); ?> +
+

+

+
+ + + + +
+ +
+ +
+

+

+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ +
+ + 0 + + +
+ +
+
+
+ + +
+
+
+ ── ── +

+
+
+
+ +
+
+ + +
+

+
+ +
+ +
+ +
+ +

+

+
+ +
+
+
+ + +
+
+
+ ── ── +

+
+
+
+ $job) : ?> +
+
+ +

+

+ + · +

+

+
    + +
  • + +
+
+ +
+ +
+
+
+ + +
+
+
+ ── ── +

+
+
+
+ +
+ +
+

+

+ +

+ +
+
+ +
+
+
+ + +
+
+
+ ── ── +

+
+
+
+ $items) : ?> +
+

+ +
+
+ + % +
+
+
+
+
+ +
+ +
+
+
+ + +
+
+
+ ── ── +

+
+
+
+ +
+ +
+

+

+
+
+ +
+
+
+ + +
+
+
+ ── ── +

+
+
+ +
+
+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • + +
  • + + LinkedIn +
  • + +
+ +
+

+

+

+
+ +
+ $value) : ?> +
+ +
+
+ +
+

+
+
+
+ <?php echo esc_attr($heroName); ?> +
+
+

+

+
+
+
+
+ <?php esc_attr_e('QR perfil web', 'persona'); ?> +
+
+

+

+

+ +
+
+
+
+
+ + +
+ + + +
+
+ + diff --git a/frontend/persona-cv-theme/functions.php b/frontend/persona-cv-theme/functions.php new file mode 100644 index 0000000..b9944cc --- /dev/null +++ b/frontend/persona-cv-theme/functions.php @@ -0,0 +1,67 @@ + __('Menú principal', 'persona')]); +} +add_action('after_setup_theme', 'persona_setup'); + +function persona_enqueue_assets(): void { + wp_enqueue_style('persona-fonts', + 'https://fonts.googleapis.com/css2?family=Raleway:wght@300;400;500;600;700;800&family=Open+Sans:wght@300;400;600&display=swap', + [], null); + wp_enqueue_style('persona-theme', + get_template_directory_uri() . '/assets/css/theme.css', + ['persona-fonts'], wp_get_theme()->get('Version')); + wp_enqueue_script('persona-theme', + get_template_directory_uri() . '/assets/js/theme.js', + [], wp_get_theme()->get('Version'), true); +} +add_action('wp_enqueue_scripts', 'persona_enqueue_assets'); + +function persona_body_classes(array $classes): array { + $classes[] = 'persona-shell'; + if (is_front_page()) $classes[] = 'persona-front'; + return $classes; +} +add_filter('body_class', 'persona_body_classes'); + +function persona_redirect_sample(): void { + if (!is_page()) return; + $p = get_queried_object(); + if ($p instanceof WP_Post && $p->post_name === 'pagina-ejemplo') { + wp_safe_redirect(home_url('/'), 301); exit; + } +} +add_action('template_redirect', 'persona_redirect_sample', 1); + +function persona_render_nav(): string { + if (has_nav_menu('primary')) { + return trim((string) wp_nav_menu([ + 'theme_location' => 'primary', 'container' => false, + 'fallback_cb' => false, 'menu_class' => 'pn-nav__list', 'echo' => false, + ])); + } + $items = [ + '#sobre-mi' => 'Sobre mí', + '#impacto' => 'Impacto', + '#experiencia' => 'Experiencia', + '#formacion' => 'Formación', + '#competencias' => 'Competencias', + '#certificaciones' => 'Certificaciones', + '#contacto' => 'Contacto', + ]; + $html = '
    '; + foreach ($items as $href => $label) { + $html .= sprintf('
  • %s
  • ', esc_url($href), esc_html($label)); + } + return $html . '
'; +} diff --git a/frontend/persona-cv-theme/header.php b/frontend/persona-cv-theme/header.php new file mode 100644 index 0000000..83f0708 --- /dev/null +++ b/frontend/persona-cv-theme/header.php @@ -0,0 +1,34 @@ + + +> + + + + + +> + + +
+
+ + + + + + +
+
+ +
diff --git a/frontend/persona-cv-theme/inc/customizer.php b/frontend/persona-cv-theme/inc/customizer.php new file mode 100644 index 0000000..9b13d7d --- /dev/null +++ b/frontend/persona-cv-theme/inc/customizer.php @@ -0,0 +1,23 @@ +add_section('persona_hero', ['title' => __('Persona CV: Presentación', 'persona'), 'priority' => 30]); + $fields = [ + 'pn_hero_name' => ['label' => __('Nombre', 'persona'), 'default' => 'Patricia Soledad Flores Sánchez'], + 'pn_hero_role' => ['label' => __('Rol', 'persona'), 'default' => 'Gerente / Jefa de Operaciones Financieras'], + 'pn_contact_location' => ['label' => __('Ubicación', 'persona'), 'default' => 'Loja, Ecuador'], + 'pn_contact_email' => ['label' => __('Correo', 'persona'), 'default' => 'patricflorsanchez@gmail.com'], + 'pn_contact_phone' => ['label' => __('Teléfono', 'persona'), 'default' => '+593 99 469 8405'], + 'pn_social_linkedin' => ['label' => __('LinkedIn URL', 'persona'), 'default' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/'], + ]; + $wp_customize->add_setting('pn_profile_image', ['default' => '', 'sanitize_callback' => 'esc_url_raw']); + $wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'pn_profile_image', [ + 'label' => __('Foto de perfil', 'persona'), 'section' => 'persona_hero', 'settings' => 'pn_profile_image', + ])); + foreach ($fields as $key => $field) { + $isUrl = str_contains($key, 'linkedin'); + $wp_customize->add_setting($key, ['default' => $field['default'], 'sanitize_callback' => $isUrl ? 'esc_url_raw' : 'sanitize_text_field']); + $wp_customize->add_control($key, ['label' => $field['label'], 'section' => 'persona_hero', 'type' => 'text']); + } +} +add_action('customize_register', 'persona_customize_register'); diff --git a/frontend/persona-cv-theme/inc/cv-data.php b/frontend/persona-cv-theme/inc/cv-data.php new file mode 100644 index 0000000..b7b5e8e --- /dev/null +++ b/frontend/persona-cv-theme/inc/cv-data.php @@ -0,0 +1,157 @@ + [ + 'eyebrow' => 'Currículum ejecutivo', + 'name' => 'Patricia Soledad Flores Sánchez', + 'role' => 'Gerente / Jefa de Operaciones Financieras', + 'role2' => 'Sector financiero y microfinanzas', + 'intro' => 'Ejecutiva financiera con más de 22 años de trayectoria en banca y microfinanzas. Máster en Dirección y Planificación Financiera, reconocido por la SENECYT en Ecuador, con especialización en gestión operativa, transformación digital de procesos, control interno y liderazgo de equipos multidisciplinarios.', + 'location' => 'Loja, Ecuador', + 'email' => 'patricflorsanchez@gmail.com', + 'phone' => '+593 99 469 8405', + 'linkedin' => 'https://www.linkedin.com/in/patricia-soledad-flores-s%C3%A1nchez-43b84418/', + 'availability' => 'Inmediata | Presencial / Híbrida / Remota', + 'focus' => 'Operaciones financieras, control interno y transformación digital', + 'languages' => 'Español nativo | Inglés básico en formación activa', + 'born' => '3 de agosto de 1980', + 'id' => '1103591648', + 'web' => 'pflres.linkedcorp.net', + ], + 'metrics' => [ + ['value' => '22', 'suffix' => '+', 'label' => 'Años de experiencia'], + ['value' => '26', 'suffix' => '', 'label' => 'Agencias lideradas'], + ['value' => '48', 'suffix' => '', 'label' => 'Personas a cargo'], + ['value' => '5', 'suffix' => 'M', 'label' => 'USD ops. mensuales'], + ['value' => '28000', 'suffix' => '', 'label' => 'Clientes coordinados'], + ], + 'highlights' => [ + ['value' => '9/10', 'label' => 'Calificación excelente 4 trimestres consecutivos'], + ['value' => '74%', 'label' => 'Reducción requerimientos soporte a Dirección'], + ['value' => '1.68', 'suffix' => 'días', 'label' => 'Tiempo desembolso Q3 2025, mejor del año'], + ['value' => '75%', 'label' => 'Reducción rotación de personal 2022–2026'], + ], + 'summary' => [ + 'title' => 'Perfil estratégico con enfoque en eficiencia, control y ejecución sostenible', + 'body' => 'Actualmente lidera la operatividad de 26 agencias a nivel nacional y coordina aproximadamente 1.500 operaciones de microcrédito mensuales, por un monto cercano a USD 5 millones. También articula la recaudación de cerca de 28.000 clientes por canales internos y externos, integrando visión operativa, criterio financiero, disciplina de control y liderazgo sostenido del desempeño.', + ], + 'impact' => [ + ['title' => 'Transformación digital', 'body' => 'Lideró desembolsos por transferencia bancaria, integración de APIs bancarias y digitalización de expedientes y pagarés en 13 agencias.'], + ['title' => 'Automatización crítica', 'body' => 'Automatizó el seguro de desgravamen, desde el cálculo de prima hasta la liquidación contable, reduciendo tiempos de 17 a 10 días.'], + ['title' => 'Supervisión nacional', 'body' => 'Implementó una matriz de supervisión y certificación por agencia, elevando el índice de cumplimiento operativo del 65 % al 88 %.'], + ], + 'experience' => [ + [ + 'period' => 'Abr. 2022 – Presente', 'title' => 'Jefa de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', 'location' => 'Loja, Ecuador', + 'lead' => 'Responsable del desempeño operativo nacional, cumplimiento del POA, control interno, digitalización de procesos y gestión de equipos.', + 'bullets' => [ + 'Cumplimiento del POA: 98 % (Q2 2025), 96 % (Q3 2025), 100 % (Q4 2025) y 105 % (Q1 2026).', + 'Desembolsos por transferencia: 47,80 % del monto total en Q1 2026.', + 'Redujo requerimientos de soporte un 74 %, de 1.489 a 382, mediante descentralización.', + 'Automatizó el seguro de desgravamen con asientos contables automatizados.', + 'Elevó el cumplimiento operativo nacional del 65 % al 88 %.', + 'Redujo el tiempo de desembolso a 1,68 días en Q3 2025 (meta: máx. 2 días).', + 'Recuperación de mora: 90,60 % en Q1 2026 — USD 3,06 M sobre USD 3,37 M.', + 'Redujo la rotación del área del 41,46 % al 10,24 % (dic. 2022 – mar. 2026).', + 'Participa en comités estratégicos, auditorías y representación institucional internacional.', + ], + ], + [ + 'period' => 'Feb. 2021 – Mar. 2022', 'title' => 'Supervisora de Operaciones', + 'company' => 'Fundación FACES Microfinanzas', 'location' => 'Loja, Ecuador', + 'lead' => 'Supervisó operaciones de 18 agencias a nivel nacional y regularizó procesos críticos inexistentes o incompletos.', + 'bullets' => [ + 'Reconstruyó desde cero las bases de cálculo del seguro de desgravamen.', + 'Elaboró el instructivo de garantías hipotecarias (proceso inexistente previamente).', + 'Inició el proyecto de automatización de pagos por depósitos y transferencias.', + ], + ], + [ + 'period' => '2019 – 2021', 'title' => 'Actualización y formación profesional', + 'company' => 'Formación independiente', 'location' => 'Ecuador', + 'lead' => 'Etapa de fortalecimiento técnico tras salida de Mutualista Pichincha.', + 'bullets' => ['SAP FI (30 h).', 'Excel Empresarial (24 h).', 'Prevención de Lavado de Activos — UAFE (5 h).'], + ], + [ + 'period' => 'Ago. 2004 – May. 2019', 'title' => 'Oficial Operativa Regional / Jefa Operativa', + 'company' => 'Mutualista Pichincha', 'location' => 'Loja, Ecuador', + 'lead' => 'Trayectoria ascendente de 15 años desde Cajera hasta Jefa Operativa Regional.', + 'bullets' => [ + 'Reconocida a nivel nacional por excelencia en control operativo.', + 'Agencia por encima del 80 % en gestión de excepciones de crédito hipotecario.', + 'Administró proyecto inmobiliario institucional en Loja.', + 'Cumplimiento ALA/FT al 100 % en comités y auditorías sin observaciones.', + ], + ], + [ + 'period' => 'Ene. 2002 – Nov. 2003', 'title' => 'Cajera', + 'company' => 'Cooperativa de Ahorro y Crédito El Porvenir', 'location' => 'Loja, Ecuador', + 'lead' => 'Inicio de carrera en el frente operativo financiero con disciplina de caja y apoyo contable.', + 'bullets' => [ + 'Gestión de caja sin faltantes ni sobrantes.', + 'Contrato renovado anticipadamente a los tres meses.', + 'Apoyo a Contabilidad y reemplazo temporal de la contadora.', + ], + ], + ], + 'education' => [ + [ + 'year' => '2021', 'title' => 'Máster Universitario en Dirección y Planificación Financiera', + 'institution' => 'Universidad Europea Miguel de Cervantes — Valladolid, España', + 'detail' => 'Reconocido por la SENECYT — Ecuador, febrero de 2023 | Reg. 2021/394270.', + ], + [ + 'year' => '2007', 'title' => 'Ingeniera en Administración en Banca y Finanzas', + 'institution' => 'Universidad Técnica Particular de Loja (UTPL)', 'detail' => '', + ], + ], + 'certifications' => [ + ['year' => '2026', 'title' => 'Mujeres que Lideran: Alta Gerencia', 'issuer' => 'Foro UNIR — Universidad Internacional de La Rioja'], + ['year' => '2025', 'title' => 'Programa Internacional de Habilidades Gerenciales (48 h)', 'issuer' => 'IDEASGROUP — Ecuador / México'], + ['year' => '2025', 'title' => 'Transforma tu Trabajo con Inteligencia Artificial (12 h)', 'issuer' => 'Red de Instituciones Financieras de Desarrollo'], + ['year' => '2025', 'title' => 'Excel: Básico a Dashboard (40 h)', 'issuer' => 'DMARURI Training & Consulting'], + ['year' => '2024', 'title' => 'Administración por Procesos — BPM (64 h)', 'issuer' => 'Escuela Politécnica Nacional — CEC'], + ['year' => '2023', 'title' => 'Formación de Formadores (80 h)', 'issuer' => 'Ministerio del Trabajo del Ecuador | Vigente hasta 2028'], + ['year' => '2023', 'title' => 'Power BI (40 h) | KPI (12 h)', 'issuer' => 'Liderazgo Capacitación & Eventos'], + ['year' => '2020', 'title' => 'Gestión Financiera ERP SAP FI — Key User (30 h)', 'issuer' => 'Socio SAP certificado'], + ['year' => '2020', 'title' => 'Prevención de Lavado de Activos y Financiamiento de Delitos', 'issuer' => 'UAFE — Ecuador'], + ['year' => '2013', 'title' => 'Tributación Integral (36 h)', 'issuer' => 'Universidad Técnica Particular de Loja'], + ], + 'competencies' => [ + 'Finanzas y Operaciones' => [ + ['name' => 'Gestión de operaciones financieras', 'pct' => 95], + ['name' => 'Control interno y cumplimiento', 'pct' => 95], + ['name' => 'Gestión de cartera y microfinanzas', 'pct' => 90], + ['name' => 'Conciliación bancaria / Tesorería', 'pct' => 90], + ['name' => 'ALA/FT y prevención de riesgos', 'pct' => 88], + ], + 'Tecnología y Procesos' => [ + ['name' => 'Transformación digital / BPM', 'pct' => 85], + ['name' => 'SAP FI', 'pct' => 78], + ['name' => 'Excel avanzado y dashboards', 'pct' => 85], + ['name' => 'Power BI', 'pct' => 75], + ['name' => 'IA aplicada al trabajo', 'pct' => 70], + ], + 'Liderazgo' => [ + ['name' => 'Gestión de equipos (hasta 48 p.)', 'pct' => 95], + ['name' => 'Gestión del cambio organizacional', 'pct' => 90], + ['name' => 'Formación de formadores', 'pct' => 88], + ['name' => 'Remuneración variable y carrera', 'pct' => 85], + ], + ], + 'volunteer' => [ + 'title' => 'Voluntaria — Hogar San Camilo de Lellis', + 'year' => '2025', + 'body' => 'Hogar de niñas con discapacidad | Loja, Ecuador. Alineado a la responsabilidad social de la Fundación FACES Microfinanzas.', + ], + 'additional' => [ + 'Idiomas' => 'Español nativo | Inglés básico en formación activa', + 'Disponibilidad' => 'Inmediata | Presencial / Híbrida / Remota', + 'C.I.' => '1103591648', + 'Fecha de nacimiento' => '3 de agosto de 1980', + 'Web profesional' => 'pflres.linkedcorp.net', + ], + ]; +} diff --git a/frontend/persona-cv-theme/inc/visits.php b/frontend/persona-cv-theme/inc/visits.php new file mode 100644 index 0000000..9c0fdb9 --- /dev/null +++ b/frontend/persona-cv-theme/inc/visits.php @@ -0,0 +1,35 @@ + 0) update_post_meta($fp, '_persona_views', (int) get_post_meta($fp, '_persona_views', true) + 1); + return; + } + $id = get_queried_object_id(); + if ($id > 0) update_post_meta($id, '_persona_views', (int) get_post_meta($id, '_persona_views', true) + 1); +} +add_action('template_redirect', 'persona_track_visit'); +function persona_client_ip(): string { + foreach (['HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'] as $k) { + if (!empty($_SERVER[$k])) return trim(explode(',', (string) $_SERVER[$k])[0]); + } + return '0.0.0.0'; +} +add_action('wp_dashboard_setup', function() { + wp_add_dashboard_widget('persona_visits', __('Persona CV: Visitas', 'persona'), function() { + printf('

%s %d

', esc_html__('Total:', 'persona'), (int) get_option('persona_total_visits', 0)); + }); +}); diff --git a/frontend/persona-cv-theme/index.php b/frontend/persona-cv-theme/index.php new file mode 100644 index 0000000..9f37482 --- /dev/null +++ b/frontend/persona-cv-theme/index.php @@ -0,0 +1,12 @@ + +
+
+ +
>

+ +
+
+ diff --git a/frontend/persona-cv-theme/style.css b/frontend/persona-cv-theme/style.css new file mode 100644 index 0000000..f6a9c64 --- /dev/null +++ b/frontend/persona-cv-theme/style.css @@ -0,0 +1,11 @@ +/* +Theme Name: Persona CV +Theme URI: https://pflres.linkedcorp.net +Author: mgonzalez +Description: Tema WordPress de una página, inspirado en Personage/Pixflow. Hero fullscreen, nav sticky, secciones alternas, timeline centrado, barras de skills, contadores animados. Raleway + Open Sans. +Version: 1.0.0 +Requires at least: 6.8 +Tested up to: 6.8 +Requires PHP: 8.1 +Text Domain: persona +*/ diff --git a/img-pflores.jpeg b/img-pflores.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4151a2003d56d9a0e79a667ca40563b8d3ed276e GIT binary patch literal 29272 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

}m|)H;34nU|q@|s4__NYn(gcG+~g* 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 literal 0 HcmV?d00001 diff --git a/tarjeta-patricia-flores-qr.png b/tarjeta-patricia-flores-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..55703ad812dff9f68d5f2e853e2b507c27c2c478 GIT binary patch literal 535 zcmV+y0_gpTP)00006P)t-s|Ns90 z0033O(|!N|010qNS#tmY4#WTe4#WYKD-Ig~00Fm2L_t(|obB2%u7fZP24EuwMvjo9 za5OktkHQf;c6h2^?AS>tm7c0c3d8RykdIDQoVX$SC}uA4@RwtJScrPQ(^Snrp`lyo zr;|SF5E1{V))2iofQD|R2c1w|M;AXM(VfoUprOB^gNy_PStAJ=`r=x4lUm+Gsq@g# z&9#MRtUd%mw#GVuhHj&|M77skby0C?z?$t=%aPc*qEO-NL?b$ z&oP#F-3dtQLPNLF@-oDiIXEY3uY=hSKG4t?&@l$CqSSe|2IoSS->J?+Lm#Z?bV9!g z8X~F_wcplxXy_)I$Plx4DlJl-*Lal54-I{;&iQShSzoh?mz^mzbSqslHrIL92_5X} zJT&y-I%h0znnM$_UmJpkzLMtLTi?e+n@hA`W1*q{ueT9=ew8OH`0}s#+m<{u^bvaA zB&KM3x!1dN)p-XR`fRUM;qk%414pXz2D@!|qht z^4a-EZ*KuZL!YWMV!y{hI$VATKs002ovPDHLkV1nW!_Bj9m literal 0 HcmV?d00001 diff --git a/tarjeta-presentacion-patricia-flores.html b/tarjeta-presentacion-patricia-flores.html new file mode 100644 index 0000000..6861e2d --- /dev/null +++ b/tarjeta-presentacion-patricia-flores.html @@ -0,0 +1,253 @@ + + + + + + Tarjeta de Presentación | Patricia Flores + + + +

+
+
+ Patricia Soledad Flores Sánchez +
+

Tarjeta de presentación

+

Patricia Soledad Flores Sánchez

+

Gerente / Jefa de Operaciones Financieras | Sector financiero y microfinanzas

+
+
+ +
+
+ 22+ + Años de trayectoria en banca y microfinanzas. +
+
+ 26 + Agencias bajo liderazgo operativo a nivel nacional. +
+
+ 48 + Personas coordinadas en la estructura operativa. +
+
+ + +
+ + +
+ +