{"id":1553,"date":"2026-08-21T17:21:10","date_gmt":"2026-08-21T17:21:10","guid":{"rendered":"https:\/\/villasrivero.com\/?page_id=1553"},"modified":"2026-08-21T18:19:33","modified_gmt":"2026-08-21T18:19:33","slug":"crm-moises","status":"publish","type":"page","link":"http:\/\/villasrivero.com\/en\/crm-moises\/","title":{"rendered":"CRM Mois\u00e9s"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1553\" class=\"elementor elementor-1553\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e8b48b4 e-flex e-con-boxed e-con e-parent\" data-id=\"e8b48b4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c9ff279 elementor-widget elementor-widget-html\" data-id=\"c9ff279\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!doctype html><html lang=\"es\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>REALIUXE SALES OS<\/title><meta name=\"description\" content=\"REALIUXE SALES OS\"><style>\n:root{--bg:#f4f2ed;--panel:#fff;--ink:#171815;--muted:#777971;--line:#dfddd5;--accent:#262822;--accent-soft:#eeece5;--gold:#af8e61;--good:#2e7659;--warn:#ae7428;--bad:#a24f45;--shadow:0 18px 50px rgba(26,29,23,.08);--r:20px}\n*{box-sizing:border-box}body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;background:var(--bg);color:var(--ink)}button,input,select,textarea{font:inherit}button{cursor:pointer}.app{display:grid;grid-template-columns:268px 1fr;min-height:100vh}.sidebar{height:100vh;position:sticky;top:0;background:#11130f;color:#fff;padding:26px 18px;display:flex;flex-direction:column;gap:22px}.brand{padding:0 8px}.brand .mini{font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:#9fa396}.brand h1{font-size:20px;line-height:1.15;letter-spacing:.07em;margin:7px 0 3px}.brand small{color:#9ea198}.nav{display:grid;gap:7px}.nav button{border:0;background:transparent;color:#b7bbb0;padding:11px 12px;border-radius:13px;text-align:left;display:flex;align-items:center;gap:10px}.nav button:hover,.nav button.active{background:#282b24;color:#fff}.ico{width:8px;height:8px;border-radius:50%;background:currentColor}.sidecard{margin-top:auto;border:1px solid #30352a;background:#1d211a;border-radius:17px;padding:15px}.sidecard b{font-size:12px}.sidecard p{font-size:11px;color:#a9aea1;line-height:1.5;margin:7px 0 0}.main{min-width:0}.topbar{height:78px;position:sticky;top:0;z-index:15;background:rgba(244,242,237,.92);backdrop-filter:blur(12px);border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 32px}.product{display:flex;align-items:center;gap:18px}.product strong{font-size:14px;letter-spacing:.11em}.division-select{border:1px solid var(--line);background:#fff;border-radius:999px;padding:9px 13px;font-weight:750}.role-switch{display:flex;background:#e8e6df;border-radius:999px;padding:4px}.role-switch button{border:0;background:transparent;border-radius:999px;padding:8px 12px;font-size:12px;color:#74766e}.role-switch button.active{background:#fff;color:#171815;box-shadow:0 2px 10px rgba(0,0,0,.08)}.content{padding:30px 32px 50px;max-width:1580px;margin:auto}.view{display:none}.view.active{display:block}.hero{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:22px}.eyebrow{font-size:10px;font-weight:850;letter-spacing:.17em;text-transform:uppercase;color:var(--accent)}.hero h2{font-size:34px;letter-spacing:-.035em;margin:7px 0 5px}.hero p{margin:0;color:var(--muted);font-size:14px}.quote{max-width:440px;border:1px solid var(--line);background:#fff;border-radius:18px;padding:15px 18px;box-shadow:var(--shadow)}.quote p{font-size:13px;line-height:1.5;margin:0}.quote span{font-size:10px;color:var(--muted);font-weight:800;display:block;margin-top:7px}.grid4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:13px}.metric{background:#fff;border:1px solid var(--line);border-radius:18px;padding:18px}.metric .label{font-size:10px;color:var(--muted);font-weight:800;letter-spacing:.09em;text-transform:uppercase}.metric strong{font-size:27px;letter-spacing:-.03em;display:block;margin-top:11px}.metric small{font-size:10px;color:var(--muted)}.section{background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);overflow:hidden;margin-top:17px}.section-head{padding:18px 20px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:12px;align-items:center}.section-head h3{font-size:15px;margin:0}.section-head p{font-size:11px;margin:4px 0 0;color:var(--muted)}.split{display:grid;grid-template-columns:1.1fr .9fr;gap:17px}.priority{display:grid;grid-template-columns:40px 1fr auto;gap:12px;align-items:center;padding:14px 20px;border-bottom:1px solid #efede7}.priority:last-child{border-bottom:0}.score{width:38px;height:38px;border-radius:12px;background:var(--accent-soft);display:grid;place-items:center;font-size:12px;font-weight:900}.priority b{font-size:12px}.priority p{font-size:11px;color:var(--muted);margin:4px 0 0;line-height:1.4}.tag{font-size:9px;font-weight:850;padding:6px 8px;border-radius:999px;background:#efede7;color:#686b63}.tag.hot{background:#f9e8e3;color:#9b473b}.tag.good{background:#e5f1e9;color:#2e6f55}.tag.gold{background:#f1ebe1;color:#7a623f}.division-list{padding:10px 18px}.division-row{display:grid;grid-template-columns:160px 1fr 130px;gap:12px;align-items:center;padding:12px 3px;border-bottom:1px solid #efede7}.division-row:last-child{border-bottom:0}.division-row b{font-size:12px}.track{height:8px;background:#eceae4;border-radius:999px;overflow:hidden}.fill{height:100%;background:var(--accent);border-radius:999px}.division-row span{text-align:right;font-size:11px;color:var(--muted)}.mission{background:linear-gradient(140deg,#1a2e26,#315b49);color:#fff;border-radius:22px;padding:22px;box-shadow:0 20px 55px rgba(30,70,55,.17)}.mission-top{display:flex;justify-content:space-between;gap:15px}.mission h3{margin:0;font-size:17px}.mission p{color:#c9d9d0;font-size:11px;margin:5px 0 0}.ring{width:72px;height:72px;border-radius:50%;display:grid;place-items:center;background:conic-gradient(#d7b77e var(--pct),rgba(255,255,255,.12) 0);position:relative}.ring:after{content:\"\";position:absolute;inset:7px;border-radius:50%;background:#294d3e}.ring strong{z-index:2;font-size:14px}.mission-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:18px}.mission-stat{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:12px}.mission-stat b{font-size:19px;display:block}.mission-stat span{font-size:9px;color:#c9d9d0;text-transform:uppercase;letter-spacing:.08em}.progress{height:9px;background:rgba(255,255,255,.12);border-radius:999px;overflow:hidden;margin-top:16px}.progress div{height:100%;background:#d7b77e}.btn{border:0;border-radius:12px;padding:10px 13px;font-weight:800;font-size:11px}.btn.primary{background:var(--accent);color:#fff}.btn.soft{background:var(--accent-soft);color:var(--ink)}.btn.gold{background:#d7b77e;color:#24392f}.controls{display:flex;gap:8px;flex-wrap:wrap}.controls input,.controls select{border:1px solid var(--line);background:#fff;border-radius:11px;padding:9px 11px;color:#4e5149}.pipeline{display:flex;gap:13px;padding:16px;overflow:auto}.column{min-width:280px;max-width:280px;background:#f5f4ef;border:1px solid #e5e3dc;border-radius:17px;padding:11px}.colhead{display:flex;justify-content:space-between;align-items:center;padding:3px 3px 10px}.colhead b{font-size:11px}.count{font-size:9px;border:1px solid var(--line);background:#fff;border-radius:999px;padding:4px 7px}.deal{background:#fff;border:1px solid #e2e0d8;border-radius:14px;padding:13px;margin-bottom:9px;transition:.18s}.deal:hover{transform:translateY(-1px);box-shadow:0 9px 25px rgba(20,24,18,.08)}.deal h4{font-size:11px;margin:0 0 8px;line-height:1.35}.deal-meta{display:flex;justify-content:space-between;font-size:9px;color:var(--muted)}.deal-money{font-weight:900;font-size:13px;margin-top:9px}.deal-foot{display:flex;justify-content:space-between;align-items:center;margin-top:9px}.avatar{width:26px;height:26px;border-radius:50%;background:#20241e;color:#fff;display:grid;place-items:center;font-size:9px;font-weight:900}.table-wrap{overflow:auto}table{border-collapse:collapse;width:100%;min-width:980px}th,td{padding:12px 16px;border-bottom:1px solid #efede7;font-size:11px;text-align:left}th{font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);background:#faf9f6}tbody tr{cursor:pointer}tbody tr:hover td{background:#fbfaf7}.status{font-weight:850}.status.Pendiente{color:#a56e24}.status.Ganado{color:#2e7659}.status.Perdido{color:#a24f45}.cards3{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.day-card{background:#fff;border:1px solid var(--line);border-radius:18px;padding:18px}.day-card .num{font-size:29px;font-weight:900}.day-card span{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.focus-list{padding:6px 18px 18px}.focus-item{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;padding:13px 2px;border-bottom:1px solid #efede7}.focus-item:last-child{border-bottom:0}.focus-item b{font-size:12px}.focus-item p{margin:4px 0 0;color:var(--muted);font-size:10px}.ai-card{border:1px solid var(--line);background:#faf9f6;border-radius:15px;padding:15px;margin:12px 18px}.lead-tabs{display:flex;gap:7px;flex-wrap:wrap;margin:14px 0 18px;padding:6px;background:#f1efe9;border:1px solid var(--line);border-radius:14px}.lead-tab{border:0;background:transparent;color:#6b6e65;border-radius:10px;padding:9px 12px;font-size:10px;font-weight:850}.lead-tab.active{background:#fff;color:var(--ink);box-shadow:0 2px 10px rgba(0,0,0,.07)}.lead-pane{display:none}.lead-pane.active{display:block}.coach-cta{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;background:linear-gradient(135deg,#eef5f1,#f7f4ec);border:1px solid #d9e6df;border-radius:16px;padding:14px 15px;margin-bottom:13px}.coach-cta b{font-size:12px}.coach-cta p{margin:4px 0 0;color:var(--muted);font-size:10px;line-height:1.45}.coach-cta .spark{font-size:20px}.project-playbook{border:1px solid var(--line);background:#faf9f6;border-radius:15px;padding:13px 14px;margin-bottom:13px}.project-playbook b{font-size:11px}.playbook-chips{display:flex;gap:6px;flex-wrap:wrap;margin-top:9px}.playbook-chips span{font-size:9px;border-radius:999px;padding:6px 8px;background:#eef3ef;color:#365746;font-weight:800}.docs-placeholder{border:1px dashed #cbc8be;border-radius:16px;padding:26px;text-align:center;background:#faf9f6}.docs-placeholder b{display:block;font-size:12px}.docs-placeholder p{font-size:10px;color:var(--muted);line-height:1.5;max-width:470px;margin:7px auto 0}.activity-history{margin-top:0;border-top:0;padding-top:0}.activity-history h4{font-size:12px;margin:0 0 10px}.history-item{display:grid;grid-template-columns:100px 1fr auto;gap:10px;align-items:start;padding:10px 0;border-bottom:1px solid #efede7}.history-item:last-child{border-bottom:0}.history-type{font-size:9px;font-weight:900;border-radius:999px;padding:5px 7px;background:var(--accent-soft);text-align:center}.history-item p{font-size:10px;color:var(--muted);margin:0;line-height:1.45}.history-item time{font-size:9px;color:var(--muted);white-space:nowrap}.call-legend{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}.legend-pill{font-size:10px;border:1px solid var(--line);background:#fff;border-radius:999px;padding:7px 10px}.legend-pill b{color:var(--accent)}.ai-card b{font-size:12px}.ai-card p{font-size:11px;line-height:1.5;color:#64675f;margin:7px 0 0}.empty{padding:34px;text-align:center;color:var(--muted);font-size:12px}.notice{background:#fff8e9;border:1px solid #ead9b8;color:#72582a;border-radius:13px;padding:11px 13px;font-size:11px;margin-bottom:16px}.hidden{display:none!important}.modal-back{position:fixed;inset:0;background:rgba(15,17,14,.54);display:grid;place-items:center;padding:20px;z-index:40}.modal{width:min(720px,100%);max-height:90vh;overflow:auto;background:#fff;border-radius:22px;box-shadow:0 30px 90px rgba(0,0,0,.24)}.modal-head{padding:20px 22px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:12px}.modal-head h3{margin:0;font-size:18px}.close{border:0;background:#efede7;border-radius:50%;width:34px;height:34px}.modal-body{padding:20px 22px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.field label{display:block;font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:850;margin-bottom:6px}.field input,.field select,.field textarea{width:100%;border:1px solid var(--line);border-radius:11px;padding:10px;background:#fff}.field textarea{min-height:105px;resize:vertical}.span2{grid-column:1\/-1}.modal-actions{display:flex;justify-content:flex-end;gap:9px;margin-top:17px}.toast{position:fixed;right:24px;bottom:24px;background:#1c211b;color:#fff;padding:12px 15px;border-radius:12px;font-size:11px;box-shadow:0 15px 45px rgba(0,0,0,.22);z-index:60}.villas{--bg:#f2f4ef;--line:#dce4dc;--accent:#315c49;--accent-soft:#e7efe9}.villas .sidebar{background:#1f392e}.villas .nav button:hover,.villas .nav button.active{background:#315c49}.villas .sidecard{background:#294638;border-color:#365848}.villas .product strong{color:#315c49}@media(max-width:1100px){.grid4{grid-template-columns:repeat(2,1fr)}.split{grid-template-columns:1fr}.cards3{grid-template-columns:1fr 1fr}.mission-stats{grid-template-columns:1fr 1fr}.hero{align-items:flex-start;flex-direction:column}.quote{max-width:none;width:100%}}@media(max-width:760px){.app{grid-template-columns:1fr}.sidebar{height:auto;position:static;padding:16px}.nav{grid-template-columns:repeat(4,1fr)}.nav button{justify-content:center;font-size:0}.nav .ico{display:block}.sidecard{display:none}.topbar{padding:0 14px}.product strong{font-size:10px}.content{padding:20px 14px}.grid4,.cards3{grid-template-columns:1fr 1fr}.hero h2{font-size:28px}.division-row{grid-template-columns:120px 1fr 100px}.form-grid{grid-template-columns:1fr}.span2{grid-column:auto}}\n\n.weekly-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:17px}.goal-card{background:linear-gradient(145deg,#171d18,#284d3d);color:#fff;border-radius:22px;padding:22px;box-shadow:0 20px 55px rgba(30,70,55,.15)}.goal-card .eyebrow{color:#d4dfd8}.goal-card h3{font-size:20px;margin:7px 0 5px}.goal-card p{color:#c8d7cf;font-size:11px;line-height:1.5}.goal-form{display:grid;grid-template-columns:1fr 130px auto;gap:9px;align-items:end;margin-top:18px}.goal-form label{display:block;font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:#bdcec5;font-weight:850;margin-bottom:6px}.goal-form select,.goal-form input{width:100%;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.10);color:#fff;border-radius:11px;padding:10px 11px}.goal-form select option{color:#111}.goal-form input{font-weight:900;font-size:18px}.goal-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;margin-top:17px}.goal-mini{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:12px}.goal-mini b{display:block;font-size:20px}.goal-mini span{font-size:8px;text-transform:uppercase;letter-spacing:.08em;color:#c6d6ce}.learning{background:#fff8e9;border:1px solid #ead9b8;border-radius:14px;padding:13px 14px;color:#70572d;font-size:11px;line-height:1.5}.confidence{display:inline-flex;align-items:center;gap:6px;font-size:9px;font-weight:900;border-radius:999px;padding:6px 9px;background:#f1ebe1;color:#765f3f}.confidence.high{background:#e5f1e9;color:#2e6f55}.confidence.mid{background:#edf0e7;color:#55654e}.kpi-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;padding:16px}.kpi-mini{border:1px solid var(--line);background:#faf9f6;border-radius:15px;padding:13px}.kpi-mini b{font-size:20px;display:block}.kpi-mini span{font-size:8px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}.funnel{padding:18px;display:grid;grid-template-columns:repeat(5,1fr);gap:9px}.funnel-step{position:relative;border:1px solid var(--line);background:#faf9f6;border-radius:15px;padding:13px;min-height:90px}.funnel-step:not(:last-child):after{content:'\u2192';position:absolute;right:-9px;top:34px;color:#aaa;background:#fff;border-radius:50%;width:18px;height:18px;display:grid;place-items:center;z-index:2}.funnel-step b{font-size:20px;display:block}.funnel-step span{font-size:9px;color:var(--muted);text-transform:uppercase;letter-spacing:.07em}.funnel-step small{display:block;margin-top:7px;color:var(--muted);font-size:9px;line-height:1.35}.coach{margin:14px 18px 18px;border-radius:17px;padding:17px;background:#18231d;color:#fff}.coach .eyebrow{color:#b8c8bf}.coach b{display:block;font-size:14px;margin:6px 0}.coach p{margin:0;color:#cbd7d0;font-size:11px;line-height:1.55}.pace-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;padding:16px}.pace-item{border:1px solid var(--line);border-radius:14px;padding:12px;background:#fff}.pace-item .pace-top{display:flex;justify-content:space-between;gap:8px;align-items:center}.pace-item b{font-size:15px}.pace-item span{font-size:9px;color:var(--muted)}.pacebar{height:7px;background:#eceae4;border-radius:999px;overflow:hidden;margin-top:10px}.pacebar i{height:100%;display:block;background:#345c49;border-radius:999px}.weekly-prompt{display:flex;justify-content:space-between;gap:12px;align-items:center;background:#f4eee3;border:1px solid #dfcfb3;border-radius:15px;padding:13px 15px;margin-bottom:16px}.weekly-prompt b{font-size:11px}.weekly-prompt span{font-size:10px;color:#75664d}.modal-actions .btn.win{background:#2e7659;color:#fff}.modal-actions .btn.video{background:#e7eee9;color:#315543}.modal-actions .btn.proposal{background:#f1ebe1;color:#755f3f}\n@media(max-width:1100px){.weekly-grid{grid-template-columns:1fr}.kpi-grid{grid-template-columns:repeat(3,1fr)}.funnel{grid-template-columns:1fr}.funnel-step:not(:last-child):after{display:none}.pace-grid{grid-template-columns:repeat(2,1fr)}.goal-form{grid-template-columns:1fr 110px}.goal-form .btn{grid-column:1\/-1}.goal-summary{grid-template-columns:1fr 1fr 1fr}}\n@media(max-width:650px){.kpi-grid,.pace-grid{grid-template-columns:1fr 1fr}.goal-form{grid-template-columns:1fr}.goal-summary{grid-template-columns:1fr}.weekly-prompt{display:block}.weekly-prompt .btn{margin-top:10px}}\n\n.quick-actions{display:flex;gap:8px;align-items:center}.quick-actions .btn{white-space:nowrap}.btn.outline{background:#fff;color:var(--ink);border:1px solid var(--line)}.btn.import{background:#f1ebe1;color:#725b39}.topbar .quick-actions{margin-left:auto;margin-right:12px}.lead-contact{display:flex;gap:7px;flex-wrap:wrap;margin-top:9px}.contact-chip{font-size:10px;border:1px solid var(--line);background:#fff;border-radius:999px;padding:6px 9px;color:#555;text-decoration:none}.import-drop{border:1.5px dashed #c9c6bc;border-radius:16px;background:#faf9f6;padding:18px;text-align:center}.import-drop input{max-width:100%}.mapping-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:14px}.mapping-item{border:1px solid var(--line);border-radius:12px;padding:10px;background:#fff}.mapping-item label{display:block;font-size:9px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:850;margin-bottom:6px}.mapping-item select{width:100%;border:1px solid var(--line);border-radius:9px;padding:8px;background:#fff}.preview-wrap{overflow:auto;margin-top:14px;border:1px solid var(--line);border-radius:12px}.preview-wrap table{min-width:680px}.import-meta{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.import-meta .tag{font-size:10px}.helper{font-size:10px;line-height:1.45;color:var(--muted);margin-top:8px}.newlead-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.newlead-grid .span2{grid-column:1\/-1}.quickcall-note{background:#f7f5ef;border:1px solid var(--line);border-radius:12px;padding:10px 12px;font-size:10px;color:var(--muted);margin-bottom:12px}.header-actions{display:flex;gap:8px;flex-wrap:wrap}.mini-link{color:var(--accent);font-weight:800;text-decoration:none}.source-badge{font-size:9px;color:var(--muted);margin-top:4px}.import-warning{background:#fff8e9;border:1px solid #ead9b8;color:#72582a;border-radius:12px;padding:10px 12px;font-size:10px;margin-top:12px}\n@media(max-width:1050px){.topbar{height:auto;min-height:78px;flex-wrap:wrap;gap:8px;padding-top:12px;padding-bottom:12px}.topbar .quick-actions{order:3;width:100%;margin:0}.topbar .quick-actions .btn{flex:1}.role-switch{margin-left:auto}.mapping-grid,.newlead-grid{grid-template-columns:1fr}.newlead-grid .span2{grid-column:auto}}\n@media(max-width:650px){.quick-actions{width:100%;display:grid;grid-template-columns:1fr}.header-actions{width:100%}.header-actions .btn{flex:1}.topbar .quick-actions{grid-template-columns:1fr 1fr}.topbar .quick-actions .btn:last-child{grid-column:1\/-1}}\n\n\/* --- Captura inteligente + Call Coach --- *\/\n.btn.smart{background:#eef4ef;color:#204536;border:1px solid #cddfd3}.btn.whatsapp{background:#e8f5ec;color:#1f6942;border:1px solid #c7e3d1}.btn.call-direct{background:#edf1f7;color:#29486f;border:1px solid #d4ddea}.lead-actions{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0 16px}.lead-actions .btn{padding:10px 13px}.coach-shell{margin-top:16px;border:1px solid var(--line);border-radius:16px;background:#faf9f6;overflow:hidden}.coach-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:13px 14px;border-bottom:1px solid var(--line)}.coach-head h4{margin:0;font-size:12px}.coach-head small{color:var(--muted)}.coach-body{padding:14px}.coach-tools{display:flex;gap:8px;flex-wrap:wrap;margin-top:9px}.coach-output{margin-top:12px;display:grid;gap:8px}.coach-card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:11px}.coach-card b{display:block;font-size:10px;margin-bottom:5px;text-transform:uppercase;letter-spacing:.06em}.coach-card p{margin:0;font-size:11px;line-height:1.45;color:#41443e}.coach-card ul{margin:5px 0 0;padding-left:18px;font-size:11px;color:#41443e}.smart-intro{background:linear-gradient(135deg,#173629,#285441);color:#fff;border-radius:16px;padding:14px;margin-bottom:12px}.smart-intro b{display:block;margin-bottom:4px}.smart-intro p{margin:0;color:#d5e3dc;font-size:11px;line-height:1.45}.speech-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:9px}.speech-state{font-size:10px;color:var(--muted)}.speech-state.live{color:#a24f45;font-weight:800}.smart-preview{margin-top:12px;background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px}.smart-preview .preview-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.preview-kv{background:#f4f2ed;border-radius:10px;padding:9px}.preview-kv span{display:block;font-size:8px;color:var(--muted);text-transform:uppercase;letter-spacing:.07em}.preview-kv b{font-size:11px}.transcript-upload{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.transcript-upload input{max-width:280px}.coach-badge{font-size:8px;font-weight:850;letter-spacing:.08em;text-transform:uppercase;padding:5px 7px;border-radius:999px;background:#eeece5;color:#60635b}.whats-msg{white-space:pre-wrap;background:#f4f2ed;border-radius:10px;padding:9px;margin-top:7px;font-size:10px;line-height:1.45}.voice-tip{font-size:10px;color:var(--muted);margin-top:7px}.btn.recording{background:#a24f45!important;color:#fff!important}@media(max-width:700px){.smart-preview .preview-grid{grid-template-columns:1fr}.lead-actions .btn{flex:1 1 42%}}\n<\/style><\/head><body><script>const SEED=[{\"id\": \"vacacional-1\", \"name\": \"Mar\u00eda del Mar - Bustarviejo\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Mar\u00eda del Mar - Bustarviejo\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 2500.0, \"status\": \"Perdido\", \"created\": \"2026-06-01T16:27:11\", \"closed\": \"2026-07-27T16:27:11\", \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-2\", \"name\": \"Jorge - Propietario Alcal\u00e1\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Jorge - Propietario Alcal\u00e1\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 190.0, \"status\": \"Pendiente\", \"created\": \"2026-05-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-3\", \"name\": \"Cristina - Propietaria Cercedilla\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Cristina - Propietaria Cercedilla\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 290.0, \"status\": \"Pendiente\", \"created\": \"2026-05-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-4\", \"name\": \"Sara - Porpietaria Los Molinos\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Sara - Porpietaria Los Molinos\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 190.0, \"status\": \"Pendiente\", \"created\": \"2026-05-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-5\", \"name\": \"Carmen - Propietaria Los Molinos\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Carmen - Propietaria Los Molinos\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 260.0, \"status\": \"Pendiente\", \"created\": \"2026-05-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-6\", \"name\": \"Maribel - Propietario Cobisa\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Maribel Propietaria Cobisa\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 425.0, \"status\": \"Pendiente\", \"created\": \"2026-05-08T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-7\", \"name\": \"Raquel - Gestora El Casar de Escalona\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Raquel - Gestora El Casar de Escalona\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 600.0, \"status\": \"Pendiente\", \"created\": \"2026-05-08T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-8\", \"name\": \"Virgina Propietaria Otero de Herreros\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Lead Magnet\", \"company\": \"\", \"person\": \"Virgina Propietaria Otero de Herreros\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 45.0, \"value\": 300.0, \"status\": \"Pendiente\", \"created\": \"2026-05-08T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-9\", \"name\": \"Cecilia Propietaria Villacast\u00edn\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Visita \/ Videollamada\", \"company\": \"\", \"person\": \"Cecilia Propietaria Villacast\u00edn\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 60.0, \"value\": 185.0, \"status\": \"Pendiente\", \"created\": \"2026-05-08T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-10\", \"name\": \"Mar\u00eda \\\"Propietaria\\\" San Rafael\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Mar\u00eda \\\"Propietaria\\\" San Rafael\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 700.0, \"status\": \"Pendiente\", \"created\": \"2026-05-08T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-11\", \"name\": \"Sergio Propietario Santa Mar\u00eda de la Alameda\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Sergio Propietario Santa Mar\u00eda de la Alameda\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 290.0, \"status\": \"Pendiente\", \"created\": \"2026-05-08T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-12\", \"name\": \"Isabel - Candeleda \u00c1vila\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Isabel - Candeleda \u00c1vila\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 450.0, \"status\": \"Pendiente\", \"created\": \"2026-05-12T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-13\", \"name\": \"Olga - El Barraco \u00c1vila\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Olga - El Barraco \u00c1vila\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 120.0, \"status\": \"Pendiente\", \"created\": \"2026-05-12T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-14\", \"name\": \"Beatriz - Pinar de Puente viejo \u00c1vila\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Lead Magnet\", \"company\": \"\", \"person\": \"Beatriz - Pinar de Puente viejo \u00c1vila\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 45.0, \"value\": 150.0, \"status\": \"Pendiente\", \"created\": \"2026-05-12T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-15\", \"name\": \"Mercedes - La Adrada \u00c1vila\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Mercedes - La Adrada \u00c1vila\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 900.0, \"status\": \"Pendiente\", \"created\": \"2026-05-12T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-16\", \"name\": \"Carlos - Santa M\u00aa del Campo Rus \u00e1vila\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Carlos - Santa M\u00aa del Campo Rus \u00e1vila\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 170.0, \"status\": \"Pendiente\", \"created\": \"2026-05-12T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-17\", \"name\": \"Luis - Renera Guadalajara\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Visita \/ Videollamada\", \"company\": \"\", \"person\": \"Luis - Renera Guadalajara\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 60.0, \"value\": 225.0, \"status\": \"Pendiente\", \"created\": \"2026-05-12T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-18\", \"name\": \"Pepa - Ciruelas Guadalajara\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Pepa - Ciruelas Guadalajara\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 300.0, \"status\": \"Pendiente\", \"created\": \"2026-05-12T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-19\", \"name\": \"Juan Cozuelos de Fuentidue\u00f1a Segovia\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Juan Cozuelos de Fuentidue\u00f1a Segovia\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 115.0, \"status\": \"Pendiente\", \"created\": \"2026-05-16T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-20\", \"name\": \"Beatriz Gestora Villalba de la Sierra Cuenca\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Beatriz Gestora Villalba de la Sierra Cuenca\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 1120.0, \"status\": \"Pendiente\", \"created\": \"2026-05-16T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-21\", \"name\": \"Cecilia G\u00f3mez - Candelario \u00c1vila\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Cecilia G\u00f3mez - Candelario \u00c1vila\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 110.0, \"status\": \"Pendiente\", \"created\": \"2026-05-16T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-22\", \"name\": \"Javier Ant\u00f3n - San Pedro de Ceque\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Javier Ant\u00f3n - San Pedro de Ceque\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 185.0, \"status\": \"Pendiente\", \"created\": \"2026-05-16T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-23\", \"name\": \"Elena - Casarrubios\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Elena - Casarrubios\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 2000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-24\", \"name\": \"Diego - M\u00e9ntrida\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Diego - M\u00e9ntrida\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 2000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-25\", \"name\": \"Ismael - Peguerinos\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Lead Magnet\", \"company\": \"\", \"person\": \"Ismael - Peguerinos\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 45.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-06-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-26\", \"name\": \"Lidia - Valdemanco\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Lidia - Valdemanco\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 1500.0, \"status\": \"Pendiente\", \"created\": \"2026-06-01T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-27\", \"name\": \"In\u00e9s - Cervera de Buitrago\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"In\u00e9s - Cervera de Buitrago\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 2000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-09T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-28\", \"name\": \"Samuel - San Mart\u00edn de la Vega\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Samuel - San Mart\u00edn de la Vega\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 2000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-09T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-29\", \"name\": \"Mario - Propietario Cobisa\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Mario - Propietario Cobisa\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 4000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-09T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-30\", \"name\": \"Michael Beskow - Meloneras\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Lead Magnet\", \"company\": \"\", \"person\": \"Michael Beskow - Meloneras\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 45.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-09T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-31\", \"name\": \"Ana Gestora - El Salobre Canarias\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Ana Gestora - El Salobre Canarias\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 1000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-09T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-32\", \"name\": \"Gema - Propietaria El Salobre Canarias\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Gema - Propietaria El Salobre Canarias\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-09T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-33\", \"name\": \"Miguel - C\u00fapulas Sonseca\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Lead Magnet\", \"company\": \"\", \"person\": \"Miguel - C\u00fapulas Sonseca\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 45.0, \"value\": 1000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-10T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-34\", \"name\": \"Mateusz - Meloneras Canarias\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Mateusz - Meloneras Canarias\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-35\", \"name\": \"Paola - Cercedilla\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Paola - Cercedilla\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-36\", \"name\": \"Jes\u00fas - Cercedilla\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Jes\u00fas - Cercedilla\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-37\", \"name\": \"Francisca - Collado Villalba\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Francisca - Collado Villalba\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-38\", \"name\": \"Inmaculada - Alpedrete\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Inmaculada - Alpedrete\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 1000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-39\", \"name\": \"Katia - El Escorial\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Katia - El Escorial\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 2000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-40\", \"name\": \"Jorge - Villanueva del Pardillo\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Jorge - Villanueva del Pardillo\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-41\", \"name\": \"Mai - La Adrada\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Mail\", \"company\": \"\", \"person\": \"Mai - La Adrada\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 20.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-06-17T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-42\", \"name\": \"Juan Pablo - Lanzarote\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Juan Pablo - Lanzarote\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-07-03T16:27:11\", \"closed\": null, \"tags\": \"-lanzarote\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-43\", \"name\": \"Blas Ruyman - Lanzarote\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Lead Magnet\", \"company\": \"\", \"person\": \"Blas Ruyman - Lanzarote\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 45.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-07-06T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-44\", \"name\": \"Carlos - Almorox - Casa OM\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Carlos - Almorox - Casa OM\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-07-18T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-45\", \"name\": \"Antonio - Garcill\u00e1n, Segovia\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Antonio - Garcill\u00e1n, Segovia\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-07-18T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-46\", \"name\": \"Aroa - Cobisa, Toledo\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Aroa - Cobisa, Toledo\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 2500.0, \"status\": \"Pendiente\", \"created\": \"2026-07-18T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-47\", \"name\": \"Clarisa - El Real de San Vicente, Toledo\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Clarisa - El Real de San Vicente, Toledo\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-07-18T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-48\", \"name\": \"Jennifer Vigara - Cobisa\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Jennifer Vigara - Cobisa\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 2000.0, \"status\": \"Pendiente\", \"created\": \"2026-07-29T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-49\", \"name\": \"Carlos - Real de San Vicente\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"Carlos - Real de San Vicente\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 6000.0, \"status\": \"Pendiente\", \"created\": \"2026-08-05T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-50\", \"name\": \"\u00c1lvaro - El Real de San Vicente\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"\u00c1lvaro - El Real de San Vicente\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-08-05T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-51\", \"name\": \"Jes\u00fas - El Real de San Vicente\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Jes\u00fas - El Real de San Vicente\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 3000.0, \"status\": \"Pendiente\", \"created\": \"2026-08-05T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-52\", \"name\": \"Felipe - Guadamur\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Llamada \/ WhatsApp\", \"company\": \"\", \"person\": \"Felipe - Guadamur\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 40.0, \"value\": 6000.0, \"status\": \"Pendiente\", \"created\": \"2026-08-05T16:27:11\", \"closed\": null, \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-53\", \"name\": \"H\u00e9ctor - Calalberche Casa Oriental\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Seguimiento\", \"company\": \"\", \"person\": \"H\u00e9ctor - Calalberche Casa Oriental\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 80.0, \"value\": 2500.0, \"status\": \"Ganado\", \"created\": \"2026-06-08T16:27:11\", \"closed\": \"2026-06-08T16:27:11\", \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-54\", \"name\": \"Ana - Pinilla del Valle\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Visita \/ Videollamada\", \"company\": \"\", \"person\": \"Ana - Pinilla del Valle\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 60.0, \"value\": 2000.0, \"status\": \"Ganado\", \"created\": \"2026-07-18T16:27:11\", \"closed\": \"2026-08-20T16:27:11\", \"tags\": \"\", \"origin\": \"Holded\"}, {\"id\": \"vacacional-55\", \"name\": \"Manuel - Zamarramala, Segovia\", \"division\": \"Villas Rivero\", \"sourcePipeline\": \"Vacacional\", \"stage\": \"Visita \/ Videollamada\", \"company\": \"\", \"person\": \"Manuel - Zamarramala, Segovia\", \"assignee\": \"Mois\u00e9s Sanz Mart\u00edn\", \"potential\": 60.0, \"value\": 2000.0, \"status\": \"Ganado\", \"created\": \"2026-07-18T16:27:11\", \"closed\": \"2026-07-20T16:27:11\", \"tags\": \"\", \"origin\": \"Holded\"}];const LOCKED_ROLE=\"moises\";<\/script>\n<div class=\"app\">\n<aside class=\"sidebar\">\n  <div class=\"brand\"><div class=\"mini\">REALIUXE<\/div><h1>SALES OS<\/h1><small id=\"brandSub\">Direcci\u00f3n comercial<\/small><\/div>\n  <nav class=\"nav\">\n    <button data-view=\"dashboard\" class=\"active\"><span class=\"ico\"><\/span>Dashboard<\/button>\n    <button data-view=\"day\"><span class=\"ico\"><\/span>Mi d\u00eda<\/button>\n    <button data-view=\"weekly\"><span class=\"ico\"><\/span>Objetivo semanal<\/button>\n    <button data-view=\"pipeline\"><span class=\"ico\"><\/span>Pipeline<\/button>\n    <button data-view=\"opportunities\"><span class=\"ico\"><\/span>Oportunidades<\/button>\n    <button data-view=\"followups\"><span class=\"ico\"><\/span>Seguimientos<\/button>\n    <button data-view=\"ai\"><span class=\"ico\"><\/span>Copiloto IA<\/button>\n    <button data-view=\"divisions\"><span class=\"ico\"><\/span>Divisiones<\/button>\n  <\/nav>\n  <div class=\"sidecard\"><b id=\"sideTitle\">Acceso de Direcci\u00f3n<\/b><p id=\"sideText\">Vista global de REALIUXE. La versi\u00f3n de Mois\u00e9s queda limitada a Villas Rivero y a sus oportunidades.<\/p><\/div>\n<\/aside>\n<main class=\"main\">\n<header class=\"topbar\"><div class=\"product\"><strong>REALIUXE SALES OS<\/strong><select id=\"globalDivision\" class=\"division-select\"><\/select><\/div><div class=\"quick-actions\"><button id=\"quickCallTop\" class=\"btn primary\">\ud83d\udcde Registrar llamada<\/button><button id=\"smartCaptureTop\" class=\"btn smart\">\u2728 Captura inteligente<\/button><button id=\"newLeadTop\" class=\"btn outline\">\uff0b Nuevo lead<\/button><button id=\"importTop\" class=\"btn import\">\u21a5 Importar Excel<\/button><\/div><div id=\"roleSwitch\" class=\"role-switch\"><button id=\"roleHector\" class=\"active\">H\u00e9ctor<\/button><button id=\"roleMoises\">Mois\u00e9s<\/button><\/div><\/header>\n<div class=\"content\">\n<div id=\"notice\" class=\"notice hidden\">Modo comercial Villas Rivero: solo se muestran oportunidades asignadas a Mois\u00e9s.<\/div>\n<section id=\"dashboard\" class=\"view active\"><div class=\"hero\"><div><div class=\"eyebrow\" id=\"heroEyebrow\"><\/div><h2 id=\"heroTitle\"><\/h2><p id=\"heroText\"><\/p><\/div><div class=\"quote\"><p id=\"quoteText\"><\/p><span id=\"quoteAuthor\"><\/span><\/div><\/div><div class=\"grid4\" id=\"metrics\"><\/div><div class=\"split\"><div class=\"section\"><div class=\"section-head\"><div><h3>Prioridades de hoy<\/h3><p>Lo que m\u00e1s merece tu atenci\u00f3n ahora.<\/p><\/div><span class=\"tag hot\">SIGUIENTE ACCI\u00d3N<\/span><\/div><div id=\"priorities\"><\/div><\/div><div><div id=\"mission\"><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Pipeline por divisi\u00f3n<\/h3><p>Valor pendiente y presencia comercial.<\/p><\/div><\/div><div id=\"divisionList\" class=\"division-list\"><\/div><\/div><\/div><\/div><\/section>\n<section id=\"day\" class=\"view\"><div class=\"hero\"><div><div class=\"eyebrow\">SALES COMMAND CENTER<\/div><h2>Tu d\u00eda comercial<\/h2><p>Prospecci\u00f3n fr\u00eda y seguimiento son dos trabajos distintos. Aqu\u00ed se miden por separado.<\/p><\/div><\/div><div class=\"call-legend\"><span class=\"legend-pill\"><b>\ud83d\udcde Prospecci\u00f3n fr\u00eda<\/b> \u00b7 primer contacto comercial<\/span><span class=\"legend-pill\"><b>\ud83d\udd01 Seguimiento<\/b> \u00b7 contacto posterior sobre una oportunidad ya trabajada<\/span><\/div><div id=\"dayStats\" class=\"cards3\"><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Modo foco<\/h3><p>Haz la siguiente llamada, registra el resultado y contin\u00faa.<\/p><\/div><div class=\"header-actions\"><button id=\"quickCallDay\" class=\"btn soft\">\ud83d\udcde Registrar llamada<\/button><button id=\"focusFirst\" class=\"btn primary\">Empezar ahora<\/button><\/div><\/div><div id=\"focusList\" class=\"focus-list\"><\/div><\/div><\/section>\n<section id=\"weekly\" class=\"view\"><div class=\"hero\"><div><div class=\"eyebrow\">WEEKLY SALES COACH<\/div><h2>Objetivo semanal<\/h2><p>Define el resultado que quieres conseguir. SALES OS traduce ese objetivo a actividad comercial usando tu hist\u00f3rico real.<\/p><\/div><span id=\"modelConfidence\" class=\"confidence\">MODELO EN APRENDIZAJE<\/span><\/div><div id=\"weeklyPrompt\"><\/div><div class=\"weekly-grid\"><div class=\"goal-card\"><div class=\"eyebrow\">TU COMPROMISO<\/div><h3 id=\"goalHeadline\">Define el objetivo de la semana<\/h3><p id=\"goalSub\">El viernes por la tarde o el domingo es el momento ideal para dejar preparada la semana siguiente.<\/p><div class=\"goal-form\"><div><label>Semana<\/label><select id=\"goalWeek\"><\/select><\/div><div><label>Cierres objetivo<\/label><input id=\"goalWins\" type=\"number\" min=\"0\" max=\"30\" step=\"1\" value=\"2\"><\/div><button id=\"saveGoal\" class=\"btn gold\">Guardar objetivo<\/button><\/div><div id=\"goalSummary\" class=\"goal-summary\"><\/div><\/div><div><div id=\"learningBox\" class=\"learning\"><\/div><div class=\"section\" style=\"margin-top:12px\"><div class=\"section-head\"><div><h3>KPIs hist\u00f3ricos<\/h3><p>Lo que SALES OS sabe de tu rendimiento hasta ahora.<\/p><\/div><\/div><div id=\"historicalKpis\" class=\"kpi-grid\"><\/div><\/div><\/div><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Plan de actividad calculado<\/h3><p id=\"planCaption\">Del objetivo al comportamiento que lo hace posible.<\/p><\/div><\/div><div id=\"activityPlan\" class=\"funnel\"><\/div><div id=\"coachMessage\" class=\"coach\"><\/div><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Ritmo de la semana<\/h3><p>Actividad real frente a la actividad necesaria.<\/p><\/div><\/div><div id=\"paceGrid\" class=\"pace-grid\"><\/div><\/div><\/section>\n<section id=\"pipeline\" class=\"view\"><div class=\"hero\"><div><div class=\"eyebrow\">PIPELINE<\/div><h2>Oportunidades en movimiento<\/h2><p>Kanban comercial por etapa.<\/p><\/div><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Embudo comercial<\/h3><p id=\"pipelineCaption\"><\/p><\/div><div class=\"controls\"><select id=\"pipelineDivision\"><\/select><\/div><\/div><div id=\"pipelineBoard\" class=\"pipeline\"><\/div><\/div><\/section>\n<section id=\"opportunities\" class=\"view\"><div class=\"hero\"><div><div class=\"eyebrow\">BASE COMERCIAL<\/div><h2>Oportunidades<\/h2><p>Abre cualquier lead para registrar prospecci\u00f3n fr\u00eda, seguimiento, nota y pr\u00f3xima acci\u00f3n.<\/p><\/div><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Listado<\/h3><p id=\"tableCaption\"><\/p><\/div><div><div class=\"header-actions\"><button id=\"newLeadList\" class=\"btn primary\">\uff0b Nuevo lead<\/button><button id=\"importList\" class=\"btn import\">\u21a5 Importar Excel<\/button><\/div><div class=\"controls\" style=\"margin-top:8px\"><input id=\"search\" placeholder=\"Buscar\u2026\"><select id=\"tableDivision\"><\/select><\/div><\/div><\/div><div class=\"table-wrap\"><table><thead><tr><th>Oportunidad<\/th><th>Divisi\u00f3n<\/th><th>Etapa<\/th><th>Responsable<\/th><th>Valor<\/th><th>Pr\u00f3xima acci\u00f3n<\/th><th>Estado<\/th><\/tr><\/thead><tbody id=\"tableBody\"><\/tbody><\/table><\/div><\/div><\/section>\n<section id=\"followups\" class=\"view\"><div class=\"hero\"><div><div class=\"eyebrow\">SEGUIMIENTOS<\/div><h2>Nada se queda atr\u00e1s<\/h2><p>Pr\u00f3ximas acciones guardadas y oportunidades sin fecha.<\/p><\/div><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Cola de seguimiento<\/h3><p>Ordenada por urgencia.<\/p><\/div><\/div><div id=\"followupList\"><\/div><\/div><\/section>\n<section id=\"ai\" class=\"view\"><div class=\"hero\"><div><div class=\"eyebrow\">COPILOTO IA<\/div><h2>Qu\u00e9 har\u00eda ahora<\/h2><p>Priorizaci\u00f3n operativa basada en etapa, antig\u00fcedad, valor y contexto registrado.<\/p><\/div><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Acciones recomendadas<\/h3><p>Motor de seguimiento v1.<\/p><\/div><\/div><div id=\"aiPanel\"><\/div><\/div><\/section>\n<section id=\"divisions\" class=\"view\"><div class=\"hero\"><div><div class=\"eyebrow\">DIVISIONES<\/div><h2>REALIUXE por l\u00ednea de negocio<\/h2><p>Villas Rivero, Alliance, Living, Co-Living y Capital.<\/p><\/div><\/div><div class=\"section\"><div class=\"section-head\"><div><h3>Estado comercial<\/h3><p>\u201cSin oportunidades\u201d significa que la divisi\u00f3n existe pero a\u00fan no tiene leads cargados.<\/p><\/div><\/div><div id=\"divisionCards\" class=\"division-list\"><\/div><\/div><\/section>\n<\/div><\/main><\/div>\n<div id=\"modalBack\" class=\"modal-back hidden\"><div class=\"modal\"><div class=\"modal-head\"><div><div class=\"eyebrow\">FICHA 360\u00ba<\/div><h3 id=\"modalTitle\"><\/h3><\/div><button id=\"closeModal\" class=\"close\">\u00d7<\/button><\/div><div class=\"modal-body\"><div id=\"modalMeta\" style=\"margin-bottom:8px\"><\/div><div id=\"leadActions\" class=\"lead-actions\"><\/div>\n<div class=\"lead-tabs\"><button class=\"lead-tab active\" data-lead-tab=\"summary\">Resumen<\/button><button class=\"lead-tab\" data-lead-tab=\"activity\">Actividad<\/button><button class=\"lead-tab\" data-lead-tab=\"coach\">\ud83e\udde0 AI Coach<\/button><button class=\"lead-tab\" data-lead-tab=\"docs\">Documentos<\/button><\/div>\n<div id=\"leadPaneSummary\" class=\"lead-pane active\"><div class=\"form-grid\"><div class=\"field\"><label>Etapa<\/label><select id=\"editStage\"><\/select><\/div><div class=\"field\"><label>Temperatura<\/label><select id=\"editTemp\"><option>Normal<\/option><option>Media<\/option><option>Alta<\/option><option>Muy alta<\/option><\/select><\/div><div class=\"field\"><label>Tel\u00e9fono \/ WhatsApp<\/label><input id=\"editPhone\" type=\"tel\" placeholder=\"+34 600 000 000\"><\/div><div class=\"field\"><label>Email<\/label><input id=\"editEmail\" type=\"email\" placeholder=\"email@ejemplo.com\"><\/div><div class=\"field span2\"><label>Nota \/ resultado de la interacci\u00f3n<\/label><textarea id=\"editNote\" placeholder=\"Ej.: Est\u00e1 interesado, quiere revisarlo con su mujer. Llamar el martes.\"><\/textarea><\/div><div class=\"field\"><label>Pr\u00f3xima acci\u00f3n<\/label><input id=\"editNextAction\" placeholder=\"Llamar \/ WhatsApp \/ Reuni\u00f3n\u2026\"><\/div><div class=\"field\"><label>Fecha pr\u00f3xima acci\u00f3n<\/label><input type=\"date\" id=\"editNextDate\"><\/div><\/div><div class=\"modal-actions\"><button id=\"coldCallBtn\" class=\"btn gold\">\ud83d\udcde Prospecci\u00f3n fr\u00eda +1<\/button><button id=\"followUpBtn\" class=\"btn soft\">\ud83d\udd01 Seguimiento +1<\/button><button id=\"videoBtn\" class=\"btn video\">\ud83c\udfa5 Videollamada +1<\/button><button id=\"proposalBtn\" class=\"btn proposal\">\ud83d\udcc4 Propuesta +1<\/button><button id=\"winBtn\" class=\"btn win\">\ud83c\udfc6 Ganado<\/button><button id=\"saveBtn\" class=\"btn primary\">Guardar<\/button><\/div><\/div>\n<div id=\"leadPaneActivity\" class=\"lead-pane\"><div class=\"activity-history\"><h4>Actividad reciente<\/h4><div id=\"activityHistory\"><\/div><\/div><\/div>\n<div id=\"leadPaneCoach\" class=\"lead-pane\"><div id=\"coachNudge\" class=\"coach-cta hidden\"><div><b>Interacci\u00f3n registrada. Ahora convi\u00e9rtela en inteligencia.<\/b><p>Pega, sube o dicta la conversaci\u00f3n y deja que el Coach prepare el seguimiento.<\/p><\/div><div class=\"spark\">\u2728<\/div><\/div><div class=\"project-playbook\"><b>Playbook Mois\u00e9s activo<\/b><div class=\"playbook-chips\"><span>15\u201330 READY_TO_CALL \/ d\u00eda<\/span><span>M\u00ednimo operativo 15<\/span><span>Propietarios \u00b7 no B2B<\/span><span>Si una zona no da, pasar a la siguiente<\/span><span>Villas \/ chalets \/ fincas \/ casas<\/span><span>\u2265 6 pax<\/span><span>\u2265 3 dormitorios<\/span><span>Piscina \/ jard\u00edn \/ terraza \/ vistas<\/span><span>Cuidado premium<\/span><span>Ubicaci\u00f3n tur\u00edstica<\/span><span>Excluir piso b\u00e1sico<\/span><\/div><\/div><div class=\"coach-shell\"><div class=\"coach-head\"><div><h4>\ud83e\udde0 AI Coach \u00b7 seguimiento inteligente<\/h4><small>Pega o sube la transcripci\u00f3n. En este HTML el an\u00e1lisis es local y aplica el playbook comercial del proyecto de Mois\u00e9s.<\/small><\/div><span class=\"coach-badge\">PLAYBOOK ACTIVO<\/span><\/div><div class=\"coach-body\"><div class=\"field\"><label>Transcripci\u00f3n \/ notas completas de la llamada<\/label><textarea id=\"coachTranscript\" style=\"min-height:160px\" placeholder=\"Pega aqu\u00ed la transcripci\u00f3n de la llamada o videollamada\u2026\"><\/textarea><\/div><div class=\"transcript-upload\"><input id=\"coachFile\" type=\"file\" accept=\".txt,.md,.srt,.vtt,text\/plain\"><button id=\"dictateCoach\" class=\"btn soft\" type=\"button\">\ud83c\udf99\ufe0f Dictar<\/button><span id=\"coachSpeechState\" class=\"speech-state\">Tambi\u00e9n puedes dictar un resumen.<\/span><\/div><div class=\"coach-tools\"><button id=\"analyzeCoach\" class=\"btn primary\" type=\"button\">\u2728 Analizar seguimiento<\/button><button id=\"applyCoach\" class=\"btn gold\" type=\"button\">Aplicar recomendaci\u00f3n<\/button><\/div><div id=\"coachOutput\" class=\"coach-output\"><\/div><\/div><\/div><\/div>\n<div id=\"leadPaneDocs\" class=\"lead-pane\"><div class=\"docs-placeholder\"><b>Documentos del lead<\/b><p>La pesta\u00f1a queda reservada para propuestas, contratos, documentos y adjuntos. En esta versi\u00f3n HTML no guardamos archivos sensibles dentro del navegador; la activaremos con almacenamiento seguro cuando pasemos a la versi\u00f3n con base de datos.<\/p><\/div><\/div>\n<\/div><\/div><\/div>\n<div id=\"newLeadBack\" class=\"modal-back hidden\"><div class=\"modal\"><div class=\"modal-head\"><div><div class=\"eyebrow\">NUEVA OPORTUNIDAD<\/div><h3>A\u00f1adir nuevo lead<\/h3><\/div><button id=\"closeNewLead\" class=\"close\">\u00d7<\/button><\/div><div class=\"modal-body\"><div class=\"newlead-grid\"><div class=\"field span2\"><label>Nombre \/ oportunidad *<\/label><input id=\"newName\" placeholder=\"Ej.: Laura \u00b7 Propietaria en Mog\u00e1n\"><\/div><div class=\"field\"><label>Tel\u00e9fono<\/label><input id=\"newPhone\" type=\"tel\" placeholder=\"+34 600 000 000\"><\/div><div class=\"field\"><label>Email<\/label><input id=\"newEmail\" type=\"email\" placeholder=\"email@ejemplo.com\"><\/div><div class=\"field\"><label>Localidad \/ zona<\/label><input id=\"newLocation\" placeholder=\"Mog\u00e1n, Gran Canaria\u2026\"><\/div><div class=\"field\"><label>Origen<\/label><select id=\"newOrigin\"><option>Prospecci\u00f3n propia<\/option><option>Referido<\/option><option>Web<\/option><option>Redes sociales<\/option><option>Excel<\/option><option>Otro<\/option><\/select><\/div><div class=\"field\"><label>Valor estimado<\/label><input id=\"newValue\" type=\"number\" min=\"0\" step=\"10\" placeholder=\"0\"><\/div><div class=\"field\"><label>Potencial<\/label><select id=\"newPotential\"><option value=\"20\">20%<\/option><option value=\"40\" selected>40%<\/option><option value=\"60\">60%<\/option><option value=\"80\">80%<\/option><option value=\"100\">100%<\/option><\/select><\/div><div class=\"field span2\"><label>Nota inicial<\/label><textarea id=\"newNote\" placeholder=\"Qu\u00e9 sabemos de este lead\u2026\"><\/textarea><\/div><div class=\"field\"><label>Pr\u00f3xima acci\u00f3n<\/label><input id=\"newNextAction\" placeholder=\"Llamar \/ WhatsApp \/ Email\u2026\"><\/div><div class=\"field\"><label>Fecha pr\u00f3xima acci\u00f3n<\/label><input id=\"newNextDate\" type=\"date\"><\/div><\/div><div class=\"helper\">El lead se a\u00f1adir\u00e1 a <b>Villas Rivero<\/b> y quedar\u00e1 asignado a <b>Mois\u00e9s Sanz Mart\u00edn<\/b>. Si ya acabas de hacer la primera llamada, usa \u201cCrear + registrar prospecci\u00f3n\u201d.<\/div><div class=\"modal-actions\"><button id=\"createAndColdBtn\" class=\"btn gold\">\ud83d\udcde Crear + registrar prospecci\u00f3n<\/button><button id=\"createLeadBtn\" class=\"btn primary\">Crear lead<\/button><\/div><\/div><\/div><\/div>\n\n<div id=\"quickCallBack\" class=\"modal-back hidden\"><div class=\"modal\"><div class=\"modal-head\"><div><div class=\"eyebrow\">ACTIVIDAD COMERCIAL<\/div><h3>Registrar una llamada<\/h3><\/div><button id=\"closeQuickCall\" class=\"close\">\u00d7<\/button><\/div><div class=\"modal-body\"><div class=\"quickcall-note\">Aqu\u00ed registras una llamada sin tener que buscar primero la ficha. Si el contacto a\u00fan no existe, ci\u00e9rralo y pulsa <b>\uff0b Nuevo lead<\/b>.<\/div><div class=\"form-grid\"><div class=\"field span2\"><label>Lead \/ oportunidad<\/label><select id=\"quickLeadSelect\"><\/select><\/div><div class=\"field\"><label>Tipo de llamada<\/label><select id=\"quickCallType\"><option value=\"cold\">\ud83d\udcde Prospecci\u00f3n fr\u00eda<\/option><option value=\"followup\">\ud83d\udd01 Seguimiento<\/option><\/select><\/div><div class=\"field\"><label>Temperatura<\/label><select id=\"quickTemp\"><option>Normal<\/option><option>Media<\/option><option>Alta<\/option><option>Muy alta<\/option><\/select><\/div><div class=\"field span2\"><label>Resultado \/ nota<\/label><textarea id=\"quickNote\" placeholder=\"Ej.: Habl\u00e9 con el propietario. Interesado, pero quiere revisarlo con su pareja.\"><\/textarea><\/div><div class=\"field\"><label>Pr\u00f3xima acci\u00f3n<\/label><input id=\"quickNextAction\" placeholder=\"Llamar \/ WhatsApp \/ Videollamada\u2026\"><\/div><div class=\"field\"><label>Fecha pr\u00f3xima acci\u00f3n<\/label><input id=\"quickNextDate\" type=\"date\"><\/div><\/div><div class=\"modal-actions\"><button id=\"saveQuickCall\" class=\"btn primary\">Guardar llamada<\/button><\/div><\/div><\/div><\/div>\n\n<div id=\"smartCaptureBack\" class=\"modal-back hidden\"><div class=\"modal\" style=\"width:min(760px,100%)\"><div class=\"modal-head\"><div><div class=\"eyebrow\">CAPTURA INTELIGENTE<\/div><h3>Cu\u00e9ntale el lead al CRM<\/h3><\/div><button id=\"closeSmartCapture\" class=\"close\">\u00d7<\/button><\/div><div class=\"modal-body\"><div class=\"smart-intro\"><b>Escribe o dicta como hablar\u00edas conmigo.<\/b><p>Ejemplo: \u201cLaura, propietaria en Mog\u00e1n. Me la pas\u00f3 Juan. Tel\u00e9fono 600 123 123. Tiene una villa y est\u00e1 buscando gestora. Llamarla el martes. Valor estimado 400 euros al mes.\u201d<\/p><\/div><div class=\"field\"><label>Informaci\u00f3n del lead<\/label><textarea id=\"smartText\" style=\"min-height:165px\" placeholder=\"Escribe aqu\u00ed todo lo que sabes, sin preocuparte por campos\u2026\"><\/textarea><\/div><div class=\"speech-row\"><button id=\"smartMic\" class=\"btn gold\" type=\"button\">\ud83c\udf99\ufe0f Dictar lead<\/button><button id=\"smartParse\" class=\"btn primary\" type=\"button\">\u2728 Entender datos<\/button><button id=\"smartClear\" class=\"btn soft\" type=\"button\">Limpiar<\/button><span id=\"smartSpeechState\" class=\"speech-state\">El dictado funciona en navegadores compatibles y normalmente requiere HTTPS.<\/span><\/div><div id=\"smartPreview\" class=\"smart-preview hidden\"><\/div><div class=\"modal-actions\"><button id=\"smartToLead\" class=\"btn primary\" type=\"button\" disabled>Crear ficha con estos datos \u2192<\/button><\/div><\/div><\/div><\/div>\n<div id=\"importBack\" class=\"modal-back hidden\"><div class=\"modal\" style=\"width:min(900px,100%)\"><div class=\"modal-head\"><div><div class=\"eyebrow\">IMPORTACI\u00d3N<\/div><h3>Importar leads desde Excel<\/h3><\/div><button id=\"closeImport\" class=\"close\">\u00d7<\/button><\/div><div class=\"modal-body\"><div class=\"import-drop\"><b>Selecciona el archivo de Mois\u00e9s<\/b><p class=\"helper\" style=\"margin:6px 0 12px\">Compatible con <b>.xlsx<\/b>, <b>.xls<\/b> y <b>.csv<\/b>. El archivo se procesa localmente en este navegador: no se env\u00eda a ning\u00fan servidor.<\/p><input id=\"importFile\" type=\"file\" accept=\".xlsx,.xls,.csv,text\/csv,application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application\/vnd.ms-excel\"><\/div><div id=\"importInfo\" class=\"import-meta\"><\/div><div id=\"mappingArea\" class=\"hidden\"><div class=\"mapping-grid\" id=\"mappingFields\"><\/div><div id=\"importPreview\" class=\"preview-wrap\"><\/div><div class=\"import-warning\">Antes de importar, comprueba al menos <b>Nombre<\/b>. El CRM intentar\u00e1 detectar autom\u00e1ticamente tel\u00e9fono, email, valor, etapa y zona, pero puedes cambiar cualquier columna desde los desplegables.<\/div><div class=\"modal-actions\"><button id=\"confirmImport\" class=\"btn primary\">Importar leads<\/button><\/div><\/div><\/div><\/div><\/div>\n<div id=\"toast\" class=\"toast hidden\"><\/div>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/xlsx@0.18.5\/dist\/xlsx.full.min.js\"><\/script>\n<script>\nconst ALL_DIVISIONS=['Villas Rivero','REALIUXE Alliance','REALIUXE Living','REALIUXE Co-Living','REALIUXE Capital'];\nconst DIV_LABEL={'Villas Rivero':'Villas Rivero','REALIUXE Alliance':'Alliance','REALIUXE Living':'Living','REALIUXE Co-Living':'Co-Living','REALIUXE Capital':'Capital'};\nlet role=LOCKED_ROLE||'hector', activeDivision='', currentLead=null;\nconst now=()=>new Date();\nconst money=n=>new Intl.NumberFormat('es-ES',{style:'currency',currency:'EUR',maximumFractionDigits:0}).format(n||0);\nconst age=x=>Math.max(0,Math.floor((now()-new Date(x.created))\/86400000));\nconst state=()=>JSON.parse(localStorage.getItem('realiuxeSalesState')||'{}');\nconst saveState=s=>localStorage.setItem('realiuxeSalesState',JSON.stringify(s));\nconst todayKey=()=>{const d=now();return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`};\nfunction leadState(id){return state().leads?.[id]||{}}\nfunction customLeads(){return state().customLeads||[]}\nfunction combinedData(){return [...SEED,...customLeads()]}\nfunction activity(){const a=state().activity?.[todayKey()]||{};return {coldCalls:a.coldCalls||0,followUpCalls:a.followUpCalls||0,videoMeetings:a.videoMeetings||0,proposals:a.proposals||0,wins:a.wins||0,updates:a.updates||0,legacyCalls:a.calls||0}}\nfunction effectiveStage(x){return leadState(x.id).stage||x.stage}\nfunction effectiveStatus(x){const st=effectiveStage(x),ls=leadState(x.id);if(st==='Ganado')return 'Ganado';if(st==='Perdido')return 'Perdido';if(!ls.stage&&(x.status==='Ganado'||x.status==='Perdido'))return x.status;return 'Pendiente'}\nconst STAGE_LABEL={'Lead Magnet':'Lead Magnet','Llamada \/ WhatsApp':'Prospecci\u00f3n fr\u00eda \/ 1er contacto','Mail':'Email enviado','Seguimiento':'Seguimiento','Visita \/ Videollamada':'Visita \/ Videollamada','Contacto establecido':'Contacto establecido','Propuesta realizada':'Propuesta realizada','Ganado':'Ganado','Perdido':'Perdido'};\nfunction roleData(){const all=combinedData();return role==='moises'?all.filter(x=>x.division==='Villas Rivero'&&x.assignee.includes('Mois\u00e9s')):all}\nfunction visibleData(){let d=roleData();return activeDivision?d.filter(x=>x.division===activeDivision):d}\nfunction score(x){const w={'Propuesta realizada':98,'Seguimiento':90,'Visita \/ Videollamada':85,'Contacto establecido':75,'Mail':65,'Llamada \/ WhatsApp':58,'Lead Magnet':52};let s=(w[effectiveStage(x)]||50)+Math.min(age(x),90)*.18+(x.potential||0)*.07+Math.min((x.value||0)\/3000,8);const ls=leadState(x.id);if(ls.nextDate)s+=6;if(ls.note)s+=4;return Math.round(s)}\nfunction rec(x){const ls=leadState(x.id),stage=effectiveStage(x);if(ls.nextDate){const d=new Date(ls.nextDate+'T12:00:00');const diff=Math.floor((d-now())\/86400000);if(diff<=0)return `Seguimiento ${diff<0?'vencido':'para hoy'}: ${ls.nextAction||'contactar'}.`;return `Pr\u00f3xima acci\u00f3n en ${diff} d\u00edas: ${ls.nextAction||'contactar'}.`}if(stage==='Propuesta realizada')return 'Propuesta abierta: confirmar respuesta y fijar siguiente contacto.';if(stage==='Seguimiento')return 'Seguimiento prioritario: registrar fecha exacta de pr\u00f3xima acci\u00f3n.';if(stage==='Visita \/ Videollamada')return 'Oportunidad avanzada: confirmar objeciones y avanzar a propuesta.';if(stage==='Contacto establecido')return 'Convertir contacto en reuni\u00f3n, discovery o propuesta.';if(stage==='Mail')return 'Complementar el email con una llamada de seguimiento.';if(stage==='Llamada \/ WhatsApp')return 'Prospecci\u00f3n fr\u00eda: contactar y registrar resultado + pr\u00f3xima acci\u00f3n.';return 'Hacer primer contacto comercial y registrar resultado + pr\u00f3xima acci\u00f3n.'}\nfunction temp(x){const v=leadState(x.id).temp;if(v)return v;let s=score(x);return s>=100?'Muy alta':s>=88?'Alta':s>=74?'Media':'Normal'}\nfunction openDeals(){return visibleData().filter(x=>effectiveStatus(x)==='Pendiente')}\nfunction populateGlobal(){const s=document.getElementById('globalDivision');if(role==='moises'){s.innerHTML='<option value=\"Villas Rivero\">VILLAS RIVERO \u00b7 SALES<\/option>';s.disabled=true;activeDivision='Villas Rivero'}else{s.disabled=false;s.innerHTML='<option value=\"\">REALIUXE \u00b7 GLOBAL<\/option>'+ALL_DIVISIONS.map(d=>`<option value=\"${d}\">${DIV_LABEL[d].toUpperCase()}<\/option>`).join('');s.value=activeDivision}}\nfunction setSkin(){document.body.classList.toggle('villas',role==='moises'||activeDivision==='Villas Rivero');document.getElementById('brandSub').textContent=role==='moises'?'Villas Rivero \u00b7 Captaci\u00f3n':'Direcci\u00f3n comercial';document.getElementById('notice').classList.toggle('hidden',role!=='moises');document.getElementById('sideTitle').textContent=role==='moises'?'Tu espacio comercial':'Acceso de Direcci\u00f3n';document.getElementById('sideText').textContent=role==='moises'?'Aqu\u00ed solo aparecen tus oportunidades de Villas Rivero.':'Vista global de REALIUXE. La versi\u00f3n de Mois\u00e9s queda limitada a Villas Rivero y a sus oportunidades.';populateGlobal()}\n\nfunction isoWeekInfo(date=new Date()){const d=new Date(Date.UTC(date.getFullYear(),date.getMonth(),date.getDate()));const day=d.getUTCDay()||7;d.setUTCDate(d.getUTCDate()+4-day);const yearStart=new Date(Date.UTC(d.getUTCFullYear(),0,1));const week=Math.ceil((((d-yearStart)\/86400000)+1)\/7);const monday=new Date(d);monday.setUTCDate(d.getUTCDate()-3);const sunday=new Date(monday);sunday.setUTCDate(monday.getUTCDate()+6);return {year:d.getUTCFullYear(),week,monday:new Date(monday.getUTCFullYear(),monday.getUTCMonth(),monday.getUTCDate()),sunday:new Date(sunday.getUTCFullYear(),sunday.getUTCMonth(),sunday.getUTCDate())}}\nfunction weekKeyFromInfo(i){return `${i.year}-W${String(i.week).padStart(2,'0')}`}\nfunction addDays(d,n){const x=new Date(d);x.setDate(x.getDate()+n);return x}\nfunction nextWeekInfo(){return isoWeekInfo(addDays(now(),7))}\nfunction weekLabel(i){const f=d=>d.toLocaleDateString('es-ES',{day:'2-digit',month:'short'});return `${f(i.monday)} \u2013 ${f(i.sunday)} \u00b7 S${i.week}`}\nfunction goalDefaultWeek(){const d=now(),day=d.getDay(),hour=d.getHours();return (day===0||day===6||(day===5&&hour>=15))?nextWeekInfo():isoWeekInfo(d)}\nfunction weeklyGoals(){return state().weeklyGoals||{}}\nfunction savedGoal(key){return weeklyGoals()[key]||null}\nfunction setWeeklyGoal(key,wins){const s=state();s.weeklyGoals=s.weeklyGoals||{};s.weeklyGoals[key]={wins:Number(wins)||0,updatedAt:new Date().toISOString()};saveState(s)}\nfunction allInteractions(){const leads=state().leads||{};let out=[];Object.entries(leads).forEach(([leadId,ls])=>(ls.interactions||[]).forEach(i=>out.push({...i,leadId})));return out}\nfunction historicalModel(){const ints=allInteractions();const cold=ints.filter(i=>i.type==='cold').length,follow=ints.filter(i=>i.type==='followup').length,video=ints.filter(i=>i.type==='video').length,proposal=ints.filter(i=>i.type==='proposal').length,win=ints.filter(i=>i.type==='win').length;const imported=roleData(),seedWins=imported.filter(x=>x.status==='Ganado').length,seedTotal=imported.length,seedRate=seedTotal?seedWins\/seedTotal:0;let confidence='learning';if(win>=5&&cold>=50)confidence='high';else if(win>=2&&cold>=20)confidence='mid';return {cold,follow,video,proposal,win,seedWins,seedTotal,seedRate,confidence,reliable:win>=2&&cold>=20}}\nfunction interactionsForWeek(info){const start=info.monday.getTime(),end=addDays(info.sunday,1).getTime();return allInteractions().filter(i=>{const t=new Date(i.at).getTime();return t>=start&&t<end})}\nfunction weekActuals(info){const ints=interactionsForWeek(info);return {cold:ints.filter(i=>i.type==='cold').length,follow:ints.filter(i=>i.type==='followup').length,video:ints.filter(i=>i.type==='video').length,proposal:ints.filter(i=>i.type==='proposal').length,win:ints.filter(i=>i.type==='win').length,touched:new Set(ints.map(i=>i.leadId)).size}}\nfunction planForGoal(wins){const m=historicalModel(),goal=Math.max(0,Number(wins)||0);if(!goal)return {mode:'none',goal,cold:0,follow:0,video:0,proposal:0,opps:0};if(m.reliable){return {mode:'historical',goal,cold:Math.ceil(goal*m.cold\/m.win),follow:Math.ceil(goal*m.follow\/m.win),video:Math.ceil(goal*m.video\/m.win),proposal:Math.ceil(goal*m.proposal\/m.win),opps:0}}const opps=m.seedRate?Math.ceil(goal\/m.seedRate):0;return {mode:'learning',goal,cold:null,follow:null,video:null,proposal:null,opps}}\nfunction currentGoalSelection(){const sel=document.getElementById('goalWeek'),info=sel&&sel.value?JSON.parse(sel.selectedOptions[0].dataset.info):goalDefaultWeek();const key=weekKeyFromInfo(info),g=savedGoal(key);return {info,key,wins:g?g.wins:Number(document.getElementById('goalWins')?.value||0)}}\nfunction populateGoalWeeks(){const sel=document.getElementById('goalWeek');if(!sel)return;const current=isoWeekInfo(now()),next=nextWeekInfo(),def=goalDefaultWeek(),items=[current,next].filter((x,i,a)=>a.findIndex(y=>weekKeyFromInfo(y)===weekKeyFromInfo(x))===i);sel.innerHTML=items.map(i=>`<option value=\"${weekKeyFromInfo(i)}\" data-info='${JSON.stringify({year:i.year,week:i.week,monday:i.monday.toISOString(),sunday:i.sunday.toISOString()})}' ${weekKeyFromInfo(i)===weekKeyFromInfo(def)?'selected':''}>${weekLabel(i)}<\/option>`).join('');syncGoalInput()}\nfunction selectedWeekInfo(){const o=document.getElementById('goalWeek').selectedOptions[0],d=JSON.parse(o.dataset.info);return {year:d.year,week:d.week,monday:new Date(d.monday),sunday:new Date(d.sunday)}}\nfunction syncGoalInput(){const sel=document.getElementById('goalWeek');if(!sel||!sel.value)return;const g=savedGoal(sel.value);document.getElementById('goalWins').value=g?g.wins:2;renderWeekly()}\nfunction weeklyReminder(){const d=now(),day=d.getDay(),hour=d.getHours(),def=goalDefaultWeek(),key=weekKeyFromInfo(def),g=savedGoal(key);if(g)return '';if(day===5&&hour>=15)return 'Es viernes por la tarde: deja definido ahora el objetivo de la pr\u00f3xima semana.';if(day===0)return 'Es domingo: deja preparado el objetivo de la semana que empieza ma\u00f1ana.';if(day>=1&&day<=4)return 'A\u00fan no has fijado un objetivo para esta semana. Def\u00ednelo para que SALES OS pueda calcular tu ritmo.';return ''}\nfunction renderWeekly(){const root=document.getElementById('weekly');if(!root)return;const sel=document.getElementById('goalWeek');if(!sel.options.length){populateGoalWeeks();return}const info=selectedWeekInfo(),key=sel.value,g=savedGoal(key),wins=g?g.wins:Number(document.getElementById('goalWins').value||0),m=historicalModel(),plan=planForGoal(wins),actual=weekActuals(info),conf=document.getElementById('modelConfidence');conf.className='confidence '+(m.confidence==='high'?'high':m.confidence==='mid'?'mid':'');conf.textContent=m.confidence==='high'?'HIST\u00d3RICO FIABLE':m.confidence==='mid'?'HIST\u00d3RICO EN CRECIMIENTO':'MODELO EN APRENDIZAJE';const rem=weeklyReminder();document.getElementById('weeklyPrompt').innerHTML=rem?`<div class=\"weekly-prompt\"><div><b>\ud83c\udfaf Ritual semanal<\/b><br><span>${rem}<\/span><\/div><button class=\"btn gold\" onclick=\"document.getElementById('goalWins').focus()\">Definir ahora<\/button><\/div>`:'';document.getElementById('goalHeadline').textContent=g?`Objetivo: cerrar ${g.wins} ${g.wins===1?'lead':'leads'}`:'Define el objetivo de la semana';document.getElementById('goalSub').textContent=g?`Semana ${weekLabel(info)} \u00b7 SALES OS recalcula el plan cuando cambia tu hist\u00f3rico.`:'El resultado primero. Despu\u00e9s calculamos la actividad que lo hace probable.';document.getElementById('goalSummary').innerHTML=`<div class=\"goal-mini\"><b>${wins||0}<\/b><span>Cierres objetivo<\/span><\/div><div class=\"goal-mini\"><b>${actual.win}<\/b><span>Cierres registrados<\/span><\/div><div class=\"goal-mini\"><b>${wins?Math.round(actual.win\/wins*100):0}%<\/b><span>Objetivo cumplido<\/span><\/div>`;document.getElementById('historicalKpis').innerHTML=[[m.seedTotal,'Oportunidades importadas'],[m.seedWins,'Cierres hist\u00f3ricos'],[(m.seedRate*100).toFixed(1)+'%','Oportunidad \u2192 cierre'],[m.cold,'Llamadas fr\u00edas trazadas'],[m.video,'Videollamadas trazadas'],[m.proposal,'Propuestas trazadas']].map(x=>`<div class=\"kpi-mini\"><b>${x[0]}<\/b><span>${x[1]}<\/span><\/div>`).join('');document.getElementById('learningBox').innerHTML=m.reliable?`<b>\u2705 SALES OS ya est\u00e1 usando tus ratios reales.<\/b><br>Con ${m.win} cierres trazados y ${m.cold+m.follow} llamadas registradas, el plan semanal se calcula desde tu propio hist\u00f3rico. Cuanto m\u00e1s alimentes el CRM, m\u00e1s preciso ser\u00e1.`:`<b>\ud83e\udde0 SALES OS est\u00e1 aprendiendo a Mois\u00e9s.<\/b><br>Holded nos dio ${m.seedTotal} oportunidades y ${m.seedWins} cierres, pero no el hist\u00f3rico de llamadas, seguimientos y videollamadas. No voy a inventar esos ratios. Desde hoy los registramos y, al llegar a una muestra m\u00ednima, el modelo cambiar\u00e1 autom\u00e1ticamente a ratios personales.`;if(plan.mode==='historical'){const per=x=>m.win?Math.round(x\/m.win*10)\/10:0;document.getElementById('planCaption').textContent=`Hist\u00f3rico personal: para 1 cierre haces aprox. ${per(m.cold)} fr\u00edas \u00b7 ${per(m.follow)} seguimientos \u00b7 ${per(m.video)} videollamadas \u00b7 ${per(m.proposal)} propuestas.`;document.getElementById('activityPlan').innerHTML=[['\ud83d\udcde',plan.cold,'Prospecci\u00f3n fr\u00eda'],['\ud83d\udd01',plan.follow,'Seguimientos'],['\ud83c\udfa5',plan.video,'Videollamadas'],['\ud83d\udcc4',plan.proposal,'Propuestas'],['\ud83c\udfc6',plan.goal,'Cierres']].map(x=>`<div class=\"funnel-step\"><span>${x[0]} ${x[2]}<\/span><b>${x[1]}<\/b><small>Necesario aprox. para el objetivo seleccionado.<\/small><\/div>`).join('')}else{document.getElementById('planCaption').textContent='Plan provisional mientras el CRM aprende tus ratios de actividad.';document.getElementById('activityPlan').innerHTML=`<div class=\"funnel-step\"><span>\ud83d\udc65 Oportunidades a trabajar<\/span><b>${plan.opps||'\u2014'}<\/b><small>Estimaci\u00f3n usando \u00fanicamente el ratio hist\u00f3rico oportunidad \u2192 cierre (${(m.seedRate*100).toFixed(1)}%).<\/small><\/div><div class=\"funnel-step\"><span>\ud83d\udcde Prospecci\u00f3n fr\u00eda<\/span><b>Aprendiendo<\/b><small>Se calcular\u00e1 con tus llamadas reales.<\/small><\/div><div class=\"funnel-step\"><span>\ud83d\udd01 Seguimientos<\/span><b>Aprendiendo<\/b><small>Se calcular\u00e1 con tu hist\u00f3rico real.<\/small><\/div><div class=\"funnel-step\"><span>\ud83c\udfa5 Videollamadas<\/span><b>Aprendiendo<\/b><small>Se calcular\u00e1 con reuniones registradas.<\/small><\/div><div class=\"funnel-step\"><span>\ud83c\udfc6 Cierres<\/span><b>${plan.goal}<\/b><small>Objetivo que has definido.<\/small><\/div>`}renderPace(info,plan,actual,m);renderCoach(info,plan,actual,m)}\nfunction renderPace(info,plan,actual,m){const items=plan.mode==='historical'?[['Fr\u00edas',actual.cold,plan.cold],['Seguimientos',actual.follow,plan.follow],['Videollamadas',actual.video,plan.video],['Propuestas',actual.proposal,plan.proposal],['Cierres',actual.win,plan.goal]]:[['Oportunidades tocadas',actual.touched,plan.opps],['Fr\u00edas',actual.cold,null],['Seguimientos',actual.follow,null],['Videollamadas',actual.video,null],['Cierres',actual.win,plan.goal]];document.getElementById('paceGrid').innerHTML=items.map(([n,a,t])=>{const pct=t?Math.min(100,Math.round(a\/t*100)):0;return `<div class=\"pace-item\"><div class=\"pace-top\"><b>${a}${t!==null?' \/ '+t:''}<\/b><span>${n}<\/span><\/div><div class=\"pacebar\"><i style=\"width:${pct}%\"><\/i><\/div><\/div>`}).join('')}\nfunction renderCoach(info,plan,actual,m){let msg;if(!plan.goal)msg='Define cu\u00e1ntos cierres quieres conseguir y convertir\u00e9 ese resultado en un plan de actividad.';else if(!m.reliable)msg=`Tu hist\u00f3rico de Holded muestra ${m.seedWins} cierres sobre ${m.seedTotal} oportunidades (${(m.seedRate*100).toFixed(1)}%). Para ${plan.goal} cierres, la referencia provisional es trabajar unas ${plan.opps} oportunidades. Todav\u00eda no te dir\u00e9 \u201chaz X llamadas\u201d porque no tenemos ese hist\u00f3rico: desde hoy lo estoy aprendiendo autom\u00e1ticamente.`;else{const rows=[['prospecci\u00f3n fr\u00eda',actual.cold,plan.cold],['seguimientos',actual.follow,plan.follow],['videollamadas',actual.video,plan.video],['propuestas',actual.proposal,plan.proposal]].filter(x=>x[2]>0).map(x=>({...x,p:x[1]\/x[2]})).sort((a,b)=>a.p-b.p);const bott=rows[0];msg=bott?`Para cerrar ${plan.goal}, tu hist\u00f3rico recomienda aproximadamente ${plan.cold} fr\u00edas, ${plan.follow} seguimientos, ${plan.video} videollamadas y ${plan.proposal} propuestas. Tu cuello de botella ahora es ${bott[0]}: llevas ${bott[1]} de ${bott[2]}. Prioriza esa palanca antes de a\u00f1adir ruido al pipeline.`:`El objetivo est\u00e1 definido. Sigue alimentando la actividad para que pueda detectar el siguiente cuello de botella.`}document.getElementById('coachMessage').innerHTML=`<div class=\"eyebrow\">COACH IA<\/div><b>Lectura de la semana<\/b><p>${msg}<\/p>`}\nconst quotes=[['El \u00e9xito son unas pocas disciplinas sencillas practicadas cada d\u00eda.','Jim Rohn'],['Nunca bajes tu objetivo. Aumenta tus acciones.','Grant Cardone'],['El camino al \u00e9xito es tomar una acci\u00f3n masiva y decidida.','Tony Robbins'],['El seguimiento que no haces hoy es una oportunidad que otro puede cerrar ma\u00f1ana.','REALIUXE SALES']];\nfunction crmHealth(){const d=openDeals();if(!d.length)return 100;let pts=0;d.forEach(x=>{const ls=leadState(x.id);pts+=(ls.note?1:0)+(ls.nextDate?1:0)+(effectiveStage(x)&&!['Lead Magnet'].includes(effectiveStage(x))?1:0)});return Math.round(pts\/(d.length*3)*100)}\nfunction renderMission(){const a=activity(),target=15,pct=Math.min(100,Math.round(a.coldCalls\/target*100));document.getElementById('mission').innerHTML=`<div class=\"mission\"><div class=\"mission-top\"><div><h3>${role==='moises'?'Tu misi\u00f3n de hoy':'Pulso comercial'}<\/h3><p>${role==='moises'?'15 llamadas fr\u00edas objetivo \u00b7 seguimientos aparte \u00b7 cada contacto con siguiente acci\u00f3n':'Estado operativo de la actividad comercial'}<\/p><\/div><div class=\"ring\" style=\"--pct:${pct}%\"><strong>${pct}%<\/strong><\/div><\/div><div class=\"mission-stats\"><div class=\"mission-stat\"><b>${a.coldCalls}<\/b><span>Prospecci\u00f3n fr\u00eda<\/span><\/div><div class=\"mission-stat\"><b>${a.followUpCalls}<\/b><span>Seguimientos<\/span><\/div><div class=\"mission-stat\"><b>${a.updates}<\/b><span>Actualizaciones<\/span><\/div><div class=\"mission-stat\"><b>${crmHealth()}%<\/b><span>CRM Health<\/span><\/div><\/div><div class=\"progress\"><div style=\"width:${pct}%\"><\/div><\/div><\/div>`}\nfunction renderDashboard(){const d=visibleData(),p=d.filter(x=>effectiveStatus(x)==='Pendiente'),w=d.filter(x=>effectiveStatus(x)==='Ganado'),l=d.filter(x=>effectiveStatus(x)==='Perdido'),val=p.reduce((a,b)=>a+b.value,0),weighted=p.reduce((a,b)=>a+b.value*Math.min(score(b),110)\/110,0);document.getElementById('heroEyebrow').textContent=role==='moises'?'VILLAS RIVERO \u00b7 SALES COMMAND CENTER':'REALIUXE \u00b7 CONTROL COMERCIAL';const h=now().getHours(),saludo=h<13?'Buenos d\u00edas':h<20?'Buenas tardes':'Buenas noches';document.getElementById('heroTitle').textContent=role==='moises'?`${saludo}, Mois\u00e9s. \ud83d\udc4a`:`${saludo}, H\u00e9ctor.`;document.getElementById('heroText').textContent=role==='moises'?'Tu trabajo de hoy: llamar, avanzar y dejar cada oportunidad perfectamente alimentada.':'Todo el pipeline comercial de REALIUXE, en una sola vista.';const q=quotes[(p.length+now().getDate())%quotes.length];document.getElementById('quoteText').textContent='\u201c'+q[0]+'\u201d';document.getElementById('quoteAuthor').textContent=q[1];document.getElementById('metrics').innerHTML=[['Oportunidades abiertas',p.length,'pendientes'],['Pipeline abierto',money(val),'valor nominal'],['Pipeline priorizado',money(weighted),'estimaci\u00f3n operativa'],['CRM Health',crmHealth()+'%',`${activity().coldCalls} fr\u00edas \u00b7 ${activity().followUpCalls} seguimientos hoy`]].map(x=>`<div class=\"metric\"><div class=\"label\">${x[0]}<\/div><strong>${x[1]}<\/strong><small>${x[2]}<\/small><\/div>`).join('');const top=[...p].sort((a,b)=>score(b)-score(a)).slice(0,7);document.getElementById('priorities').innerHTML=top.map(x=>`<div class=\"priority\" onclick=\"openLead('${x.id}')\"><div class=\"score\">${score(x)}<\/div><div><b>${x.name}<\/b><p>${rec(x)}<\/p><\/div><span class=\"tag ${score(x)>95?'hot':''}\">${temp(x)}<\/span><\/div>`).join('')||'<div class=\"empty\">Sin prioridades.<\/div>';renderMission();renderDivisionList('divisionList')}\nfunction renderDivisionList(id){const d=roleData().filter(x=>effectiveStatus(x)==='Pendiente'),vals=Object.fromEntries(ALL_DIVISIONS.map(x=>[x,0])),counts=Object.fromEntries(ALL_DIVISIONS.map(x=>[x,0]));d.forEach(x=>{vals[x.division]=(vals[x.division]||0)+x.value;counts[x.division]=(counts[x.division]||0)+1});const max=Math.max(...Object.values(vals),1);let divs=ALL_DIVISIONS;document.getElementById(id).innerHTML=divs.map(x=>`<div class=\"division-row\"><b>${DIV_LABEL[x]}<\/b><div class=\"track\"><div class=\"fill\" style=\"width:${vals[x]?Math.max(5,vals[x]\/max*100):0}%\"><\/div><\/div><span>${counts[x]?`${counts[x]} oportunidades \u00b7 ${money(vals[x])}`:'Sin oportunidades'}<\/span><\/div>`).join('')}\nfunction opts(el,includeAll=true){let ds=role==='moises'?['Villas Rivero']:ALL_DIVISIONS;el.innerHTML=(includeAll?'<option value=\"\">Todas las divisiones<\/option>':'')+ds.map(x=>`<option value=\"${x}\">${DIV_LABEL[x]}<\/option>`).join('')}\nfunction renderPipeline(){const s=document.getElementById('pipelineDivision');if(!s.options.length)opts(s);let d=openDeals();if(s.value)d=d.filter(x=>x.division===s.value);const stages=['Lead Magnet','Llamada \/ WhatsApp','Mail','Seguimiento','Visita \/ Videollamada','Contacto establecido','Propuesta realizada'].filter(st=>d.some(x=>effectiveStage(x)===st));document.getElementById('pipelineCaption').textContent=`${d.length} abiertas \u00b7 ${money(d.reduce((a,b)=>a+b.value,0))}`;document.getElementById('pipelineBoard').innerHTML=stages.map(st=>{const list=d.filter(x=>effectiveStage(x)===st).sort((a,b)=>score(b)-score(a));return `<div class=\"column\"><div class=\"colhead\"><b>${STAGE_LABEL[st]||st}<\/b><span class=\"count\">${list.length}<\/span><\/div>${list.map(x=>`<div class=\"deal\" onclick=\"openLead('${x.id}')\"><h4>${x.name}<\/h4><div class=\"deal-meta\"><span>${DIV_LABEL[x.division]}<\/span><span>${x.potential}%<\/span><\/div><div class=\"deal-money\">${money(x.value)}<\/div><div class=\"deal-foot\"><div class=\"avatar\">${x.assignee.includes('Mois\u00e9s')?'MS':'H'}<\/div><span class=\"tag\">${temp(x)}<\/span><\/div><\/div>`).join('')}<\/div>`}).join('')||'<div class=\"empty\">No hay oportunidades.<\/div>'}\nfunction renderTable(){const s=document.getElementById('tableDivision');if(!s.options.length)opts(s);let d=visibleData();if(s.value)d=d.filter(x=>x.division===s.value);const q=document.getElementById('search').value.toLowerCase().trim();if(q)d=d.filter(x=>[x.name,x.company,x.person,effectiveStage(x)].join(' ').toLowerCase().includes(q));document.getElementById('tableCaption').textContent=`${d.length} oportunidades visibles para este usuario.`;document.getElementById('tableBody').innerHTML=d.map(x=>{const ls=leadState(x.id);return `<tr onclick=\"openLead('${x.id}')\"><td><b>${x.name}<\/b>${x.phone||x.email?`<div class=\"source-badge\">${[x.phone,x.email].filter(Boolean).join(' \u00b7 ')}<\/div>`:''}<\/td><td><span class=\"tag ${x.division==='Villas Rivero'?'good':'gold'}\">${DIV_LABEL[x.division]}<\/span><\/td><td>${STAGE_LABEL[effectiveStage(x)]||effectiveStage(x)}<\/td><td>${x.assignee}<\/td><td><b>${money(x.value)}<\/b><\/td><td>${ls.nextDate?(ls.nextAction||'Seguimiento')+' \u00b7 '+ls.nextDate:'\u2014'}<\/td><td><span class=\"status ${effectiveStatus(x)}\">${effectiveStatus(x)}<\/span><\/td><\/tr>`}).join('')}\nfunction renderDay(){const a=activity(),d=[...openDeals()].sort((a,b)=>score(b)-score(a)),target=15;document.getElementById('dayStats').style.gridTemplateColumns='repeat(6,1fr)';document.getElementById('dayStats').innerHTML=[['Prospecci\u00f3n fr\u00eda',a.coldCalls,`${Math.max(0,target-a.coldCalls)} para objetivo`],['Seguimientos',a.followUpCalls,'actividad de cartera'],['Videollamadas',a.videoMeetings,'reuniones de hoy'],['Propuestas',a.proposals,'enviadas hoy'],['Cierres',a.wins,'ganados hoy'],['CRM Health',crmHealth()+'%','objetivo: 100%']].map(x=>`<div class=\"day-card\"><div class=\"num\">${x[1]}<\/div><span>${x[0]}<\/span><p style=\"font-size:10px;color:var(--muted)\">${x[2]}<\/p><\/div>`).join('');document.getElementById('focusList').innerHTML=d.slice(0,10).map((x,i)=>`<div class=\"focus-item\"><div><b>${i+1}. ${x.name}<\/b><p>${rec(x)} \u00b7 ${money(x.value)}<\/p><\/div><button class=\"btn soft\" onclick=\"openLead('${x.id}')\">Abrir<\/button><\/div>`).join('')||'<div class=\"empty\">Sin oportunidades pendientes.<\/div>'}\nfunction renderFollowups(){let d=openDeals().map(x=>({x,ls:leadState(x.id)}));d.sort((a,b)=>(a.ls.nextDate||'9999').localeCompare(b.ls.nextDate||'9999')||score(b.x)-score(a.x));document.getElementById('followupList').innerHTML=d.slice(0,30).map(({x,ls})=>`<div class=\"priority\" onclick=\"openLead('${x.id}')\"><div class=\"score\">${ls.nextDate?'\u2713':'!'}<\/div><div><b>${x.name}<\/b><p>${ls.nextDate?`${ls.nextAction||'Seguimiento'} \u00b7 ${ls.nextDate}`:'Sin pr\u00f3xima acci\u00f3n fechada \u00b7 '+rec(x)}<\/p><\/div><span class=\"tag ${ls.nextDate?'good':'hot'}\">${ls.nextDate?'Programado':'Pendiente'}<\/span><\/div>`).join('')}\nfunction renderAI(){const d=[...openDeals()].sort((a,b)=>score(b)-score(a)).slice(0,14);document.getElementById('aiPanel').innerHTML=d.map((x,i)=>`<div class=\"ai-card\" onclick=\"openLead('${x.id}')\"><b>${i+1}. ${x.name} \u00b7 ${score(x)} pts<\/b><p>${rec(x)} <strong>Valor:<\/strong> ${money(x.value)} \u00b7 <strong>Temperatura:<\/strong> ${temp(x)}.<\/p><\/div>`).join('')}\nfunction renderDivisions(){renderDivisionList('divisionCards')}\n\nfunction openNewLead(){['newName','newPhone','newEmail','newLocation','newValue','newNote','newNextAction','newNextDate'].forEach(id=>document.getElementById(id).value='');document.getElementById('newOrigin').value='Prospecci\u00f3n propia';document.getElementById('newPotential').value='40';document.getElementById('newLeadBack').classList.remove('hidden');setTimeout(()=>document.getElementById('newName').focus(),50)}\nfunction closeNewLead(){document.getElementById('newLeadBack').classList.add('hidden')}\nfunction makeLeadId(prefix='manual'){return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}\nfunction createNewLead(registerCold=false){const name=document.getElementById('newName').value.trim();if(!name){showToast('\u26a0\ufe0f Escribe al menos el nombre del lead.');return}const lead={id:makeLeadId('manual'),name,division:'Villas Rivero',sourcePipeline:'Vacacional',stage:'Lead Magnet',company:'',person:name,assignee:'Mois\u00e9s Sanz Mart\u00edn',potential:Number(document.getElementById('newPotential').value)||40,value:Number(document.getElementById('newValue').value)||0,status:'Pendiente',created:new Date().toISOString(),closed:null,tags:'',origin:document.getElementById('newOrigin').value||'Manual',phone:document.getElementById('newPhone').value.trim(),email:document.getElementById('newEmail').value.trim(),location:document.getElementById('newLocation').value.trim()};const s=state();s.customLeads=[...(s.customLeads||[]),lead];saveState(s);const payload={note:document.getElementById('newNote').value.trim(),nextAction:document.getElementById('newNextAction').value.trim(),nextDate:document.getElementById('newNextDate').value,tempValue:'Normal',requestedStage:'Lead Magnet'};if(registerCold)recordInteraction(lead,'cold',payload);else if(payload.note||payload.nextAction||payload.nextDate)recordInteraction(lead,'update',payload);closeNewLead();renderAll();showToast(registerCold?'\ud83d\udcde Lead creado y prospecci\u00f3n fr\u00eda registrada.':'\u2705 Nuevo lead a\u00f1adido al CRM.');if(!registerCold)setTimeout(()=>openLead(lead.id),80)}\nfunction refreshQuickLeadSelect(){const el=document.getElementById('quickLeadSelect');if(!el)return;const d=[...roleData()].filter(x=>effectiveStatus(x)==='Pendiente').sort((a,b)=>a.name.localeCompare(b.name,'es'));el.innerHTML=d.map(x=>`<option value=\"${x.id}\">${x.name} \u00b7 ${STAGE_LABEL[effectiveStage(x)]||effectiveStage(x)}<\/option>`).join('')}\nfunction openQuickCall(){refreshQuickLeadSelect();if(!document.getElementById('quickLeadSelect').options.length){showToast('Primero a\u00f1ade un lead.');openNewLead();return}document.getElementById('quickCallType').value='cold';document.getElementById('quickTemp').value='Normal';document.getElementById('quickNote').value='';document.getElementById('quickNextAction').value='';document.getElementById('quickNextDate').value='';document.getElementById('quickCallBack').classList.remove('hidden')}\nfunction closeQuickCall(){document.getElementById('quickCallBack').classList.add('hidden')}\nfunction saveQuickCall(){const id=document.getElementById('quickLeadSelect').value,lead=roleData().find(x=>x.id===id);if(!lead){showToast('\u26a0\ufe0f Selecciona un lead.');return}const type=document.getElementById('quickCallType').value;recordInteraction(lead,type,{note:document.getElementById('quickNote').value.trim(),nextAction:document.getElementById('quickNextAction').value.trim(),nextDate:document.getElementById('quickNextDate').value,tempValue:document.getElementById('quickTemp').value});closeQuickCall();renderAll();showToast(type==='cold'?'\ud83d\udcde Prospecci\u00f3n fr\u00eda registrada.':'\ud83d\udd01 Seguimiento registrado.')}\n\nlet importCtx={headers:[],rows:[],sheet:'',filename:''};\nconst MAP_DEFS=[['name','Nombre *',['nombre','oportunidad','lead','contacto','propietario','titular','name']],['phone','Tel\u00e9fono',['telefono','tel\u00e9fono','movil','m\u00f3vil','phone','whatsapp']],['email','Email',['email','correo','e-mail','mail']],['company','Empresa',['empresa','company','organizacion','organizaci\u00f3n']],['location','Localidad \/ zona',['localidad','municipio','zona','ubicacion','ubicaci\u00f3n','ciudad','city']],['value','Valor',['valor','importe','value','pipeline','facturacion','facturaci\u00f3n']],['potential','Potencial %',['potencial','probabilidad','potential','probability']],['stage','Etapa',['etapa','fase','stage','estado pipeline']],['status','Estado',['estado','status','resultado']],['note','Notas',['nota','notas','observaciones','comentarios','contexto']],['nextAction','Pr\u00f3xima acci\u00f3n',['proxima accion','pr\u00f3xima acci\u00f3n','siguiente accion','siguiente acci\u00f3n']],['nextDate','Fecha seguimiento',['fecha seguimiento','proxima fecha','pr\u00f3xima fecha','next date']]];\nfunction norm(v){return String(v??'').trim().toLowerCase().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g,'').replace(\/[^a-z0-9]+\/g,' ').trim()}\nfunction autoCol(aliases){const h=importCtx.headers.map(norm);for(const a of aliases){const na=norm(a),idx=h.findIndex(x=>x===na||x.includes(na));if(idx>=0)return idx}return -1}\nfunction openImport(){importCtx={headers:[],rows:[],sheet:'',filename:''};document.getElementById('importFile').value='';document.getElementById('importInfo').innerHTML='';document.getElementById('mappingArea').classList.add('hidden');document.getElementById('mappingFields').innerHTML='';document.getElementById('importPreview').innerHTML='';document.getElementById('importBack').classList.remove('hidden')}\nfunction closeImport(){document.getElementById('importBack').classList.add('hidden')}\nfunction parseCSV(text){const first=(text.split(\/\\r?\\n\/,1)[0]||''),counts={';':(first.match(\/;\/g)||[]).length,',':(first.match(\/,\/g)||[]).length,'\\t':(first.match(\/\\t\/g)||[]).length};const delim=Object.entries(counts).sort((a,b)=>b[1]-a[1])[0][0];let rows=[],row=[],cell='',q=false;for(let i=0;i<text.length;i++){const c=text[i],n=text[i+1];if(c==='\"'){if(q&&n==='\"'){cell+='\"';i++}else q=!q}else if(c===delim&&!q){row.push(cell);cell=''}else if((c==='\\n'||c==='\\r')&&!q){if(c==='\\r'&&n==='\\n')i++;row.push(cell);if(row.some(v=>String(v).trim()!==''))rows.push(row);row=[];cell=''}else cell+=c}row.push(cell);if(row.some(v=>String(v).trim()!==''))rows.push(row);return rows}\nasync function handleImportFile(file){if(!file)return;try{let matrix=[],sheet='';if(file.name.toLowerCase().endsWith('.csv')){matrix=parseCSV(await file.text());sheet='CSV'}else{if(typeof XLSX==='undefined'){document.getElementById('importInfo').innerHTML='<span class=\"tag hot\">No se pudo cargar el lector Excel<\/span>';showToast('\u26a0\ufe0f Para .xlsx necesitas conexi\u00f3n a internet al abrir este HTML. Tambi\u00e9n puedes guardar el archivo como CSV.');return}const wb=XLSX.read(await file.arrayBuffer(),{type:'array',cellDates:true});sheet=wb.SheetNames.find(n=>{const r=XLSX.utils.sheet_to_json(wb.Sheets[n],{header:1,defval:''});return r.length>1})||wb.SheetNames[0];matrix=XLSX.utils.sheet_to_json(wb.Sheets[sheet],{header:1,defval:'',raw:false})}if(matrix.length<2)throw new Error('No hay filas suficientes');const width=Math.max(...matrix.map(r=>r.length));const headers=Array.from({length:width},(_,i)=>String(matrix[0][i]??'').trim()||`Columna ${i+1}`);const rows=matrix.slice(1).filter(r=>r.some(v=>String(v??'').trim()!==''));importCtx={headers,rows,sheet,filename:file.name};document.getElementById('importInfo').innerHTML=`<span class=\"tag good\">${rows.length} filas detectadas<\/span><span class=\"tag\">Hoja: ${sheet}<\/span><span class=\"tag\">${file.name}<\/span>`;renderMapping()}catch(e){console.error(e);showToast('\u26a0\ufe0f No he podido leer ese archivo. Prueba otro Excel o CSV.')}}\nfunction renderMapping(){const wrap=document.getElementById('mappingFields');wrap.innerHTML=MAP_DEFS.map(([key,label,aliases])=>{const auto=autoCol(aliases);const opts=['<option value=\"-1\">\u2014 No importar \u2014<\/option>',...importCtx.headers.map((h,i)=>`<option value=\"${i}\" ${i===auto?'selected':''}>${h}<\/option>`)].join('');return `<div class=\"mapping-item\"><label>${label}<\/label><select id=\"map_${key}\" onchange=\"renderImportPreview()\">${opts}<\/select><\/div>`}).join('');document.getElementById('mappingArea').classList.remove('hidden');renderImportPreview()}\nfunction mapIndex(key){return Number(document.getElementById('map_'+key)?.value??-1)}\nfunction cell(row,key){const i=mapIndex(key);return i>=0?String(row[i]??'').trim():''}\nfunction parseNum(v){let x=String(v??'').replace(\/[^0-9,.-]\/g,'').trim();if(!x)return 0;if(x.includes(',')&&x.includes('.')){if(x.lastIndexOf(',')>x.lastIndexOf('.'))x=x.replace(\/\\.\/g,'').replace(',','.');else x=x.replace(\/,\/g,'')}else if(x.includes(','))x=x.replace(',','.');return Number(x)||0}\nfunction normalizeStage(v){const n=norm(v);if(!n)return 'Lead Magnet';if(n.includes('ganad')||n==='won')return 'Ganado';if(n.includes('perdid')||n==='lost')return 'Perdido';if(n.includes('propuesta'))return 'Propuesta realizada';if(n.includes('video')||n.includes('visita')||n.includes('reunion'))return 'Visita \/ Videollamada';if(n.includes('seguim')||n.includes('follow'))return 'Seguimiento';if(n.includes('mail')||n.includes('email'))return 'Mail';if(n.includes('contacto establecido')||n==='contactado')return 'Contacto establecido';if(n.includes('llamada')||n.includes('whatsapp')||n.includes('prospeccion'))return 'Llamada \/ WhatsApp';return 'Lead Magnet'}\nfunction normalizeStatus(v,stage){const n=norm(v);if(stage==='Ganado'||n.includes('ganad')||n==='won')return 'Ganado';if(stage==='Perdido'||n.includes('perdid')||n==='lost')return 'Perdido';return 'Pendiente'}\nfunction normalizeDate(v){if(!v)return '';const d=new Date(v);if(!isNaN(d))return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`;const m=String(v).match(\/(\\d{1,2})[\\\/-](\\d{1,2})[\\\/-](\\d{4})\/);return m?`${m[3]}-${m[2].padStart(2,'0')}-${m[1].padStart(2,'0')}`:''}\nfunction renderImportPreview(){if(!importCtx.rows.length)return;const keys=['name','phone','email','location','value','stage'];const labels={name:'Nombre',phone:'Tel\u00e9fono',email:'Email',location:'Zona',value:'Valor',stage:'Etapa'};const head=keys.filter(k=>mapIndex(k)>=0);if(!head.includes('name'))head.unshift('name');document.getElementById('importPreview').innerHTML=`<table><thead><tr>${head.map(k=>`<th>${labels[k]}<\/th>`).join('')}<\/tr><\/thead><tbody>${importCtx.rows.slice(0,6).map(r=>`<tr>${head.map(k=>`<td>${k==='stage'?(STAGE_LABEL[normalizeStage(cell(r,k))]||normalizeStage(cell(r,k))):cell(r,k)}<\/td>`).join('')}<\/tr>`).join('')}<\/tbody><\/table>`}\nfunction duplicateKey(l){const p=String(l.phone||'').replace(\/\\D\/g,''),e=norm(l.email),n=norm(l.name);if(p.length>=7)return 'p:'+p;if(e)return 'e:'+e;return 'n:'+n}\nfunction confirmImport(){if(mapIndex('name')<0){showToast('\u26a0\ufe0f Selecciona qu\u00e9 columna contiene el nombre.');return}const s=state();s.customLeads=s.customLeads||[];s.leads=s.leads||{};const keys=new Set(combinedData().map(duplicateKey));let added=0,dups=0,skipped=0;for(const r of importCtx.rows){const name=cell(r,'name');if(!name){skipped++;continue}const stage=normalizeStage(cell(r,'stage')),lead={id:makeLeadId('excel'),name,division:'Villas Rivero',sourcePipeline:'Vacacional',stage,company:cell(r,'company'),person:name,assignee:'Mois\u00e9s Sanz Mart\u00edn',potential:Math.max(0,Math.min(100,parseNum(cell(r,'potential'))||40)),value:Math.max(0,parseNum(cell(r,'value'))),status:normalizeStatus(cell(r,'status'),stage),created:new Date().toISOString(),closed:null,tags:'',origin:`Excel \u00b7 ${importCtx.filename}`,phone:cell(r,'phone'),email:cell(r,'email'),location:cell(r,'location')};const key=duplicateKey(lead);if(keys.has(key)){dups++;continue}keys.add(key);s.customLeads.push(lead);const note=cell(r,'note'),nextAction=cell(r,'nextAction'),nextDate=normalizeDate(cell(r,'nextDate'));if(note||nextAction||nextDate||stage!=='Lead Magnet')s.leads[lead.id]={note,nextAction,nextDate,stage,temp:'Normal',interactions:[],updatedAt:new Date().toISOString()};added++}saveState(s);closeImport();document.getElementById('pipelineDivision').innerHTML='';document.getElementById('tableDivision').innerHTML='';renderAll();showToast(`\u2705 ${added} leads importados \u00b7 ${dups} duplicados omitidos${skipped?` \u00b7 ${skipped} filas sin nombre`:''}.`)}\n\nfunction renderAll(){setSkin();renderDashboard();renderDay();renderWeekly();renderPipeline();renderTable();renderFollowups();renderAI();renderDivisions();refreshQuickLeadSelect()}\nfunction setRole(r){if(LOCKED_ROLE)return;role=r;activeDivision=r==='moises'?'Villas Rivero':'';document.getElementById('roleHector').classList.toggle('active',r==='hector');document.getElementById('roleMoises').classList.toggle('active',r==='moises');document.getElementById('pipelineDivision').innerHTML='';document.getElementById('tableDivision').innerHTML='';renderAll()}\nfunction switchLeadTab(tab){const map={summary:'leadPaneSummary',activity:'leadPaneActivity',coach:'leadPaneCoach',docs:'leadPaneDocs'};document.querySelectorAll('.lead-tab').forEach(b=>b.classList.toggle('active',b.dataset.leadTab===tab));document.querySelectorAll('.lead-pane').forEach(p=>p.classList.remove('active'));const el=document.getElementById(map[tab]||map.summary);if(el)el.classList.add('active')}\nfunction openLead(id){const x=roleData().find(v=>v.id===id);if(!x)return;currentLead=x;const ls=leadState(id);document.getElementById('modalTitle').textContent=x.name;const ePhone=leadState(id).phone||x.phone||'',eEmail=leadState(id).email||x.email||'';document.getElementById('modalMeta').innerHTML=`<span class=\"tag ${x.division==='Villas Rivero'?'good':'gold'}\">${DIV_LABEL[x.division]}<\/span> <span class=\"tag\">${money(x.value)}<\/span> <span class=\"tag\">${x.assignee}<\/span>${x.origin?` <span class=\"tag\">${x.origin}<\/span>`:''}<div class=\"lead-contact\">${ePhone?`<a class=\"contact-chip\" href=\"tel:${ePhone}\">\ud83d\udcde ${ePhone}<\/a>`:''}${eEmail?`<a class=\"contact-chip\" href=\"mailto:${eEmail}\">\u2709\ufe0f ${eEmail}<\/a>`:''}${x.location?`<span class=\"contact-chip\">\ud83d\udccd ${x.location}<\/span>`:''}<\/div>`;const st=document.getElementById('editStage');const stages=['Lead Magnet','Llamada \/ WhatsApp','Mail','Seguimiento','Visita \/ Videollamada','Contacto establecido','Propuesta realizada','Ganado','Perdido'];st.innerHTML=stages.map(s=>`<option value=\"${s}\" ${s===effectiveStage(x)?'selected':''}>${STAGE_LABEL[s]||s}<\/option>`).join('');document.getElementById('editTemp').value=ls.temp||temp(x);document.getElementById('editPhone').value=ls.phone||x.phone||'';document.getElementById('editEmail').value=ls.email||x.email||'';document.getElementById('editNote').value='';document.getElementById('editNextAction').value=ls.nextAction||'';document.getElementById('editNextDate').value=ls.nextDate||'';renderLeadActions(x);const latestCoach=(ls.coachSessions||[]).slice(-1)[0];lastCoachResult=latestCoach?.result||null;document.getElementById('coachTranscript').value=latestCoach?.transcript||'';document.getElementById('coachOutput').innerHTML=lastCoachResult?coachHTML(lastCoachResult):'';document.getElementById('coachFile').value='';renderHistory(ls.interactions||[]);document.getElementById('coachNudge')?.classList.add('hidden');switchLeadTab('summary');document.getElementById('modalBack').classList.remove('hidden')}\nfunction renderHistory(items){const el=document.getElementById('activityHistory');if(!items.length){el.innerHTML='<div class=\"empty\" style=\"padding:12px 0\">Todav\u00eda no hay actividad registrada en este CRM.<\/div>';return}el.innerHTML=[...items].reverse().slice(0,8).map(i=>{const type=i.type==='cold'?'\ud83d\udcde Prospecci\u00f3n fr\u00eda':i.type==='followup'?'\ud83d\udd01 Seguimiento':i.type==='video'?'\ud83c\udfa5 Videollamada':i.type==='proposal'?'\ud83d\udcc4 Propuesta':i.type==='win'?'\ud83c\udfc6 Ganado':i.type==='coach'?'\ud83e\udde0 Call Coach':'\u270f\ufe0f Actualizaci\u00f3n';const dt=new Date(i.at);return `<div class=\"history-item\"><span class=\"history-type\">${type}<\/span><p>${i.note||'Sin nota'}${i.nextAction?`<br><b>Siguiente:<\/b> ${i.nextAction}${i.nextDate?' \u00b7 '+i.nextDate:''}`:''}<\/p><time>${dt.toLocaleDateString('es-ES')} ${dt.toLocaleTimeString('es-ES',{hour:'2-digit',minute:'2-digit'})}<\/time><\/div>`}).join('')}\nfunction closeModal(){document.getElementById('modalBack').classList.add('hidden');currentLead=null}\nfunction resolvedStage(lead,type,requested){let stage=requested||effectiveStage(lead);if(type==='cold'&&stage==='Lead Magnet')stage='Llamada \/ WhatsApp';if(type==='followup'&&['Lead Magnet','Llamada \/ WhatsApp','Mail'].includes(stage))stage='Seguimiento';if(type==='video')stage='Visita \/ Videollamada';if(type==='proposal')stage='Propuesta realizada';if(type==='win')stage='Ganado';return stage}\nfunction recordInteraction(lead,type,{note='',nextAction='',nextDate='',tempValue='',requestedStage='',phone='',email=''}={}){if(!lead)return;const s=state();s.leads=s.leads||{};const old=s.leads[lead.id]||{};const stage=resolvedStage(lead,type,requestedStage||old.stage||lead.stage);const interactions=[...(old.interactions||[])];interactions.push({type,note,nextAction,nextDate,stage,at:new Date().toISOString()});s.leads[lead.id]={...old,phone:phone||old.phone||lead.phone||'',email:email||old.email||lead.email||'',temp:tempValue||old.temp||temp(lead),note:note||old.note||'',nextAction:type==='win'?'':nextAction,nextDate:type==='win'?'':nextDate,stage,interactions,updatedAt:new Date().toISOString()};s.activity=s.activity||{};s.activity[todayKey()]=s.activity[todayKey()]||{};const a=s.activity[todayKey()];a.coldCalls=a.coldCalls||0;a.followUpCalls=a.followUpCalls||0;a.videoMeetings=a.videoMeetings||0;a.proposals=a.proposals||0;a.wins=a.wins||0;a.updates=(a.updates||0)+1;if(type==='cold')a.coldCalls+=1;if(type==='followup')a.followUpCalls+=1;if(type==='video')a.videoMeetings+=1;if(type==='proposal')a.proposals+=1;if(type==='win')a.wins+=1;saveState(s)}\nfunction persist(type='update'){if(!currentLead)return;const id=currentLead.id;recordInteraction(currentLead,type,{note:document.getElementById('editNote').value.trim(),nextAction:document.getElementById('editNextAction').value.trim(),nextDate:document.getElementById('editNextDate').value,tempValue:document.getElementById('editTemp').value,requestedStage:document.getElementById('editStage').value,phone:document.getElementById('editPhone').value.trim(),email:document.getElementById('editEmail').value.trim()});const msg=type==='cold'?'\ud83d\udcde Prospecci\u00f3n fr\u00eda registrada.':type==='followup'?'\ud83d\udd01 Seguimiento registrado.':type==='video'?'\ud83c\udfa5 Videollamada registrada.':type==='proposal'?'\ud83d\udcc4 Propuesta registrada.':type==='win'?'\ud83c\udfc6 \u00a1Oportunidad ganada!':'\u2705 Oportunidad actualizada.';showToast(msg+(type==='win'?'':' Siguiente acci\u00f3n guardada.'));renderAll();if(['cold','followup','video'].includes(type)){openLead(id);switchLeadTab('coach');document.getElementById('coachNudge')?.classList.remove('hidden');setTimeout(()=>document.getElementById('coachTranscript')?.focus(),80)}else{closeModal()}}\nfunction showToast(t){const el=document.getElementById('toast');el.textContent=t;el.classList.remove('hidden');setTimeout(()=>el.classList.add('hidden'),2200)}\n\n\/\/ ---------- Contacto directo, Call Coach y Captura Inteligente ----------\nlet lastCoachResult=null, smartParsed=null, speechRec=null;\nfunction leadPhone(lead){return String(leadState(lead?.id||'').phone||lead?.phone||'').trim()}\nfunction leadEmail(lead){return String(leadState(lead?.id||'').email||lead?.email||'').trim()}\nfunction phoneDigits(phone){let d=String(phone||'').replace(\/\\D\/g,'');if(d.startsWith('00'))d=d.slice(2);if(d.length===9)d='34'+d;return d}\nfunction buildFollowupMessage(lead,coach){const ls=leadState(lead.id),stage=effectiveStage(lead);let base=`Hola ${String(lead.person||lead.name||'').split(\/[\u00b7\\-]\/)[0].trim()}, soy Mois\u00e9s, de Villas Rivero.`;if(coach?.whatsapp)return coach.whatsapp;if(stage==='Propuesta realizada')return `${base} Quer\u00eda retomar la propuesta que comentamos y saber c\u00f3mo la ves. Si te parece, resolvemos cualquier duda y dejamos claro el siguiente paso.`;if(stage==='Visita \/ Videollamada')return `${base} Gracias por el tiempo de la reuni\u00f3n. Quer\u00eda retomar lo que hablamos y avanzar con el siguiente paso. \u00bfTe viene bien que lo veamos?`;if(ls.note)return `${base} Te escribo para retomar lo que comentamos. ${ls.nextAction?'Quer\u00eda coordinar '+ls.nextAction.toLowerCase()+'.':''}`.trim();return `${base} Te escribo para retomar el contacto sobre la gesti\u00f3n de tu vivienda. \u00bfTe viene bien que lo comentemos?`}\nfunction openDirectCall(){if(!currentLead)return;const p=leadPhone(currentLead);if(!p){showToast('\u26a0\ufe0f Este lead no tiene tel\u00e9fono guardado.');return}window.location.href='tel:'+p}\nfunction openWhatsApp(useCoach=false){if(!currentLead)return;const p=phoneDigits(leadPhone(currentLead));if(!p){showToast('\u26a0\ufe0f Este lead no tiene tel\u00e9fono guardado.');return}const msg=buildFollowupMessage(currentLead,useCoach?lastCoachResult:null);window.open(`https:\/\/wa.me\/${p}?text=${encodeURIComponent(msg)}`,'_blank','noopener')}\nfunction renderLeadActions(lead){const el=document.getElementById('leadActions'),p=leadPhone(lead);el.innerHTML=p?`<button id=\"directCallBtn\" class=\"btn call-direct\" type=\"button\">\ud83d\udcde Llamar ahora<\/button><button id=\"directWhatsBtn\" class=\"btn whatsapp\" type=\"button\">\ud83d\udcac WhatsApp<\/button><button id=\"coachWhatsBtn\" class=\"btn smart\" type=\"button\">\u2728 WhatsApp recomendado<\/button>`:`<span class=\"tag hot\">A\u00f1ade un tel\u00e9fono para activar llamada y WhatsApp directos<\/span>`;document.getElementById('directCallBtn')?.addEventListener('click',openDirectCall);document.getElementById('directWhatsBtn')?.addEventListener('click',()=>openWhatsApp(false));document.getElementById('coachWhatsBtn')?.addEventListener('click',()=>openWhatsApp(true))}\nfunction stripTranscript(t){return String(t||'').replace(\/\\s+\/g,' ').trim()}\nfunction addDaysISO(days){const d=new Date();d.setDate(d.getDate()+days);return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`}\nfunction localCoach(transcript,lead){const raw=stripTranscript(transcript),t=norm(raw);const objections=[],signals=[],missing=[],fitSignals=[];const add=(arr,label)=>{if(!arr.includes(label))arr.push(label)};\n  if(\/comision|porcentaje|caro|precio|coste|cuanto cobrais\/.test(t))add(objections,'Comisi\u00f3n \/ precio');\n  if(\/otra gestora|otra empresa|ya tengo gestor|gestora actual|cambiar de gestora\/.test(t))add(objections,'Cambio de gestora');\n  if(\/mujer|marido|pareja|socio|consultarlo|hablarlo con\/.test(t))add(objections,'Decisi\u00f3n compartida');\n  if(\/reservas|booking|airbnb|ocupad|hasta septiembre|hasta octubre|temporada\/.test(t))add(objections,'Reservas \/ transici\u00f3n');\n  if(\/no es el momento|mas adelante|despues del verano|ahora no|sin prisa\/.test(t))add(objections,'Timing');\n  if(\/contrato|permanencia|rescisi|compromiso\/.test(t))add(objections,'Contrato \/ permanencia');\n  if(\/interesad|me interesa|enviame|mandame|videollamada|reunion|visita|propuesta|presupuesto|rentabilidad|cuanto podria\/.test(t))add(signals,'Inter\u00e9s expl\u00edcito');\n  if(\/llamame|hablamos|quedamos|martes|miercoles|jueves|viernes|lunes|semana que viene\/.test(t))add(signals,'Acepta siguiente contacto');\n  if(!\/telefono|llam|whatsapp|email|correo|reunion|videollamada|visita|propuesta\/.test(t))missing.push('No queda claro el siguiente paso');\n  if(raw.length<80)missing.push('Hay poco contexto para una recomendaci\u00f3n s\u00f3lida');\n  if(!\/vivienda|villa|casa|apartamento|propiedad|alojamiento\/.test(t))missing.push('Confirma qu\u00e9 propiedad tiene y qu\u00e9 tipo de activo es');\n  if(!\/gestiona|gestora|airbnb|booking|por su cuenta|actualmente\/.test(t))missing.push('Pregunta c\u00f3mo est\u00e1 gestionando hoy la propiedad');\n  if(!\/objetivo|rentabilidad|ingres|factura|ocupacion|ocupaci\u00f3n|problema|preocupa\/.test(t))missing.push('Aclara objetivo econ\u00f3mico o principal problema que quiere resolver');\n  if(!\/mujer|marido|pareja|socio|decide|decision|decisi\u00f3n|propietario\/.test(t))missing.push('Identifica qui\u00e9n toma la decisi\u00f3n final');\n  if(\/villa|chalet|finca|casa independiente|casa rural\/.test(t))add(fitSignals,'Activo prioritario');\n  if(\/piscina|jardin|jard\u00edn|terraza|vistas\/.test(t))add(fitSignals,'Se\u00f1ales premium');\n  if(\/(?:6|seis)\\s*(?:pax|personas|huespedes|hu\u00e9spedes)\/.test(t))add(fitSignals,'\u2265 6 pax');\n  if(\/(?:3|tres)\\s*(?:dormitorios|habitaciones)\/.test(t))add(fitSignals,'\u2265 3 dormitorios');\n  if(\/turistic|vacacional|playa|costa|sierra|isla\/.test(t))add(fitSignals,'Entorno tur\u00edstico');\n  let qualification='Falta informaci\u00f3n suficiente para validar el encaje del activo con el perfil premium de prospecci\u00f3n.';\n  if(\/piso basico|piso b\u00e1sico|apartamento basico|apartamento b\u00e1sico\/.test(t)&&fitSignals.length<2)qualification='\u26a0\ufe0f Revisar encaje: el proyecto de Mois\u00e9s excluye pisos b\u00e1sicos salvo que exista una raz\u00f3n comercial clara.';\n  else if(fitSignals.length>=3)qualification='\u2705 Buen encaje con el perfil de propiedad prioritaria del proyecto de Mois\u00e9s.';\n  else if(fitSignals.length>=1)qualification='\ud83d\udfe0 Encaje parcial: confirma capacidad, dormitorios y atributos premium antes de invertir demasiado seguimiento.';\n  let stage='Seguimiento',nextAction='Llamar para seguimiento',days=2,tempValue='Media',why='Hay contacto previo: el objetivo es asegurar un siguiente paso concreto.';\n  if(\/videollamada|reunion|visita\/.test(t)){stage='Visita \/ Videollamada';nextAction='Confirmar videollamada \/ visita';days=1;tempValue='Alta';why='Existe se\u00f1al de reuni\u00f3n; conviene convertirla en compromiso de calendario.'}\n  if(\/propuesta|presupuesto|oferta|contrato\/.test(t)){stage='Propuesta realizada';nextAction='Seguimiento de propuesta';days=2;tempValue='Alta';why='La oportunidad est\u00e1 en fase de decisi\u00f3n; hay que resolver objeciones y cerrar siguiente paso.'}\n  if(\/acepto|adelante|cerrado|empezamos|firmamos|contratamos\/.test(t)){stage='Ganado';nextAction='Onboarding';days=0;tempValue='Muy alta';why='La conversaci\u00f3n contiene una se\u00f1al clara de aceptaci\u00f3n.'}\n  if(objections.includes('Decisi\u00f3n compartida')){nextAction='Enviar resumen breve y fechar llamada tras hablarlo';days=3;why='La decisi\u00f3n depende de otra persona: facilita el consenso y fija fecha, no dejes un \u201cya te dir\u00e9\u201d.'}\n  else if(objections.includes('Cambio de gestora')){nextAction='Comparar situaci\u00f3n actual y proponer transici\u00f3n sin fricci\u00f3n';days=2;why='No conviene atacar a la gestora actual; centra el seguimiento en resultado, proceso de cambio y riesgo operativo.'}\n  else if(objections.includes('Comisi\u00f3n \/ precio')){nextAction='Seguimiento centrado en rentabilidad neta y descarga operativa';days=2;why='La conversaci\u00f3n debe salir del porcentaje aislado y volver al resultado neto y al servicio recibido.'}\n  else if(objections.includes('Reservas \/ transici\u00f3n')){nextAction='Plantear plan de transici\u00f3n respetando reservas existentes';days=3;why='La barrera no parece ser el servicio, sino cu\u00e1ndo y c\u00f3mo cambiar sin afectar reservas.'}\n  else if(objections.includes('Timing')){nextAction='Fijar fecha exacta de recontacto';days=7;why='\u201cM\u00e1s adelante\u201d sin fecha suele convertirse en oportunidad perdida.'}\n  const first=raw.split(\/(?<=[.!?])\\s+\/).filter(Boolean).slice(0,2).join(' ');const summary=first||raw.slice(0,280)||'Sin transcripci\u00f3n.';\n  const firstName=String(lead?.person||lead?.name||'').split(\/[\u00b7\\-]\/)[0].trim();let whatsapp=`Hola ${firstName}, soy Mois\u00e9s, de Villas Rivero. Gracias por el rato de antes. `;\n  if(objections.includes('Decisi\u00f3n compartida'))whatsapp+='Te dejo resumido lo importante para que puedas comentarlo con calma. Si te parece, lo retomamos en la fecha que hemos hablado y resolvemos cualquier duda.';\n  else if(objections.includes('Comisi\u00f3n \/ precio'))whatsapp+='Quer\u00eda retomar lo que comentamos y enfocarlo en n\u00fameros netos y en todo lo que descargamos de la gesti\u00f3n, para que puedas comparar bien el resultado real. \u00bfLo vemos?';\n  else if(objections.includes('Reservas \/ transici\u00f3n'))whatsapp+='Podemos plantear una transici\u00f3n ordenada respetando las reservas que ya tienes, para que el cambio no te genere fricci\u00f3n. Si quieres, te explico c\u00f3mo lo har\u00edamos.';\n  else whatsapp+='Te escribo para dejar encaminado el siguiente paso y que no se nos quede la conversaci\u00f3n en el aire. \u00bfTe viene bien que lo retomemos?';\n  return {summary,objections,signals,missing,fitSignals,qualification,stage,nextAction,nextDate:addDaysISO(days),tempValue,why,whatsapp};\n}\nfunction coachHTML(r){return `<div class=\"coach-card\"><b>Resumen<\/b><p>${escapeHtml(r.summary)}<\/p><\/div><div class=\"coach-card\"><b>Encaje con el proyecto de Mois\u00e9s<\/b><p>${escapeHtml(r.qualification||'')}<\/p>${r.fitSignals?.length?`<div class=\"playbook-chips\">${r.fitSignals.map(x=>`<span>${escapeHtml(x)}<\/span>`).join('')}<\/div>`:''}<\/div><div class=\"coach-card\"><b>Se\u00f1ales de compra<\/b>${r.signals.length?`<ul>${r.signals.map(x=>`<li>${x}<\/li>`).join('')}<\/ul>`:'<p>No he detectado una se\u00f1al expl\u00edcita. Conviene validar inter\u00e9s antes de empujar.<\/p>'}<\/div><div class=\"coach-card\"><b>Objeciones \/ frenos<\/b>${r.objections.length?`<ul>${r.objections.map(x=>`<li>${x}<\/li>`).join('')}<\/ul>`:'<p>No aparece una objeci\u00f3n clara en el texto.<\/p>'}<\/div><div class=\"coach-card\"><b>Qu\u00e9 har\u00eda ahora<\/b><p><strong>${escapeHtml(r.nextAction)}<\/strong> \u00b7 ${r.nextDate}<br>${escapeHtml(r.why)}<\/p><\/div>${r.missing.length?`<div class=\"coach-card\"><b>Informaci\u00f3n que falta<\/b><ul>${r.missing.map(x=>`<li>${x}<\/li>`).join('')}<\/ul><\/div>`:''}<div class=\"coach-card\"><b>WhatsApp recomendado<\/b><div class=\"whats-msg\">${escapeHtml(r.whatsapp)}<\/div><\/div>`}\nfunction escapeHtml(s){return String(s??'').replace(\/[&<>\"']\/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;'}[m]))}\nfunction analyzeCurrentCoach(){if(!currentLead)return;const tr=document.getElementById('coachTranscript').value.trim();if(!tr){showToast('\u26a0\ufe0f Pega o dicta una transcripci\u00f3n primero.');return}lastCoachResult=localCoach(tr,currentLead);document.getElementById('coachOutput').innerHTML=coachHTML(lastCoachResult)}\nfunction applyCoachResult(){if(!currentLead||!lastCoachResult){showToast('Primero analiza la transcripci\u00f3n.');return}document.getElementById('editStage').value=lastCoachResult.stage;document.getElementById('editTemp').value=lastCoachResult.tempValue;document.getElementById('editNote').value=lastCoachResult.summary;document.getElementById('editNextAction').value=lastCoachResult.nextAction;document.getElementById('editNextDate').value=lastCoachResult.nextDate;const s=state();s.leads=s.leads||{};const old=s.leads[currentLead.id]||{};const sessions=[...(old.coachSessions||[]),{transcript:document.getElementById('coachTranscript').value.trim(),result:lastCoachResult,at:new Date().toISOString()}];s.leads[currentLead.id]={...old,coachSessions:sessions};saveState(s);showToast('\ud83e\udde0 Recomendaci\u00f3n aplicada. Revisa y guarda la ficha.')}\nasync function readCoachFile(file){if(!file)return;try{const text=await file.text();document.getElementById('coachTranscript').value=text;showToast('\u2705 Transcripci\u00f3n cargada.');analyzeCurrentCoach()}catch(e){showToast('\u26a0\ufe0f No pude leer ese archivo. Usa TXT, MD, SRT o VTT.') }}\nfunction startDictation(targetId,stateId,btnId){const SR=window.SpeechRecognition||window.webkitSpeechRecognition;if(!SR){showToast('\u26a0\ufe0f Este navegador no ofrece dictado por voz. Puedes escribir o pegar el texto.');return}if(speechRec){speechRec.stop();speechRec=null;return}const target=document.getElementById(targetId),status=document.getElementById(stateId),btn=document.getElementById(btnId);let base=target.value.trim();speechRec=new SR();speechRec.lang='es-ES';speechRec.continuous=true;speechRec.interimResults=true;speechRec.onstart=()=>{status.textContent='Escuchando\u2026 habla con naturalidad.';status.classList.add('live');btn.classList.add('recording');btn.textContent='\u23f9 Parar dictado'};speechRec.onresult=e=>{let final='',interim='';for(let i=e.resultIndex;i<e.results.length;i++){const chunk=e.results[i][0].transcript;if(e.results[i].isFinal)final+=chunk+' ';else interim+=chunk}if(final){base=(base+' '+final).trim()}target.value=(base+' '+interim).trim()};speechRec.onerror=e=>{status.textContent='No se pudo continuar con el dictado ('+e.error+').';};speechRec.onend=()=>{status.textContent='Dictado detenido. Puedes corregir el texto antes de continuar.';status.classList.remove('live');btn.classList.remove('recording');btn.textContent=btnId==='smartMic'?'\ud83c\udf99\ufe0f Dictar lead':'\ud83c\udf99\ufe0f Dictar';speechRec=null};speechRec.start()}\nfunction parseRelativeDate(t){const n=norm(t),d=new Date();if(\/manana\/.test(n)){d.setDate(d.getDate()+1)}else if(\/pasado manana\/.test(n)){d.setDate(d.getDate()+2)}else{const days=['domingo','lunes','martes','miercoles','jueves','viernes','sabado'];let found=days.findIndex(x=>n.includes(x));if(found>=0){let diff=(found-d.getDay()+7)%7;if(diff===0)diff=7;d.setDate(d.getDate()+diff)}else return ''}return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`}\nfunction parseSmartLead(t){const raw=String(t||'').trim(),n=norm(raw);const email=(raw.match(\/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\/i)||[])[0]||'';const phone=(raw.match(\/(?:\\+?34[\\s.-]?)?(?:[6789](?:[\\s.-]?\\d){8})\/)||[])[0]||'';let name='';let m=raw.match(\/(?:se llama|nombre(?: es)?|contacto(?: es)?|propietari[oa](?: se llama)?)\\s+([^,.;\\n]{2,60})\/i);if(m)name=m[1].trim();if(!name){const first=(raw.split(\/[,.\\n]\/)[0]||'').trim();if(first.length>1&&first.length<70&&!\/^(tengo|he hablado|me ha|es un|es una|telefono|tel\u00e9fono)\/i.test(first))name=first.replace(\/^(lead|contacto)\\s*[:\\-]?\\s*\/i,'')}\n  let location='';m=raw.match(\/(?:en|zona de|ubicad[oa] en|propiedad en|vivienda en|villa en)\\s+([A-Z\u00c1\u00c9\u00cd\u00d3\u00da\u00d1][A-Za-z\u00c1\u00c9\u00cd\u00d3\u00da\u00d1\u00e1\u00e9\u00ed\u00f3\u00fa\u00f1\\s-]{2,45})\/);if(m)location=m[1].trim().replace(\/\\s+(?:y|que|con|telefono|tel\u00e9fono).*$\/i,'');\n  let value=0;m=raw.match(\/(?:valor|honorarios|comision|comisi\u00f3n|cuota|estimad[oa])[^\\d]{0,15}(\\d{2,6}(?:[.,]\\d{1,2})?)\\s*(?:\u20ac|euros)?\/i);if(!m)m=raw.match(\/(\\d{2,6}(?:[.,]\\d{1,2})?)\\s*(?:\u20ac|euros)(?:\\s*\\\/\\s*mes|\\s+al mes)?\/i);if(m)value=Number(m[1].replace('.','').replace(',','.'))||0;\n  let origin='Prospecci\u00f3n propia';if(\/referid|me lo paso|me la paso|recomend\/.test(n))origin='Referido';else if(\/instagram|redes\/.test(n))origin='Redes sociales';else if(\/web|formulario\/.test(n))origin='Web';\n  let potential=\/muy interesad|quiere avanzar|quiere reunion|quiere videollamada\/.test(n)?80:\/interesad|quiere informacion|quiere info\/.test(n)?60:40;\n  let nextAction=\/whatsapp\/.test(n)?'WhatsApp':\/videollamada|reunion\/.test(n)?'Videollamada':\/email|correo\/.test(n)?'Email':'Llamar';const nextDate=parseRelativeDate(raw);\n  return {name,phone,email,location,value,origin,potential,nextAction,nextDate,note:raw}}\nfunction openSmartCapture(){smartParsed=null;document.getElementById('smartText').value='';document.getElementById('smartPreview').classList.add('hidden');document.getElementById('smartPreview').innerHTML='';document.getElementById('smartToLead').disabled=true;document.getElementById('smartCaptureBack').classList.remove('hidden');setTimeout(()=>document.getElementById('smartText').focus(),50)}\nfunction closeSmartCapture(){if(speechRec){speechRec.stop();speechRec=null}document.getElementById('smartCaptureBack').classList.add('hidden')}\nfunction renderSmartPreview(){const t=document.getElementById('smartText').value.trim();if(!t){showToast('Cu\u00e9ntame primero algo sobre el lead.');return}smartParsed=parseSmartLead(t);const p=smartParsed;const el=document.getElementById('smartPreview');el.innerHTML=`<b style=\"display:block;margin-bottom:9px\">Esto es lo que he entendido:<\/b><div class=\"preview-grid\"><div class=\"preview-kv\"><span>Nombre<\/span><b>${escapeHtml(p.name||'Por confirmar')}<\/b><\/div><div class=\"preview-kv\"><span>Tel\u00e9fono<\/span><b>${escapeHtml(p.phone||'\u2014')}<\/b><\/div><div class=\"preview-kv\"><span>Email<\/span><b>${escapeHtml(p.email||'\u2014')}<\/b><\/div><div class=\"preview-kv\"><span>Zona<\/span><b>${escapeHtml(p.location||'\u2014')}<\/b><\/div><div class=\"preview-kv\"><span>Origen<\/span><b>${p.origin}<\/b><\/div><div class=\"preview-kv\"><span>Valor<\/span><b>${p.value?money(p.value):'\u2014'}<\/b><\/div><div class=\"preview-kv\"><span>Pr\u00f3xima acci\u00f3n<\/span><b>${p.nextAction}${p.nextDate?' \u00b7 '+p.nextDate:''}<\/b><\/div><div class=\"preview-kv\"><span>Potencial inicial<\/span><b>${p.potential}%<\/b><\/div><\/div><p class=\"voice-tip\">No crea nada todav\u00eda. Pulsa \u201cCrear ficha\u201d y revisa los campos antes de guardar.<\/p>`;el.classList.remove('hidden');document.getElementById('smartToLead').disabled=false}\nfunction smartToNewLead(){if(!smartParsed)renderSmartPreview();if(!smartParsed)return;const p=smartParsed;closeSmartCapture();openNewLead();document.getElementById('newName').value=p.name||'';document.getElementById('newPhone').value=p.phone||'';document.getElementById('newEmail').value=p.email||'';document.getElementById('newLocation').value=p.location||'';document.getElementById('newOrigin').value=p.origin||'Prospecci\u00f3n propia';document.getElementById('newValue').value=p.value||'';document.getElementById('newPotential').value=String(p.potential||40);document.getElementById('newNote').value=p.note||'';document.getElementById('newNextAction').value=p.nextAction||'';document.getElementById('newNextDate').value=p.nextDate||'';showToast('\u2728 Ficha preparada. Rev\u00edsala y crea el lead.')}\n\ndocument.querySelectorAll('.nav button').forEach(b=>b.onclick=()=>{document.querySelectorAll('.nav button').forEach(x=>x.classList.remove('active'));b.classList.add('active');document.querySelectorAll('.view').forEach(v=>v.classList.remove('active'));document.getElementById(b.dataset.view).classList.add('active')});\n\ndocument.querySelectorAll('.lead-tab').forEach(b=>b.onclick=()=>switchLeadTab(b.dataset.leadTab));\ndocument.getElementById('smartCaptureTop').onclick=openSmartCapture;document.getElementById('closeSmartCapture').onclick=closeSmartCapture;document.getElementById('smartCaptureBack').onclick=e=>{if(e.target.id==='smartCaptureBack')closeSmartCapture()};document.getElementById('smartMic').onclick=()=>startDictation('smartText','smartSpeechState','smartMic');document.getElementById('smartParse').onclick=renderSmartPreview;document.getElementById('smartClear').onclick=()=>{document.getElementById('smartText').value='';smartParsed=null;document.getElementById('smartPreview').classList.add('hidden');document.getElementById('smartToLead').disabled=true};document.getElementById('smartToLead').onclick=smartToNewLead;document.getElementById('coachFile').onchange=e=>readCoachFile(e.target.files?.[0]);document.getElementById('dictateCoach').onclick=()=>startDictation('coachTranscript','coachSpeechState','dictateCoach');document.getElementById('analyzeCoach').onclick=analyzeCurrentCoach;document.getElementById('applyCoach').onclick=applyCoachResult;\n['newLeadTop','newLeadList'].forEach(id=>document.getElementById(id).onclick=openNewLead);['importTop','importList'].forEach(id=>document.getElementById(id).onclick=openImport);['quickCallTop','quickCallDay'].forEach(id=>document.getElementById(id).onclick=openQuickCall);document.getElementById('closeNewLead').onclick=closeNewLead;document.getElementById('newLeadBack').onclick=e=>{if(e.target.id==='newLeadBack')closeNewLead()};document.getElementById('createLeadBtn').onclick=()=>createNewLead(false);document.getElementById('createAndColdBtn').onclick=()=>createNewLead(true);document.getElementById('closeQuickCall').onclick=closeQuickCall;document.getElementById('quickCallBack').onclick=e=>{if(e.target.id==='quickCallBack')closeQuickCall()};document.getElementById('saveQuickCall').onclick=saveQuickCall;document.getElementById('closeImport').onclick=closeImport;document.getElementById('importBack').onclick=e=>{if(e.target.id==='importBack')closeImport()};document.getElementById('importFile').onchange=e=>handleImportFile(e.target.files?.[0]);document.getElementById('confirmImport').onclick=confirmImport;\ndocument.getElementById('roleHector').onclick=()=>setRole('hector');document.getElementById('roleMoises').onclick=()=>setRole('moises');document.getElementById('globalDivision').onchange=e=>{activeDivision=e.target.value;document.getElementById('pipelineDivision').innerHTML='';document.getElementById('tableDivision').innerHTML='';renderAll()};document.getElementById('pipelineDivision').onchange=renderPipeline;document.getElementById('tableDivision').onchange=renderTable;document.getElementById('search').oninput=renderTable;document.getElementById('closeModal').onclick=closeModal;document.getElementById('modalBack').onclick=e=>{if(e.target.id==='modalBack')closeModal()};document.getElementById('saveBtn').onclick=()=>persist('update');document.getElementById('coldCallBtn').onclick=()=>persist('cold');document.getElementById('followUpBtn').onclick=()=>persist('followup');document.getElementById('videoBtn').onclick=()=>persist('video');document.getElementById('proposalBtn').onclick=()=>persist('proposal');document.getElementById('winBtn').onclick=()=>persist('win');document.getElementById('goalWeek').onchange=syncGoalInput;document.getElementById('goalWins').oninput=renderWeekly;document.getElementById('saveGoal').onclick=()=>{const info=selectedWeekInfo(),key=document.getElementById('goalWeek').value,wins=Math.max(0,Number(document.getElementById('goalWins').value)||0);setWeeklyGoal(key,wins);showToast(`\ud83c\udfaf Objetivo semanal guardado: ${wins} ${wins===1?'cierre':'cierres'}.`);renderWeekly()};document.getElementById('focusFirst').onclick=()=>{const x=[...openDeals()].sort((a,b)=>score(b)-score(a))[0];if(x)openLead(x.id)};\nif(LOCKED_ROLE){document.getElementById('roleSwitch').classList.add('hidden');role=LOCKED_ROLE;activeDivision=LOCKED_ROLE==='moises'?'Villas Rivero':''}populateGoalWeeks();renderAll();\n<\/script><\/body><\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>REALIUXE SALES OS REALIUXE SALES OS Direcci\u00f3n comercial Dashboard Mi d\u00eda Objetivo semanal Pipeline Oportunidades Seguimientos Copiloto IA Divisiones Acceso de Direcci\u00f3n Vista global de REALIUXE. La versi\u00f3n de Mois\u00e9s queda limitada a Villas Rivero y a sus oportunidades. REALIUXE SALES OS\ud83d\udcde Registrar llamada\u2728 Captura inteligente\uff0b Nuevo lead\u21a5 Importar ExcelH\u00e9ctorMois\u00e9s Modo comercial Villas Rivero: solo [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1553","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CRM Mois\u00e9s - Villas Rivero<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/villasrivero.com\/en\/crm-moises\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CRM Mois\u00e9s - Villas Rivero\" \/>\n<meta property=\"og:description\" content=\"REALIUXE SALES OS REALIUXE SALES OS Direcci\u00f3n comercial Dashboard Mi d\u00eda Objetivo semanal Pipeline Oportunidades Seguimientos Copiloto IA Divisiones Acceso de Direcci\u00f3n Vista global de REALIUXE. La versi\u00f3n de Mois\u00e9s queda limitada a Villas Rivero y a sus oportunidades. REALIUXE SALES OS\ud83d\udcde Registrar llamada\u2728 Captura inteligente\uff0b Nuevo lead\u21a5 Importar ExcelH\u00e9ctorMois\u00e9s Modo comercial Villas Rivero: solo [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/villasrivero.com\/en\/crm-moises\/\" \/>\n<meta property=\"og:site_name\" content=\"Villas Rivero\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-21T18:19:33+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/villasrivero.com\\\/crm-moises\\\/\",\"url\":\"https:\\\/\\\/villasrivero.com\\\/crm-moises\\\/\",\"name\":\"CRM Mois\u00e9s - Villas Rivero\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/villasrivero.com\\\/#website\"},\"datePublished\":\"2026-08-21T17:21:10+00:00\",\"dateModified\":\"2026-08-21T18:19:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/villasrivero.com\\\/crm-moises\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/villasrivero.com\\\/crm-moises\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/villasrivero.com\\\/crm-moises\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/villasrivero.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CRM Mois\u00e9s\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/villasrivero.com\\\/#website\",\"url\":\"https:\\\/\\\/villasrivero.com\\\/\",\"name\":\"Villas Rivero\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/villasrivero.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CRM Mois\u00e9s - Villas Rivero","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/villasrivero.com\/en\/crm-moises\/","og_locale":"en_GB","og_type":"article","og_title":"CRM Mois\u00e9s - Villas Rivero","og_description":"REALIUXE SALES OS REALIUXE SALES OS Direcci\u00f3n comercial Dashboard Mi d\u00eda Objetivo semanal Pipeline Oportunidades Seguimientos Copiloto IA Divisiones Acceso de Direcci\u00f3n Vista global de REALIUXE. La versi\u00f3n de Mois\u00e9s queda limitada a Villas Rivero y a sus oportunidades. REALIUXE SALES OS\ud83d\udcde Registrar llamada\u2728 Captura inteligente\uff0b Nuevo lead\u21a5 Importar ExcelH\u00e9ctorMois\u00e9s Modo comercial Villas Rivero: solo [&hellip;]","og_url":"https:\/\/villasrivero.com\/en\/crm-moises\/","og_site_name":"Villas Rivero","article_modified_time":"2026-08-21T18:19:33+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/villasrivero.com\/crm-moises\/","url":"https:\/\/villasrivero.com\/crm-moises\/","name":"CRM Mois\u00e9s - Villas Rivero","isPartOf":{"@id":"https:\/\/villasrivero.com\/#website"},"datePublished":"2026-08-21T17:21:10+00:00","dateModified":"2026-08-21T18:19:33+00:00","breadcrumb":{"@id":"https:\/\/villasrivero.com\/crm-moises\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/villasrivero.com\/crm-moises\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/villasrivero.com\/crm-moises\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/villasrivero.com\/"},{"@type":"ListItem","position":2,"name":"CRM Mois\u00e9s"}]},{"@type":"WebSite","@id":"https:\/\/villasrivero.com\/#website","url":"https:\/\/villasrivero.com\/","name":"Villas Rivero","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/villasrivero.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"}]}},"_links":{"self":[{"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages\/1553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/comments?post=1553"}],"version-history":[{"count":7,"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages\/1553\/revisions"}],"predecessor-version":[{"id":1561,"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages\/1553\/revisions\/1561"}],"wp:attachment":[{"href":"http:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/media?parent=1553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}