feat: sitio CV completo v1.0.0

- 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
This commit is contained in:
2026-06-05 11:21:30 -05:00
parent cc6545604c
commit 5846c515f3
77 changed files with 9567 additions and 220 deletions
+645 -115
View File
@@ -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;
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

@@ -0,0 +1,10 @@
<svg width="640" height="760" viewBox="0 0 640 760" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="640" height="760" rx="48" fill="#F7EFE4"/>
<circle cx="320" cy="238" r="112" fill="#E6B596"/>
<path d="M182 612C182 515.35 260.35 437 357 437H283C379.65 437 458 515.35 458 612V640H182V612Z" fill="#D4582B"/>
<path d="M221 230C221 175.324 265.324 131 320 131C374.676 131 419 175.324 419 230V284C419 338.676 374.676 383 320 383C265.324 383 221 338.676 221 284V230Z" fill="#1F1D1A"/>
<path d="M244 245C244 202.474 278.474 168 321 168C363.526 168 398 202.474 398 245V283C398 325.526 363.526 360 321 360C278.474 360 244 325.526 244 283V245Z" fill="#F5CBB2"/>
<rect x="116" y="488" width="408" height="28" rx="14" fill="#F2DDCC"/>
<rect x="116" y="536" width="332" height="24" rx="12" fill="#F2DDCC"/>
<rect x="116" y="578" width="280" height="24" rx="12" fill="#F2DDCC"/>
</svg>

After

Width:  |  Height:  |  Size: 902 B

@@ -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();
});
});
});
+254 -42
View File
@@ -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';
?>
<section class="hero">
<section class="hero hero--executive">
<div class="hero__copy">
<p class="eyebrow"><?php esc_html_e('Hoja de vida digital', 'cvolio'); ?></p>
<h1><?php echo esc_html($hero_name); ?></h1>
<p class="hero__role"><?php echo esc_html($hero_role); ?></p>
<p class="hero__intro"><?php echo esc_html($hero_intro); ?></p>
<p class="eyebrow"><?php echo esc_html($hero['eyebrow']); ?></p>
<h1><?php echo esc_html($heroName); ?></h1>
<p class="hero__role"><?php echo esc_html($heroRole); ?></p>
<p class="hero__intro"><?php echo esc_html($heroIntro); ?></p>
<div class="hero__metrics hero__metrics--wide">
<?php foreach ($metrics as $metric) : ?>
<article class="metric-card">
<strong><?php echo esc_html($metric['value']); ?></strong>
<span><?php echo esc_html($metric['label']); ?></span>
</article>
<?php endforeach; ?>
</div>
<div class="hero__actions">
<a class="btn btn--primary" href="<?php echo esc_url($hero_cta_url); ?>">
<?php echo esc_html($hero_cta_label); ?>
<a class="btn btn--primary" href="<?php echo esc_url($heroCtaUrl); ?>">
<?php echo esc_html($heroCtaLabel); ?>
</a>
<?php echo wp_kses_post(cvolio_render_contact_link('email', $hero_email)); ?>
<a class="btn btn--secondary" href="<?php echo esc_url(home_url('/?cv_pdf=1')); ?>">
<?php esc_html_e('Descargar CV PDF', 'cvolio'); ?>
</a>
<button class="btn btn--ghost" type="button" data-cvolio-print>
<?php esc_html_e('Versión imprimible', 'cvolio'); ?>
</button>
</div>
</div>
<aside class="hero__panel">
<div class="profile-card">
<p class="profile-card__label"><?php esc_html_e('Disponible para', 'cvolio'); ?></p>
<h2><?php esc_html_e('Proyectos, consultoria y liderazgo de equipos', 'cvolio'); ?></h2>
<div class="chip-grid">
<?php echo wp_kses_post(cvolio_render_contact_link('phone', $hero_phone)); ?>
<span class="cv-chip"><?php echo esc_html($hero_location); ?></span>
<?php if ($linkedin) : ?><a class="cv-chip" href="<?php echo esc_url($linkedin); ?>" target="_blank" rel="noreferrer">LinkedIn</a><?php endif; ?>
<?php if ($github) : ?><a class="cv-chip" href="<?php echo esc_url($github); ?>" target="_blank" rel="noreferrer">GitHub</a><?php endif; ?>
<?php if ($portfolio) : ?><a class="cv-chip" href="<?php echo esc_url($portfolio); ?>" target="_blank" rel="noreferrer">Portfolio</a><?php endif; ?>
<div class="profile-card profile-card--executive">
<div class="profile-card__media profile-card__media--portrait">
<img src="<?php echo esc_url($profileImage); ?>" alt="<?php echo esc_attr($heroName); ?>">
</div>
<div class="profile-card__contact">
<?php echo wp_kses_post(cvolio_render_contact_link('email', $heroEmail)); ?>
<?php echo wp_kses_post(cvolio_render_contact_link('phone', $heroPhone)); ?>
<span class="cv-chip"><?php echo esc_html($heroLocation); ?></span>
<?php if ($linkedin) : ?>
<a class="cv-chip" href="<?php echo esc_url($linkedin); ?>" target="_blank" rel="noreferrer">LinkedIn</a>
<?php endif; ?>
</div>
<div class="profile-card__highlights">
<div>
<span><?php esc_html_e('Enfoque', 'cvolio'); ?></span>
<strong><?php echo esc_html($hero['focus']); ?></strong>
</div>
<div>
<span><?php esc_html_e('Disponibilidad', 'cvolio'); ?></span>
<strong><?php echo esc_html($hero['availability']); ?></strong>
</div>
</div>
</div>
</aside>
</section>
<section id="perfil" class="content-wrap content-wrap--front">
<div class="content-card">
<section class="content-wrap content-wrap--front">
<div class="content-card content-card--resume">
<section id="resumen" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Perfil profesional', 'cvolio'); ?></p>
<h2><?php echo esc_html($summary['title']); ?></h2>
</div>
<p class="lead-copy"><?php echo esc_html($summary['body']); ?></p>
</section>
<section id="impacto" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Impacto ejecutivo', 'cvolio'); ?></p>
<h2><?php esc_html_e('Resultados concretos con alcance nacional', 'cvolio'); ?></h2>
</div>
<div class="achievement-grid achievement-grid--executive">
<?php foreach ($highlights as $highlight) : ?>
<article class="achievement-card achievement-card--stat">
<strong><?php echo esc_html($highlight['value']); ?></strong>
<span><?php echo esc_html($highlight['label']); ?></span>
</article>
<?php endforeach; ?>
</div>
<div class="impact-grid">
<?php foreach ($impact as $item) : ?>
<article class="impact-card">
<h3><?php echo esc_html($item['title']); ?></h3>
<p><?php echo esc_html($item['body']); ?></p>
</article>
<?php endforeach; ?>
</div>
</section>
<section id="experiencia" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Experiencia profesional', 'cvolio'); ?></p>
<h2><?php esc_html_e('Trayectoria sólida en banca, operaciones y microfinanzas', 'cvolio'); ?></h2>
</div>
<div class="timeline timeline--executive">
<?php foreach ($experience as $item) : ?>
<article class="timeline__item timeline__item--rich">
<span class="timeline__year"><?php echo esc_html($item['period']); ?></span>
<div class="timeline__content">
<h3><?php echo esc_html($item['title']); ?></h3>
<p class="timeline__meta"><?php echo esc_html($item['company'] . ' | ' . $item['location']); ?></p>
<p><?php echo esc_html($item['lead']); ?></p>
<ul class="timeline__bullets">
<?php foreach ($item['bullets'] as $bullet) : ?>
<li><?php echo esc_html($bullet); ?></li>
<?php endforeach; ?>
</ul>
</div>
</article>
<?php endforeach; ?>
</div>
</section>
<section id="formacion" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Formación académica', 'cvolio'); ?></p>
<h2><?php esc_html_e('Base técnica y formación ejecutiva de alto nivel', 'cvolio'); ?></h2>
</div>
<div class="credentials-grid">
<?php foreach ($education as $item) : ?>
<article class="credential-card">
<span class="credential-card__year"><?php echo esc_html($item['year']); ?></span>
<h3><?php echo esc_html($item['title']); ?></h3>
<p><?php echo esc_html($item['institution']); ?></p>
<?php if ($item['detail'] !== '') : ?>
<p class="credential-card__detail"><?php echo esc_html($item['detail']); ?></p>
<?php endif; ?>
</article>
<?php endforeach; ?>
</div>
</section>
<section id="certificaciones" class="resume-section">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Certificaciones relevantes', 'cvolio'); ?></p>
<h2><?php esc_html_e('Actualización continua en gerencia, procesos y analítica', 'cvolio'); ?></h2>
</div>
<div class="cert-list">
<?php foreach ($certifications as $item) : ?>
<article class="cert-item">
<span class="cert-item__year"><?php echo esc_html($item['year']); ?></span>
<div>
<h3><?php echo esc_html($item['title']); ?></h3>
<p><?php echo esc_html($item['issuer']); ?></p>
</div>
</article>
<?php endforeach; ?>
</div>
</section>
<?php while (have_posts()) : the_post(); ?>
<article <?php post_class('front-article'); ?>>
<div class="entry-content">
<?php the_content(); ?>
</div>
</article>
<?php if (trim((string) get_the_content()) !== '') : ?>
<section class="resume-section resume-section--custom">
<div class="section-head">
<p class="eyebrow"><?php esc_html_e('Contenido adicional', 'cvolio'); ?></p>
<h2><?php esc_html_e('Bloques editables desde WordPress', 'cvolio'); ?></h2>
</div>
<div class="entry-content">
<?php the_content(); ?>
</div>
</section>
<?php endif; ?>
<?php endwhile; ?>
</div>
<aside class="side-stack">
<aside class="side-stack side-stack--resume">
<section class="side-card side-card--competencies">
<p class="eyebrow"><?php esc_html_e('Competencias clave', 'cvolio'); ?></p>
<h2><?php esc_html_e('Capacidades ejecutivas y técnicas', 'cvolio'); ?></h2>
<?php foreach ($competencies as $group => $items) : ?>
<div class="competency-block">
<h3><?php echo esc_html($group); ?></h3>
<div class="skill-cloud">
<?php foreach ($items as $item) : ?>
<span class="skill-pill"><?php echo esc_html(is_array($item) ? ($item['name'] ?? '') : $item); ?></span>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</section>
<section class="side-card">
<p class="eyebrow"><?php esc_html_e('Fortalezas', 'cvolio'); ?></p>
<h2><?php esc_html_e('Habilidades clave', 'cvolio'); ?></h2>
<p class="eyebrow"><?php esc_html_e('Liderazgo', 'cvolio'); ?></p>
<h2><?php esc_html_e('Atributos diferenciales', 'cvolio'); ?></h2>
<div class="skill-cloud">
<?php foreach ($skills as $skill) : ?>
<span class="skill-pill"><?php echo esc_html($skill); ?></span>
@@ -70,9 +241,50 @@ $portfolio = get_theme_mod('cvolio_social_portfolio', '');
</section>
<section class="side-card">
<p class="eyebrow"><?php esc_html_e('Consejo de uso', 'cvolio'); ?></p>
<h2><?php esc_html_e('Edita esta portada con bloques', 'cvolio'); ?></h2>
<p><?php esc_html_e('Puedes crear secciones de experiencia, estudios, casos de exito, certificados o servicios usando Gutenberg y los patrones del tema.', 'cvolio'); ?></p>
<p class="eyebrow"><?php esc_html_e('Voluntariado', 'cvolio'); ?></p>
<h2><?php echo esc_html($volunteer['title']); ?></h2>
<p class="side-card__meta"><?php echo esc_html($volunteer['year']); ?></p>
<p><?php echo esc_html($volunteer['body']); ?></p>
</section>
<section id="contacto" class="side-card side-card--contact">
<p class="eyebrow"><?php esc_html_e('Información adicional', 'cvolio'); ?></p>
<h2><?php esc_html_e('Datos clave del perfil', 'cvolio'); ?></h2>
<dl class="info-list">
<?php foreach ($additional as $label => $value) : ?>
<div>
<dt><?php echo esc_html($label); ?></dt>
<dd><?php echo esc_html($value); ?></dd>
</div>
<?php endforeach; ?>
</dl>
<div class="contact-stack">
<?php echo wp_kses_post(cvolio_render_contact_link('email', $heroEmail)); ?>
<?php echo wp_kses_post(cvolio_render_contact_link('phone', $heroPhone)); ?>
</div>
</section>
<section class="side-card side-card--business-card">
<p class="eyebrow"><?php esc_html_e('Tarjeta de presentación', 'cvolio'); ?></p>
<h2><?php esc_html_e('Acceso rápido al perfil web', 'cvolio'); ?></h2>
<article class="business-card">
<div class="business-card__top">
<p class="business-card__name"><?php echo esc_html($heroName); ?></p>
<p class="business-card__role"><?php echo esc_html($heroRole); ?></p>
</div>
<div class="business-card__body">
<div class="business-card__qr">
<img src="<?php echo esc_url($qrImage); ?>" alt="<?php esc_attr_e('Código QR hacia el perfil web', 'cvolio'); ?>">
</div>
<div class="business-card__info">
<p><?php echo esc_html($heroLocation); ?></p>
<p><?php echo esc_html($heroPhone); ?></p>
<p><?php echo esc_html($heroEmail); ?></p>
<a href="<?php echo esc_url($publicUrl); ?>" target="_blank" rel="noreferrer"><?php echo esc_html($publicUrl); ?></a>
</div>
</div>
</article>
</section>
</aside>
</section>
+57 -1
View File
@@ -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 = '<ul class="site-nav__menu">';
foreach ($items as $href => $label) {
$html .= sprintf(
'<li><a href="%s">%s</a></li>',
esc_url($href),
esc_html($label)
);
}
$html .= '</ul>';
return $html;
}
function cvolio_render_contact_link(string $type, string $value): string
{
if ($value === '') {
+2 -8
View File
@@ -23,15 +23,9 @@ $brand = get_theme_mod('cvolio_hero_name', get_bloginfo('name'));
<span>Menu</span>
</button>
<nav id="site-nav" class="site-nav" aria-label="<?php esc_attr_e('Menu principal', 'cvolio'); ?>">
<?php
wp_nav_menu([
'theme_location' => 'primary',
'container' => false,
'fallback_cb' => false,
'menu_class' => 'site-nav__menu',
]);
?>
<?php echo cvolio_render_primary_menu(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</nav>
<a class="site-print" href="<?php echo esc_url(home_url('/?cv_pdf=1')); ?>" target="_blank"><?php esc_html_e('Descargar CV PDF', 'cvolio'); ?></a>
</div>
</header>
<main class="site-main">
+21 -10
View File
@@ -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'],
+189
View File
@@ -0,0 +1,189 @@
<?php
declare(strict_types=1);
function cvolio_cv_data(): array
{
return [
'hero' => [
'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',
],
];
}
+118
View File
@@ -0,0 +1,118 @@
<?php
declare(strict_types=1);
function cvolio_should_track_visit(): bool
{
if (is_admin() || wp_doing_ajax() || wp_doing_cron()) {
return false;
}
if (! isset($_SERVER['REQUEST_METHOD']) || $_SERVER['REQUEST_METHOD'] !== 'GET') {
return false;
}
if (is_user_logged_in() && current_user_can('manage_options')) {
return false;
}
return is_front_page() || is_home() || is_singular();
}
function cvolio_track_visit(): void
{
if (! cvolio_should_track_visit()) {
return;
}
$requestUri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash($_SERVER['REQUEST_URI'])) : '';
$visitorHash = md5($requestUri . '|' . cvolio_get_client_ip() . '|' . gmdate('Y-m-d-H'));
$transientKey = 'cvolio_visit_' . $visitorHash;
if (get_transient($transientKey)) {
return;
}
set_transient($transientKey, '1', HOUR_IN_SECONDS);
$total = (int) get_option('cvolio_total_visits', 0);
update_option('cvolio_total_visits', $total + 1, false);
if (is_front_page()) {
$frontPage = (int) get_option('page_on_front');
if ($frontPage > 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 class="cvolio-visits-widget">
<p><strong><?php esc_html_e('Visitas totales registradas:', 'cvolio'); ?></strong> <?php echo esc_html((string) $total); ?></p>
<p><strong><?php esc_html_e('Visitas a la portada:', 'cvolio'); ?></strong> <?php echo esc_html((string) $frontViews); ?></p>
<p><?php esc_html_e('El contador evita duplicados del mismo visitante en la misma URL durante una hora.', 'cvolio'); ?></p>
</div>
<?php
}
function cvolio_add_views_column(array $columns): array
{
$columns['cvolio_views'] = __('Visitas', 'cvolio');
return $columns;
}
add_filter('manage_pages_columns', 'cvolio_add_views_column');
add_filter('manage_posts_columns', 'cvolio_add_views_column');
function cvolio_render_views_column(string $column, int $postId): void
{
if ($column !== 'cvolio_views') {
return;
}
echo esc_html((string) ((int) get_post_meta($postId, '_cvolio_views', true)));
}
add_action('manage_pages_custom_column', 'cvolio_render_views_column', 10, 2);
add_action('manage_posts_custom_column', 'cvolio_render_views_column', 10, 2);