{"id":1498,"date":"2026-07-30T11:51:04","date_gmt":"2026-07-30T11:51:04","guid":{"rendered":"https:\/\/villasrivero.com\/?page_id=1498"},"modified":"2026-07-30T12:02:13","modified_gmt":"2026-07-30T12:02:13","slug":"dashboard-oasis-resort","status":"publish","type":"page","link":"https:\/\/villasrivero.com\/en\/dashboard-oasis-resort\/","title":{"rendered":"Dashboard Oasis Resort"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1498\" class=\"elementor elementor-1498\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-60684f2 e-flex e-con-boxed e-con e-parent\" data-id=\"60684f2\" 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-8376500 elementor-widget elementor-widget-html\" data-id=\"8376500\" 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>\n<html lang=\"es\"><head><meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>Oasis y Jardines del Cura &middot; Informe de gesti\u00f3n<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Sorts+Mill+Goudy:ital@0;1&family=Montserrat:wght@300;400;500;600;700&display=swap\" rel=\"stylesheet\">\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.1\/chart.umd.min.js\"><\/script>\n<style>\n:root{--sea:#4ABCC5;--cadet:#242B59;--tan:#D1B38C;--black:#0E0E0E;\n--bg:#F7F6F3;--card:#FFF;--line:#E3E1DC;--mut:#6E6B65;--up:#2E8B6F;--dn:#C0563E;}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:Montserrat,sans-serif;background:var(--bg);color:var(--black);-webkit-font-smoothing:antialiased;font-size:15px}\n.wrap{max-width:1340px;margin:0 auto;padding:0 28px}\nheader{background:var(--cadet);color:#fff;padding:32px 0 28px;border-bottom:3px solid var(--tan)}\n.hd{display:flex;justify-content:space-between;align-items:flex-end;gap:24px;flex-wrap:wrap}\n.brand{font-family:'Sorts Mill Goudy',serif;font-style:italic;font-size:34px;line-height:1}\n.brand span{color:var(--sea)}\n.sub{font-size:10.5px;letter-spacing:2.6px;text-transform:uppercase;color:var(--tan);margin-top:9px;font-weight:500}\n.per{text-align:right;font-size:11px;color:#B9BFD6;line-height:1.75}.per b{color:#fff;font-size:13px;font-weight:600}\nnav{background:var(--card);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:30}\n.nv{display:flex;gap:2px;overflow-x:auto}\n.nv button{background:none;border:0;padding:15px 18px;font-family:Montserrat;font-size:12px;font-weight:500;\nletter-spacing:.7px;color:var(--mut);cursor:pointer;white-space:nowrap;border-bottom:2px solid transparent}\n.nv button:hover{color:var(--cadet)}\n.nv button.on{color:var(--cadet);border-bottom-color:var(--sea);font-weight:600}\nmain{padding:26px 0 60px}.pane{display:none}.pane.on{display:block}\n.eyebrow{font-size:10px;letter-spacing:2.4px;text-transform:uppercase;color:var(--mut);font-weight:600;margin-bottom:6px}\nh2{font-family:'Sorts Mill Goudy',serif;font-size:25px;font-weight:400;margin-bottom:4px;color:var(--cadet)}\n.lead{color:var(--mut);font-size:13px;margin-bottom:18px;max-width:820px;line-height:1.6}\n.filt{background:var(--card);border:1px solid var(--line);border-radius:3px;padding:15px 18px;margin-bottom:18px;\ndisplay:flex;gap:24px;align-items:flex-start;flex-wrap:wrap}\n.fg{display:flex;flex-direction:column;gap:7px}\n.fg>span{font-size:9.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);font-weight:600}\n.seg{display:flex;border:1px solid var(--line);border-radius:2px;overflow:hidden;flex-wrap:wrap}\n.seg button{background:#fff;border:0;padding:8px 14px;font-family:Montserrat;font-size:12px;color:var(--mut);\ncursor:pointer;border-right:1px solid var(--line);white-space:nowrap}\n.seg button:last-child{border-right:0}\n.seg button.on{background:var(--cadet);color:#fff;font-weight:600}\n.fg .cnt{font-size:11px;color:var(--mut)}\n.picker{position:relative}\n.picker>button{background:#fff;border:1px solid var(--line);border-radius:2px;padding:8px 14px;\nfont-family:Montserrat;font-size:12px;cursor:pointer;min-width:190px;text-align:left}\n.pop{display:none;position:absolute;top:calc(100% + 5px);left:0;z-index:40;background:#fff;border:1px solid var(--line);\nborder-radius:3px;box-shadow:0 8px 26px rgba(0,0,0,.13);width:340px;max-height:380px;overflow:auto;padding:9px}\n.pop.on{display:block}\n.pop .act{display:flex;gap:6px;padding:4px 4px 9px;border-bottom:1px solid var(--line);margin-bottom:6px}\n.pop .act button{flex:1;background:#F4F3F0;border:0;padding:6px;font-size:11px;font-family:Montserrat;cursor:pointer;\nborder-radius:2px;color:var(--cadet);font-weight:500}\n.pop label{display:flex;gap:8px;align-items:center;padding:5px 6px;font-size:12.5px;cursor:pointer;border-radius:2px}\n.pop label:hover{background:#FAFAF8}.pop input{accent-color:var(--sea)}\n.pbar{background:var(--cadet);color:#fff;border-radius:3px;padding:13px 18px;margin-bottom:18px;\ndisplay:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap}\n.pbar .pl{font-size:10px;letter-spacing:1.6px;text-transform:uppercase;color:var(--tan);font-weight:600;margin-bottom:3px}\n.pbar .pv{font-family:'Sorts Mill Goudy',serif;font-size:19px}\n.pbar .pn{font-size:11.5px;color:#B9BFD6;max-width:520px;line-height:1.55;text-align:right}\n.pwarn{display:none;background:#FBF2EF;border:1px solid #E8C9BE;border-left:3px solid var(--dn);\nborder-radius:0 3px 3px 0;padding:14px 18px;margin-bottom:18px;font-size:13px;color:#7A4634;line-height:1.6}\n.pwarn.on{display:block}\n.pwarn b{color:var(--dn)}\n.pwarn .h{font-weight:700;color:var(--dn);display:block;margin-bottom:4px;font-size:13.5px}\n.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(186px,1fr));gap:13px;margin-bottom:20px}\n.kpi{background:var(--card);border:1px solid var(--line);border-radius:3px;padding:18px 17px;position:relative;overflow:hidden}\n.kpi:before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--sea)}\n.kpi.t:before{background:var(--tan)}\n.kpi .l{font-size:9.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);font-weight:600;margin-bottom:9px}\n.kpi .v{font-family:'Sorts Mill Goudy',serif;font-size:29px;line-height:1;color:var(--cadet)}\n.kpi .v small{font-size:15px;color:var(--mut)}\n.kpi .cmp{font-size:11px;color:var(--mut);margin-top:7px;display:flex;gap:7px;align-items:baseline;flex-wrap:wrap}\n.d{font-weight:700;font-size:11.5px}.d.u{color:var(--up)}.d.d{color:var(--dn)}\n.card{background:var(--card);border:1px solid var(--line);border-radius:3px;padding:21px;margin-bottom:17px}\n.card h3{font-family:'Sorts Mill Goudy',serif;font-size:17px;font-weight:400;color:var(--cadet)}\n.card .cs{font-size:11.5px;color:var(--mut);margin-bottom:15px}\n.g2{display:grid;grid-template-columns:1fr 1fr;gap:17px}\n@media(max-width:920px){.g2{grid-template-columns:1fr}}\n.ch{position:relative;height:290px}.ch.sm{height:235px}\ntable{width:100%;border-collapse:collapse;font-size:13px}\nth{text-align:left;padding:9px;font-size:9.5px;letter-spacing:1.1px;text-transform:uppercase;color:var(--mut);\nfont-weight:600;border-bottom:1.5px solid var(--line);cursor:pointer;white-space:nowrap;user-select:none}\nth:hover{color:var(--cadet)}th.num,td.num{text-align:right}\ntd{padding:9px;border-bottom:1px solid #F0EEEA}\ntbody tr:hover{background:#FAFAF8}td.nm{font-weight:500}\ntr.fut td{color:#9B978F;font-style:italic}\nthead tr.grp th{border-bottom:0;padding-bottom:3px;color:var(--cadet);text-align:center;cursor:default}\ntd.sp,th.sp{border-left:1px solid var(--line)}\n.bar{height:4px;background:#EDEBE6;border-radius:2px;overflow:hidden;margin-top:5px;min-width:54px}\n.bar i{display:block;height:100%;background:var(--sea)}\n.pill{display:inline-block;padding:2px 8px;border-radius:2px;font-size:10px;font-weight:600}\n.pill.a{background:#E8F6F7;color:#1F7A80}.pill.b{background:#EDEEF5;color:var(--cadet)}\n.pill.c{background:#FAF3E9;color:#8A6A3C}.pill.g{background:#F0EFEC;color:#7A766F}\nselect{font-family:Montserrat;font-size:13px;padding:9px 12px;border:1px solid var(--line);border-radius:2px;\nbackground:#fff;min-width:250px;cursor:pointer}\n.ctl{display:flex;gap:10px;align-items:center;margin-bottom:17px;flex-wrap:wrap}\n.ctl label{font-size:10px;letter-spacing:1.3px;text-transform:uppercase;color:var(--mut);font-weight:600}\n.note{background:#FAF7F1;border-left:3px solid var(--tan);padding:12px 15px;font-size:12px;color:#5C5852;\nline-height:1.65;margin-bottom:17px;border-radius:0 2px 2px 0}.note b{color:var(--cadet)}\n.note.w{background:#FBF2EF;border-left-color:var(--dn)}\nfooter{border-top:1px solid var(--line);padding:22px 0;font-size:11px;color:var(--mut)}\n.fl{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;width:100%}\n.fl .lg{font-family:'Sorts Mill Goudy',serif;font-style:italic;font-size:15px;color:var(--cadet)}\n.chips{display:flex;flex-wrap:wrap;gap:5px;margin-top:4px}\n.chip{background:#F4F3F0;border-radius:2px;padding:3px 8px;font-size:11px;color:var(--mut)}\n.brk{margin-top:32px;padding-top:24px;border-top:2px solid var(--line)}\n.brkh{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;flex-wrap:wrap;margin-bottom:18px}\n.bhead{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:15px}\n.bhead .dot{width:9px;height:9px;border-radius:50%;background:var(--sea);align-self:center}\n.bhead .bn{font-family:'Sorts Mill Goudy',serif;font-size:23px;color:var(--cadet)}\n.bhead .by{font-size:12.5px;color:var(--mut)}\n.bhead .bm{font-size:11.5px;color:var(--mut);margin-left:auto}\n.bk{display:grid;grid-template-columns:repeat(auto-fit,minmax(196px,1fr));gap:14px;margin-bottom:17px}\n.bkc{background:var(--card);border:1px solid var(--line);border-radius:3px;padding:17px 17px 15px}\n.bkc .l{font-size:9.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);font-weight:600;margin-bottom:13px}\n.bkc .y1,.bkc .y2{display:flex;flex-direction:column;gap:1px;margin-bottom:9px}\n.bkc .y1 span,.bkc .y2 span{font-size:10.5px;color:var(--mut)}\n.bkc .y1 b{font-size:19px;font-weight:400;color:var(--mut);font-family:'Sorts Mill Goudy',serif}\n.bkc .y2 b{font-size:27px;font-weight:400;color:var(--cadet);font-family:'Sorts Mill Goudy',serif;line-height:1.1}\n.bkc .dl{padding-top:11px;border-top:1px solid #F0EEEA;display:flex;flex-direction:column;gap:2px;margin-bottom:11px}\n.bkc .dl .ar{font-size:10px;color:var(--mut)}\n.bkc .mb{display:flex;align-items:center;gap:7px;margin-top:5px}\n.bkc .mb span{font-size:9.5px;color:var(--mut);width:26px;flex-shrink:0}\n.bkc .mb i{display:block;height:4px;border-radius:2px;min-width:2px}\n.empty{background:var(--card);border:1px solid var(--line);border-radius:3px;padding:42px;text-align:center;color:var(--mut);font-size:13px}\n.ins{background:var(--card);border:1px solid var(--line);border-radius:3px;padding:20px 22px;margin-bottom:17px}\n.ins h4{font-family:'Sorts Mill Goudy',serif;font-size:16px;color:var(--cadet);font-weight:400;margin-bottom:11px}\n.ins ul{list-style:none;display:flex;flex-direction:column;gap:9px}\n.ins li{font-size:13px;line-height:1.6;padding-left:15px;position:relative;color:#454239}\n.ins li:before{content:'';position:absolute;left:0;top:7px;width:5px;height:5px;border-radius:50%;background:var(--sea)}\n.ins li.w:before{background:var(--dn)}.ins li.g:before{background:var(--up)}\n.ins li b{color:var(--cadet)}\n.diag h4{display:flex;align-items:center;gap:9px}\n.diag .tag{font-size:9px;letter-spacing:1px;text-transform:uppercase;font-weight:700;padding:2px 7px;border-radius:2px}\n.diag .tag.ok{background:#E7F3EE;color:var(--up)}\n.diag .tag.no{background:#FBF2EF;color:var(--dn)}\n.wf{display:flex;flex-direction:column;gap:0;margin:14px 0 4px}\n.wf .row{display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center;padding:9px 0;border-bottom:1px solid #F0EEEA;font-size:13px}\n.wf .row:last-child{border-bottom:0}\n.wf .row.tot{font-weight:600;color:var(--cadet);border-top:1.5px solid var(--line);border-bottom:0}\n.wf .lbl{color:#454239}.wf .lbl small{display:block;color:var(--mut);font-size:11px;font-weight:400;margin-top:1px}\n.wf .amt{font-family:'Sorts Mill Goudy',serif;font-size:15px;text-align:right;min-width:82px}\n.wf .amt.u{color:var(--up)}.wf .amt.d{color:var(--dn)}\n.wf .pctm{font-size:11px;color:var(--mut);text-align:right;min-width:44px}\n.hyp{margin-top:16px;padding-top:15px;border-top:1px dashed var(--line)}\n.hyp .ht{font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);font-weight:600;margin-bottom:10px}\n.hyp ul{gap:11px}\n.hyp li{font-size:12.5px;color:#5C5852}\n.hyp li .q{display:block;margin-top:3px;color:var(--cadet);font-style:italic}\n.subT{font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);font-weight:600;margin:16px 0 8px}\n.canx{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-top:6px}\n@media(max-width:640px){.canx{grid-template-columns:1fr}}\n.cbx{border:1px solid var(--line);border-radius:2px;padding:11px 13px;font-size:12px}\n.cbx .cy{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--mut);font-weight:600;margin-bottom:7px}\n.cbx .cl{display:flex;justify-content:space-between;padding:2px 0;color:#454239}\n.cbx .cl b{color:var(--cadet);font-weight:600}\n@media(max-width:640px){.wrap{padding:0 15px}.brand{font-size:26px}.kpi .v{font-size:25px}\n.per,.pbar .pn{text-align:left}.bhead .bm{margin-left:0;width:100%}}\n\n\/* \u2500\u2500 portada propietario \u2500\u2500 *\/\n.phero{background:linear-gradient(135deg,#242B59,#31396E);color:#fff;border-radius:5px;padding:38px 36px;margin-bottom:34px}\n.pheyebrow{font-size:11px;letter-spacing:2.4px;text-transform:uppercase;color:var(--tan);font-weight:600;margin-bottom:12px}\n.pht{font-family:'Sorts Mill Goudy',serif;font-size:32px;line-height:1.15;margin-bottom:12px}\n.phs{font-size:13.5px;color:#B9BFD6;line-height:1.7;max-width:720px;margin-bottom:28px}\n.phs b{color:#fff}\n.phg{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}\n@media(max-width:720px){.phg{grid-template-columns:1fr;gap:20px}}\n.phg .mn{font-size:12px;color:#B9BFD6;margin-bottom:7px}\n.phg .mv{font-family:'Sorts Mill Goudy',serif;font-size:38px;line-height:1;color:var(--sea)}\n.phg .md{font-size:12px;color:#B9BFD6;margin-top:8px}.phg .md b{color:var(--tan)}\n.sec2{margin-bottom:38px}\n.s2t{font-family:'Sorts Mill Goudy',serif;font-size:21px;font-weight:400;color:var(--cadet);margin-bottom:4px}\n.s2s{font-size:12.5px;color:var(--mut);margin-bottom:18px;line-height:1.6;max-width:720px}\n.pcards{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}\n@media(max-width:820px){.pcards{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:480px){.pcards{grid-template-columns:1fr}}\n.pmc{background:var(--card);border:1px solid var(--line);border-radius:4px;padding:20px 18px;text-align:center}\n.pmc .mm{font-family:'Sorts Mill Goudy',serif;font-size:18px;color:var(--cadet);margin-bottom:12px}\n.pmc .comp{display:flex;justify-content:center;align-items:baseline;gap:10px;margin-bottom:6px}\n.pmc .a{font-size:13px;color:var(--mut)}.pmc .arrow{color:var(--sea);font-size:15px}\n.pmc .b{font-family:'Sorts Mill Goudy',serif;font-size:24px;color:var(--cadet)}\n.pmc .up{color:var(--up);font-weight:700;font-size:13px;margin-top:3px}\n.pmc .dn{color:#B0663E;font-weight:700;font-size:13px;margin-top:3px}\n.pmc .sub{font-size:10.5px;color:var(--mut);margin-top:9px;padding-top:9px;border-top:1px solid #F0EEEA;line-height:1.5}\n.pmc .sub b{color:var(--cadet)}\n.pstory{background:#FAF7F1;border-left:3px solid var(--tan);border-radius:0 4px 4px 0;padding:20px 24px;margin-bottom:16px}\n.pstory p{font-size:14px;color:#454239;line-height:1.75}.pstory p+p{margin-top:11px}\n.pstory b{color:var(--cadet)}.pstory .big{font-family:'Sorts Mill Goudy',serif;font-size:18px;color:var(--cadet);display:block;margin:4px 0}\n.pchan{display:grid;grid-template-columns:1fr 1fr;gap:16px}\n@media(max-width:720px){.pchan{grid-template-columns:1fr}}\n.pcb{border:1px solid var(--line);border-radius:4px;padding:18px;background:var(--card)}\n.pcb .cy{font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);font-weight:600;margin-bottom:12px}\n.pcb .cr{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid #F0EEEA;font-size:13px}\n.pcb .cr:last-child{border-bottom:0}.pcb .nm{color:#454239}.pcb .vl{font-weight:600;color:var(--cadet)}\n.pcb .vl small{color:var(--mut);font-weight:400}\n.pnote{font-size:11.5px;color:var(--mut);font-style:italic;margin-top:13px;line-height:1.6}\n.pcta{background:var(--cadet);color:#fff;border-radius:4px;padding:22px 26px;text-align:center}\n.pcta .pctat{font-size:13.5px;line-height:1.7;color:#DDE0EC}.pcta b{color:var(--sea)}\n<\/style><\/head><body>\n<header><div class=\"wrap\"><div class=\"hd\">\n<div><div class=\"brand\">Villas <span>Rivero<\/span><\/div><div class=\"sub\">Oasis y Jardines del Cura<\/div><\/div>\n<div class=\"per\"><b id=\"hPer\"><\/b><br><span id=\"hSel\"><\/span><br>Actualizado <span id=\"hGen\"><\/span><\/div>\n<\/div><\/div><\/header>\n<nav><div class=\"wrap\"><div class=\"nv\">\n<button class=\"on\" data-p=\"portada\">Nuestra gesti\u00f3n<\/button>\n<button data-p=\"resumen\">Datos completos<\/button>\n<button data-p=\"periodos\">Comparativa de periodos<\/button>\n<button data-p=\"ranking\">Ranking<\/button>\n<button data-p=\"canales\">Canales<\/button>\n<button data-p=\"inventario\">Inventario<\/button>\n<\/div><\/div><\/nav>\n<main><div class=\"wrap\">\n\n<div class=\"filt\">\n<div class=\"fg\"><span>Periodo<\/span><div class=\"seg\" id=\"segP\">\n<button data-v=\"ytd\" class=\"on\">YTD<\/button><button data-v=\"q1\">Q1<\/button><button data-v=\"q2\">Q2<\/button>\n<button data-v=\"q3\">Q3<\/button><button data-v=\"q4\">Q4<\/button><button data-v=\"s1\">S1<\/button>\n<button data-v=\"s2\">S2<\/button><button data-v=\"anio\">A&ntilde;o completo<\/button>\n<\/div><\/div>\n<div class=\"fg\"><span>Cartera<\/span><div class=\"seg\" id=\"segC\">\n<button data-v=\"comp\" class=\"on\">Comparables<\/button><button data-v=\"todos\">Todos<\/button>\n<button data-v=\"manual\">Manual<\/button><\/div><div class=\"cnt\" id=\"cntC\"><\/div><\/div>\n<div class=\"fg\"><span>Alojamientos<\/span><div class=\"picker\">\n<button id=\"pkBtn\">Seleccionar&hellip;<\/button>\n<div class=\"pop\" id=\"pkPop\"><div class=\"act\">\n<button id=\"pkAll\">Todos<\/button><button id=\"pkNone\">Ninguno<\/button>\n<button id=\"pkComp\">Comparables<\/button><button id=\"pkOasis\">Oasis+JdC<\/button>\n<\/div><div id=\"pkList\"><\/div><\/div><\/div><\/div>\n<\/div>\n\n<div class=\"pbar\"><div><div class=\"pl\" id=\"pbL\"><\/div><div class=\"pv\" id=\"pbV\"><\/div><\/div>\n<div class=\"pn\" id=\"pbN\"><\/div><\/div>\n\n<section class=\"pane on\" id=\"portada\">\n<div class=\"phero\">\n<div class=\"pheyebrow\">Su cartera con nuestra gesti\u00f3n<\/div>\n<div class=\"pht\">C\u00f3mo ha evolucionado el rendimiento<\/div>\n<div class=\"phs\">Comparamos los meses de <b id=\"pRango\"><\/b> de 2025 y 2026, tomando \u00fanicamente los apartamentos que ya operaban en ambos a\u00f1os. Misma temporada, mismo inmueble, distinta gesti\u00f3n.<\/div>\n<div class=\"phg\" id=\"phHero\"><\/div>\n<\/div>\n<div class=\"sec2\">\n<h3 class=\"s2t\">El detalle de cada mes<\/h3>\n<div class=\"s2s\">Cada tarjeta compara el mismo grupo de apartamentos activos en ese mes de los dos a\u00f1os.<\/div>\n<div class=\"pcards\" id=\"phCards\"><\/div>\n<\/div>\n<div class=\"sec2\">\n<h3 class=\"s2t\">De d\u00f3nde vienen las reservas<\/h3>\n<div class=\"pstory\" id=\"phStory\"><\/div>\n<div class=\"pchan\" id=\"phChan\"><\/div>\n<div class=\"pnote\" id=\"phChNote\"><\/div>\n<\/div>\n<div class=\"sec2\">\n<h3 class=\"s2t\">C\u00f3mo ha ido cada apartamento<\/h3>\n<div class=\"s2s\">Ingresos de <span id=\"pRango2\"><\/span> de cada apartamento, a igualdad de meses activos.<\/div>\n<div class=\"card\" style=\"margin-top:6px\"><div style=\"overflow-x:auto\"><table id=\"phAloj\"><\/table><\/div>\n<div class=\"pnote\" id=\"phTblNote\"><\/div><\/div>\n<\/div>\n<div class=\"pcta\">\n<div class=\"pctat\">Estos son los meses ya cerrados y comparables. El resto del a\u00f1o, con datos igual de firmes, en la pesta\u00f1a <b>Datos completos<\/b>.<\/div>\n<\/div>\n<\/section>\n\n<section class=\"pane\" id=\"resumen\">\n<div class=\"eyebrow\">Comparativa<\/div><h2>Resumen ejecutivo<\/h2>\n<p class=\"lead\">KPIs del periodo seleccionado, comparados entre ambos a&ntilde;os.<\/p>\n<div class=\"pwarn\" id=\"pWarn\"><\/div>\n<div class=\"kpis\" id=\"kA\"><\/div>\n<div class=\"ins\" id=\"insBox\"><\/div>\n<div class=\"ins\" id=\"diagBox\"><\/div>\n<div class=\"g2\">\n<div class=\"card\"><h3>Revenue mensual<\/h3><div class=\"cs\">Meses del periodo destacados; el resto atenuado<\/div><div class=\"ch\"><canvas id=\"a1\"><\/canvas><\/div><\/div>\n<div class=\"card\"><h3>Ocupaci&oacute;n mensual<\/h3><div class=\"cs\">Porcentaje sobre disponibilidad real<\/div><div class=\"ch\"><canvas id=\"a2\"><\/canvas><\/div><\/div>\n<\/div>\n<div class=\"card\"><h3>Tabla mensual<\/h3><div class=\"cs\">Detalle mes a mes con total del periodo<\/div>\n<div style=\"overflow-x:auto\"><table id=\"tA\"><\/table><\/div><\/div>\n<div class=\"brk\"><div class=\"brkh\">\n<div><div class=\"eyebrow\">Desglose<\/div><h2>Detalle por alojamiento<\/h2>\n<p class=\"lead\" id=\"brkS\" style=\"margin-bottom:0\"><\/p><\/div>\n<select id=\"selB\"><\/select><\/div>\n<div id=\"brkBox\"><\/div><\/div>\n<\/section>\n\n<section class=\"pane\" id=\"periodos\">\n<div class=\"eyebrow\">Claridad<\/div><h2>Comparativa de periodos<\/h2>\n<p class=\"lead\">Todos los periodos en una sola tabla, indicando cu&aacute;les son comparables y cu&aacute;les no.<\/p>\n<div class=\"note\" id=\"cmpNota\"><\/div>\n<div class=\"card\"><h3>Todos los periodos<\/h3><div class=\"cs\">El periodo activo aparece resaltado<\/div>\n<div style=\"overflow-x:auto\"><table id=\"tCmp\"><\/table><\/div><\/div>\n<div class=\"card\"><h3>Revenue por periodo<\/h3><div class=\"cs\">Las barras claras corresponden a periodos a&uacute;n en curso<\/div><div class=\"ch\"><canvas id=\"cmp1\"><\/canvas><\/div><\/div>\n<\/section>\n\n<section class=\"pane\" id=\"ranking\">\n<div class=\"eyebrow\">Comparativa<\/div><h2>Ranking de alojamientos<\/h2>\n<p class=\"lead\">Rendimiento individual en el periodo seleccionado. Ordena por cualquier columna.<\/p>\n<div class=\"card\"><div style=\"overflow-x:auto\"><table id=\"tR\"><\/table><\/div><\/div>\n<\/section>\n\n<section class=\"pane\" id=\"canales\">\n<div class=\"eyebrow\">Distribuci&oacute;n<\/div><h2>An&aacute;lisis por canal<\/h2>\n<p class=\"lead\">Origen de los ingresos en el periodo seleccionado.<\/p>\n<div class=\"note\" id=\"canNota\"><\/div>\n<div class=\"g2\">\n<div class=\"card\"><h3>Revenue por canal<\/h3><div class=\"cs\">Comparativa entre a&ntilde;os<\/div><div class=\"ch\"><canvas id=\"n1\"><\/canvas><\/div><\/div>\n<div class=\"card\"><h3>Reparto<\/h3><div class=\"cs\">Peso de cada canal<\/div><div class=\"ch\"><canvas id=\"n2\"><\/canvas><\/div><\/div>\n<\/div>\n<div class=\"card\"><h3>Detalle por canal<\/h3><div class=\"cs\">Revenue, peso y precio medio por noche<\/div>\n<div style=\"overflow-x:auto\"><table id=\"tN\"><\/table><\/div><\/div>\n<\/section>\n\n<section class=\"pane\" id=\"inventario\">\n<div class=\"eyebrow\">Cartera<\/div><h2>Inventario operativo<\/h2>\n<p class=\"lead\">Alojamientos con actividad comercial mes a mes.<\/p>\n<div class=\"card\"><h3>Alojamientos activos<\/h3><div class=\"cs\">Unidades con reservas cada mes<\/div><div class=\"ch\"><canvas id=\"i1\"><\/canvas><\/div><\/div>\n<div class=\"card\"><h3>Disponibilidad por mes<\/h3><div class=\"cs\">Selecciona a&ntilde;o y mes<\/div>\n<div class=\"ctl\"><select id=\"selIY\"><\/select><select id=\"selIM\"><\/select><\/div>\n<div id=\"boxI\"><\/div><\/div>\n<\/section>\n\n<\/div><\/main>\n<footer><div class=\"wrap\"><div class=\"fl\"><div class=\"lg\">Villas Rivero<\/div>\n<div>Documento interno &middot; Datos de gesti&oacute;n propia &middot; <span id=\"fGen\"><\/span><\/div><\/div><\/div><\/footer>\n<script>\nconst D={\"detalle\": [{\"nombre\": \"AP 3 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 666, \"noches\": 9, \"res\": 2, \"dias\": 30.0}, \"7\": {\"rev\": 1685, \"noches\": 25, \"res\": 3, \"dias\": 31.0}, \"8\": {\"rev\": 2243, \"noches\": 25, \"res\": 4, \"dias\": 31.0}, \"9\": {\"rev\": 1541, \"noches\": 21, \"res\": 4, \"dias\": 30.0}, \"10\": {\"rev\": 1881, \"noches\": 25, \"res\": 4, \"dias\": 31.0}, \"11\": {\"rev\": 2419, \"noches\": 27, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 3309, \"noches\": 27, \"res\": 3, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 666}, \"7\": {\"Turoperador\": 1685}, \"8\": {\"Booking\": 962, \"Turoperador\": 1281}, \"9\": {\"Airbnb\": 168, \"Turoperador\": 1372}, \"10\": {\"Airbnb\": 631, \"Turoperador\": 1250}, \"11\": {\"Booking\": 1939, \"Turoperador\": 480}, \"12\": {\"Airbnb\": 1777, \"Booking\": 1532}}, \"canal_noches\": {\"6\": {\"Turoperador\": 9}, \"7\": {\"Turoperador\": 25}, \"8\": {\"Booking\": 10, \"Turoperador\": 15}, \"9\": {\"Airbnb\": 2, \"Turoperador\": 19}, \"10\": {\"Airbnb\": 7, \"Turoperador\": 18}, \"11\": {\"Booking\": 20, \"Turoperador\": 7}, \"12\": {\"Airbnb\": 13, \"Booking\": 14}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 3155, \"noches\": 31, \"res\": 5, \"dias\": 31.0}, \"2\": {\"rev\": 2284, \"noches\": 27, \"res\": 3, \"dias\": 28.0}, \"3\": {\"rev\": 3005, \"noches\": 31, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 2939, \"noches\": 30, \"res\": 1, \"dias\": 30.0}, \"5\": {\"rev\": 1964, \"noches\": 23, \"res\": 3, \"dias\": 31.0}, \"6\": {\"rev\": 1885, \"noches\": 28, \"res\": 4, \"dias\": 30.0}, \"7\": {\"rev\": 2015, \"noches\": 29, \"res\": 5, \"dias\": 31.0}, \"8\": {\"rev\": 2107, \"noches\": 24, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 989, \"noches\": 11, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 920, \"noches\": 10, \"res\": 1, \"dias\": 31.0}, \"11\": {\"rev\": 758, \"noches\": 7, \"res\": 1, \"dias\": 30.0}, \"12\": {\"rev\": 917, \"noches\": 7, \"res\": 1, \"dias\": 31.0}}, \"canal_mes\": {\"1\": {\"Airbnb\": 1353, \"Booking\": 271, \"Turoperador\": 1531}, \"2\": {\"Airbnb\": 414, \"Booking\": 669, \"Turoperador\": 1201}, \"3\": {\"Airbnb\": 455, \"Booking\": 1470, \"Turoperador\": 1080}, \"4\": {\"Booking\": 2939}, \"5\": {\"Airbnb\": 560, \"Booking\": 1274, \"Turoperador\": 130}, \"6\": {\"Airbnb\": 637, \"Booking\": 208, \"Turoperador\": 1040}, \"7\": {\"Airbnb\": 1303, \"Booking\": 712}, \"8\": {\"Airbnb\": 467, \"Booking\": 1640}, \"9\": {\"Airbnb\": 989}, \"10\": {\"Booking\": 920}, \"11\": {\"Airbnb\": 758}, \"12\": {\"Booking\": 917}}, \"canal_noches\": {\"1\": {\"Airbnb\": 10, \"Booking\": 2, \"Turoperador\": 19}, \"2\": {\"Airbnb\": 4, \"Booking\": 7, \"Turoperador\": 16}, \"3\": {\"Airbnb\": 4, \"Booking\": 15, \"Turoperador\": 12}, \"4\": {\"Booking\": 30}, \"5\": {\"Airbnb\": 8, \"Booking\": 13, \"Turoperador\": 2}, \"6\": {\"Airbnb\": 10, \"Booking\": 2, \"Turoperador\": 16}, \"7\": {\"Airbnb\": 19, \"Booking\": 10}, \"8\": {\"Airbnb\": 5, \"Booking\": 19}, \"9\": {\"Airbnb\": 11}, \"10\": {\"Booking\": 10}, \"11\": {\"Airbnb\": 7}, \"12\": {\"Booking\": 7}}}}, {\"nombre\": \"AP 5 - Jardines del Cura\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 552, \"noches\": 8, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 662, \"noches\": 9, \"res\": 1, \"dias\": 31.0}, \"8\": {\"rev\": 1274, \"noches\": 16, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 1686, \"noches\": 24, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 1253, \"noches\": 17, \"res\": 4, \"dias\": 31.0}, \"11\": {\"rev\": 2550, \"noches\": 30, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 2548, \"noches\": 21, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 552}, \"7\": {\"Turoperador\": 662}, \"8\": {\"Turoperador\": 1274}, \"9\": {\"Turoperador\": 1686}, \"10\": {\"Airbnb\": 250, \"Turoperador\": 1003}, \"11\": {\"Booking\": 627, \"Turoperador\": 1924}, \"12\": {\"Airbnb\": 1770, \"Booking\": 251, \"Turoperador\": 527}}, \"canal_noches\": {\"6\": {\"Turoperador\": 8}, \"7\": {\"Turoperador\": 9}, \"8\": {\"Turoperador\": 16}, \"9\": {\"Turoperador\": 24}, \"10\": {\"Airbnb\": 2, \"Turoperador\": 15}, \"11\": {\"Booking\": 5, \"Turoperador\": 25}, \"12\": {\"Airbnb\": 12, \"Booking\": 2, \"Turoperador\": 7}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2797, \"noches\": 30, \"res\": 5, \"dias\": 31.0}, \"2\": {\"rev\": 2098, \"noches\": 25, \"res\": 5, \"dias\": 28.0}, \"3\": {\"rev\": 2690, \"noches\": 28, \"res\": 2, \"dias\": 31.0}, \"4\": {\"rev\": 1722, \"noches\": 23, \"res\": 4, \"dias\": 30.0}, \"5\": {\"rev\": 982, \"noches\": 14, \"res\": 3, \"dias\": 31.0}, \"6\": {\"rev\": 560, \"noches\": 9, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 1974, \"noches\": 25, \"res\": 3, \"dias\": 31.0}, \"8\": {\"rev\": 2632, \"noches\": 28, \"res\": 1, \"dias\": 31.0}, \"9\": {\"rev\": 1723, \"noches\": 23, \"res\": 4, \"dias\": 30.0}, \"10\": {\"rev\": 1659, \"noches\": 30, \"res\": 3, \"dias\": 31.0}, \"11\": {\"rev\": 1576, \"noches\": 18, \"res\": 2, \"dias\": 30.0}, \"12\": {\"rev\": 2157, \"noches\": 14, \"res\": 1, \"dias\": 31.0}}, \"canal_mes\": {\"1\": {\"Airbnb\": 1340, \"Turoperador\": 1457}, \"2\": {\"Airbnb\": 346, \"Turoperador\": 1752}, \"3\": {\"Turoperador\": 2690}, \"4\": {\"Booking\": 372, \"Turoperador\": 1349}, \"5\": {\"Airbnb\": 383, \"Booking\": 74, \"Turoperador\": 525}, \"6\": {\"Airbnb\": 560}, \"7\": {\"Airbnb\": 994, \"Turoperador\": 980}, \"8\": {\"Airbnb\": 2632}, \"9\": {\"Airbnb\": 1123, \"Turoperador\": 600}, \"10\": {\"Airbnb\": 399, \"Turoperador\": 1260}, \"11\": {\"Booking\": 1576, \"Turoperador\": 0}, \"12\": {\"Booking\": 2157}}, \"canal_noches\": {\"1\": {\"Airbnb\": 12, \"Turoperador\": 18}, \"2\": {\"Airbnb\": 3, \"Turoperador\": 22}, \"3\": {\"Turoperador\": 28}, \"4\": {\"Booking\": 5, \"Turoperador\": 18}, \"5\": {\"Airbnb\": 6, \"Booking\": 1, \"Turoperador\": 7}, \"6\": {\"Airbnb\": 9}, \"7\": {\"Airbnb\": 11, \"Turoperador\": 14}, \"8\": {\"Airbnb\": 28}, \"9\": {\"Airbnb\": 15, \"Turoperador\": 8}, \"10\": {\"Airbnb\": 5, \"Turoperador\": 25}, \"11\": {\"Booking\": 14, \"Turoperador\": 4}, \"12\": {\"Booking\": 14}}}}, {\"nombre\": \"AP 6 - Jardines del Cura\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 690, \"noches\": 10, \"res\": 2, \"dias\": 30.0}, \"7\": {\"rev\": 2054, \"noches\": 30, \"res\": 5, \"dias\": 31.0}, \"8\": {\"rev\": 1273, \"noches\": 15, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 955, \"noches\": 14, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 1787, \"noches\": 28, \"res\": 3, \"dias\": 31.0}, \"11\": {\"rev\": 2033, \"noches\": 26, \"res\": 3, \"dias\": 30.0}, \"12\": {\"rev\": 2564, \"noches\": 31, \"res\": 5, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 690}, \"7\": {\"Turoperador\": 2054}, \"8\": {\"Turoperador\": 1273}, \"9\": {\"Turoperador\": 955}, \"10\": {\"Airbnb\": 1373, \"Turoperador\": 414}, \"11\": {\"Booking\": 642, \"Turoperador\": 1391}, \"12\": {\"Airbnb\": 1642, \"Turoperador\": 923}}, \"canal_noches\": {\"6\": {\"Turoperador\": 10}, \"7\": {\"Turoperador\": 30}, \"8\": {\"Turoperador\": 15}, \"9\": {\"Turoperador\": 14}, \"10\": {\"Airbnb\": 21, \"Turoperador\": 7}, \"11\": {\"Booking\": 7, \"Turoperador\": 19}, \"12\": {\"Airbnb\": 19, \"Turoperador\": 12}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2735, \"noches\": 28, \"res\": 3, \"dias\": 31.0}, \"2\": {\"rev\": 2906, \"noches\": 26, \"res\": 4, \"dias\": 28.0}, \"3\": {\"rev\": 2603, \"noches\": 30, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 2054, \"noches\": 22, \"res\": 4, \"dias\": 30.0}, \"5\": {\"rev\": 796, \"noches\": 11, \"res\": 2, \"dias\": 31.0}, \"6\": {\"rev\": 523, \"noches\": 8, \"res\": 3, \"dias\": 30.0}, \"7\": {\"rev\": 1863, \"noches\": 28, \"res\": 4, \"dias\": 31.0}, \"8\": {\"rev\": 1936, \"noches\": 23, \"res\": 2, \"dias\": 31.0}, \"9\": {\"rev\": 1372, \"noches\": 21, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 665, \"noches\": 14, \"res\": 2, \"dias\": 31.0}, \"11\": {\"rev\": 665, \"noches\": 14, \"res\": 2, \"dias\": 30.0}, \"12\": {\"rev\": 1188, \"noches\": 8, \"res\": 1, \"dias\": 31.0}}, \"canal_mes\": {\"1\": {\"Airbnb\": 2045, \"Turoperador\": 690}, \"2\": {\"Airbnb\": 1916, \"Turoperador\": 990}, \"3\": {\"Booking\": 73, \"Turoperador\": 2530}, \"4\": {\"Airbnb\": 700, \"Booking\": 1354}, \"5\": {\"Airbnb\": 796}, \"6\": {\"Airbnb\": 252, \"Turoperador\": 271}, \"7\": {\"Airbnb\": 795, \"Turoperador\": 1069}, \"8\": {\"Airbnb\": 1936}, \"9\": {\"Booking\": 882, \"Turoperador\": 490}, \"10\": {\"Turoperador\": 665}, \"11\": {\"Turoperador\": 665}, \"12\": {\"Airbnb\": 1188}}, \"canal_noches\": {\"1\": {\"Airbnb\": 17, \"Turoperador\": 11}, \"2\": {\"Airbnb\": 15, \"Turoperador\": 11}, \"3\": {\"Booking\": 1, \"Turoperador\": 29}, \"4\": {\"Airbnb\": 9, \"Booking\": 13}, \"5\": {\"Airbnb\": 11}, \"6\": {\"Airbnb\": 4, \"Turoperador\": 4}, \"7\": {\"Airbnb\": 11, \"Turoperador\": 17}, \"8\": {\"Airbnb\": 23}, \"9\": {\"Booking\": 14, \"Turoperador\": 7}, \"10\": {\"Turoperador\": 14}, \"11\": {\"Turoperador\": 14}, \"12\": {\"Airbnb\": 8}}}}, {\"nombre\": \"AP 3 - Jardines del Cura\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 570, \"noches\": 6, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 1522, \"noches\": 21, \"res\": 2, \"dias\": 31.0}, \"8\": {\"rev\": 1597, \"noches\": 21, \"res\": 4, \"dias\": 31.0}, \"9\": {\"rev\": 1726, \"noches\": 26, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 1435, \"noches\": 21, \"res\": 3, \"dias\": 31.0}, \"11\": {\"rev\": 2903, \"noches\": 29, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 2916, \"noches\": 24, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 570}, \"7\": {\"Turoperador\": 1522}, \"8\": {\"Turoperador\": 1597}, \"9\": {\"Turoperador\": 1726}, \"10\": {\"Airbnb\": 503, \"Turoperador\": 931}, \"11\": {\"Airbnb\": 916, \"Booking\": 627, \"Turoperador\": 1360}, \"12\": {\"Airbnb\": 1850, \"Booking\": 251, \"Turoperador\": 815}}, \"canal_noches\": {\"6\": {\"Turoperador\": 6}, \"7\": {\"Turoperador\": 21}, \"8\": {\"Turoperador\": 21}, \"9\": {\"Turoperador\": 26}, \"10\": {\"Airbnb\": 7, \"Turoperador\": 14}, \"11\": {\"Airbnb\": 8, \"Booking\": 5, \"Turoperador\": 16}, \"12\": {\"Airbnb\": 12, \"Booking\": 2, \"Turoperador\": 10}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2966, \"noches\": 29, \"res\": 4, \"dias\": 31.0}, \"2\": {\"rev\": 2621, \"noches\": 27, \"res\": 5, \"dias\": 28.0}, \"3\": {\"rev\": 2178, \"noches\": 27, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 1929, \"noches\": 24, \"res\": 4, \"dias\": 30.0}, \"5\": {\"rev\": 363, \"noches\": 6, \"res\": 2, \"dias\": 31.0}, \"6\": {\"rev\": 700, \"noches\": 10, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 2195, \"noches\": 28, \"res\": 4, \"dias\": 31.0}, \"8\": {\"rev\": 2415, \"noches\": 27, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 646, \"noches\": 7, \"res\": 1, \"dias\": 30.0}, \"10\": {\"rev\": 600, \"noches\": 8, \"res\": 1, \"dias\": 31.0}, \"11\": {\"rev\": 1210, \"noches\": 10, \"res\": 1, \"dias\": 30.0}, \"12\": {\"rev\": 1460, \"noches\": 9, \"res\": 1, \"dias\": 31.0}}, \"canal_mes\": {\"1\": {\"Airbnb\": 1612, \"Turoperador\": 1354}, \"2\": {\"Airbnb\": 590, \"Booking\": 529, \"Turoperador\": 1502}, \"3\": {\"Booking\": 318, \"Turoperador\": 1860}, \"4\": {\"Airbnb\": 708, \"Turoperador\": 1221}, \"5\": {\"Booking\": 168, \"Turoperador\": 195}, \"6\": {\"Turoperador\": 700}, \"7\": {\"Airbnb\": 1635, \"Turoperador\": 560}, \"8\": {\"Airbnb\": 635, \"Booking\": 1080, \"Turoperador\": 700}, \"9\": {\"Booking\": 646}, \"10\": {\"Turoperador\": 600}, \"11\": {\"Airbnb\": 1210}, \"12\": {\"Airbnb\": 1460}}, \"canal_noches\": {\"1\": {\"Airbnb\": 11, \"Turoperador\": 18}, \"2\": {\"Airbnb\": 5, \"Booking\": 5, \"Turoperador\": 17}, \"3\": {\"Booking\": 3, \"Turoperador\": 24}, \"4\": {\"Airbnb\": 9, \"Turoperador\": 15}, \"5\": {\"Booking\": 3, \"Turoperador\": 3}, \"6\": {\"Turoperador\": 10}, \"7\": {\"Airbnb\": 20, \"Turoperador\": 8}, \"8\": {\"Airbnb\": 7, \"Booking\": 10, \"Turoperador\": 10}, \"9\": {\"Booking\": 7}, \"10\": {\"Turoperador\": 8}, \"11\": {\"Airbnb\": 10}, \"12\": {\"Airbnb\": 9}}}}, {\"nombre\": \"AP 8 - Jardines del Cura\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 1096, \"noches\": 16, \"res\": 2, \"dias\": 30.0}, \"7\": {\"rev\": 1797, \"noches\": 24, \"res\": 4, \"dias\": 31.0}, \"8\": {\"rev\": 1355, \"noches\": 18, \"res\": 4, \"dias\": 31.0}, \"9\": {\"rev\": 1433, \"noches\": 21, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 1476, \"noches\": 25, \"res\": 4, \"dias\": 31.0}, \"11\": {\"rev\": 2111, \"noches\": 28, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 2605, \"noches\": 29, \"res\": 5, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 1096}, \"7\": {\"Booking\": 259, \"Turoperador\": 1538}, \"8\": {\"Turoperador\": 1355}, \"9\": {\"Turoperador\": 1433}, \"10\": {\"Airbnb\": 255, \"Booking\": 396, \"Turoperador\": 825}, \"11\": {\"Airbnb\": 411, \"Booking\": 459, \"Turoperador\": 1241}, \"12\": {\"Airbnb\": 1490, \"Booking\": 184, \"Turoperador\": 932}}, \"canal_noches\": {\"6\": {\"Turoperador\": 16}, \"7\": {\"Booking\": 3, \"Turoperador\": 21}, \"8\": {\"Turoperador\": 18}, \"9\": {\"Turoperador\": 21}, \"10\": {\"Airbnb\": 5, \"Booking\": 7, \"Turoperador\": 13}, \"11\": {\"Airbnb\": 4, \"Booking\": 5, \"Turoperador\": 19}, \"12\": {\"Airbnb\": 15, \"Booking\": 2, \"Turoperador\": 12}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2471, \"noches\": 30, \"res\": 5, \"dias\": 31.0}, \"2\": {\"rev\": 1926, \"noches\": 26, \"res\": 4, \"dias\": 28.0}, \"3\": {\"rev\": 2497, \"noches\": 29, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 1854, \"noches\": 26, \"res\": 3, \"dias\": 30.0}, \"5\": {\"rev\": 775, \"noches\": 13, \"res\": 3, \"dias\": 31.0}, \"6\": {\"rev\": 715, \"noches\": 11, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 1397, \"noches\": 23, \"res\": 5, \"dias\": 31.0}, \"8\": {\"rev\": 1786, \"noches\": 24, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 1552, \"noches\": 26, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 180, \"noches\": 11, \"res\": 2, \"dias\": 31.0}, \"11\": {\"rev\": 720, \"noches\": 8, \"res\": 1, \"dias\": 30.0}, \"12\": {\"rev\": 1807, \"noches\": 17, \"res\": 3, \"dias\": 31.0}}, \"canal_mes\": {\"1\": {\"Airbnb\": 1002, \"Turoperador\": 1469}, \"2\": {\"Turoperador\": 1926}, \"3\": {\"Airbnb\": 854, \"Booking\": 493, \"Turoperador\": 1150}, \"4\": {\"Airbnb\": 309, \"Booking\": 985, \"Turoperador\": 560}, \"5\": {\"Airbnb\": 775}, \"6\": {\"Turoperador\": 715}, \"7\": {\"Airbnb\": 795, \"Booking\": 408, \"Turoperador\": 195}, \"8\": {\"Airbnb\": 911, \"Booking\": 875}, \"9\": {\"Airbnb\": 651, \"Booking\": 901}, \"10\": {\"Turoperador\": 180}, \"11\": {\"Turoperador\": 720}, \"12\": {\"Airbnb\": 1807}}, \"canal_noches\": {\"1\": {\"Airbnb\": 10, \"Turoperador\": 20}, \"2\": {\"Turoperador\": 26}, \"3\": {\"Airbnb\": 9, \"Booking\": 7, \"Turoperador\": 13}, \"4\": {\"Airbnb\": 5, \"Booking\": 14, \"Turoperador\": 7}, \"5\": {\"Airbnb\": 13}, \"6\": {\"Turoperador\": 11}, \"7\": {\"Airbnb\": 13, \"Booking\": 7, \"Turoperador\": 3}, \"8\": {\"Airbnb\": 12, \"Booking\": 12}, \"9\": {\"Airbnb\": 12, \"Booking\": 14}, \"10\": {\"Turoperador\": 11}, \"11\": {\"Turoperador\": 8}, \"12\": {\"Airbnb\": 17}}}}, {\"nombre\": \"AP 2 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 670, \"noches\": 8, \"res\": 2, \"dias\": 30.0}, \"7\": {\"rev\": 1480, \"noches\": 22, \"res\": 3, \"dias\": 31.0}, \"8\": {\"rev\": 1709, \"noches\": 26, \"res\": 4, \"dias\": 31.0}, \"9\": {\"rev\": 1577, \"noches\": 23, \"res\": 7, \"dias\": 30.0}, \"10\": {\"rev\": 1497, \"noches\": 22, \"res\": 5, \"dias\": 31.0}, \"11\": {\"rev\": 2249, \"noches\": 27, \"res\": 5, \"dias\": 30.0}, \"12\": {\"rev\": 2689, \"noches\": 29, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 670}, \"7\": {\"Booking\": 200, \"Turoperador\": 1281}, \"8\": {\"Turoperador\": 1709}, \"9\": {\"Booking\": 312, \"Turoperador\": 1265}, \"10\": {\"Airbnb\": 189, \"Booking\": 1308}, \"11\": {\"Airbnb\": 704, \"Booking\": 1546}, \"12\": {\"Airbnb\": 1809, \"Booking\": 880}}, \"canal_noches\": {\"6\": {\"Turoperador\": 8}, \"7\": {\"Booking\": 2, \"Turoperador\": 20}, \"8\": {\"Turoperador\": 26}, \"9\": {\"Booking\": 5, \"Turoperador\": 18}, \"10\": {\"Airbnb\": 3, \"Booking\": 19}, \"11\": {\"Airbnb\": 8, \"Booking\": 19}, \"12\": {\"Airbnb\": 22, \"Booking\": 7}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2453, \"noches\": 29, \"res\": 4, \"dias\": 31.0}, \"2\": {\"rev\": 1948, \"noches\": 28, \"res\": 5, \"dias\": 28.0}, \"3\": {\"rev\": 1906, \"noches\": 29, \"res\": 5, \"dias\": 31.0}, \"4\": {\"rev\": 2031, \"noches\": 25, \"res\": 8, \"dias\": 30.0}, \"5\": {\"rev\": 1608, \"noches\": 28, \"res\": 4, \"dias\": 31.0}, \"6\": {\"rev\": 1361, \"noches\": 23, \"res\": 4, \"dias\": 30.0}, \"7\": {\"rev\": 1735, \"noches\": 26, \"res\": 6, \"dias\": 31.0}, \"8\": {\"rev\": 1713, \"noches\": 24, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 1679, \"noches\": 24, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 958, \"noches\": 13, \"res\": 2, \"dias\": 31.0}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"1\": {\"Airbnb\": 388, \"Booking\": 391, \"Turoperador\": 1675}, \"2\": {\"Airbnb\": 1374, \"Turoperador\": 574}, \"3\": {\"Airbnb\": 178, \"Booking\": 1008, \"Turoperador\": 720}, \"4\": {\"Airbnb\": 454, \"Booking\": 1329, \"Turoperador\": 248}, \"5\": {\"Airbnb\": 137, \"Booking\": 784, \"Turoperador\": 688}, \"6\": {\"Airbnb\": 886, \"Booking\": 475}, \"7\": {\"Airbnb\": 939, \"Booking\": 215, \"Turoperador\": 582}, \"8\": {\"Airbnb\": 1390, \"Turoperador\": 323}, \"9\": {\"Airbnb\": 1029, \"Booking\": 650}, \"10\": {\"Airbnb\": 493, \"Booking\": 465}}, \"canal_noches\": {\"1\": {\"Airbnb\": 5, \"Booking\": 6, \"Turoperador\": 18}, \"2\": {\"Airbnb\": 17, \"Turoperador\": 11}, \"3\": {\"Airbnb\": 2, \"Booking\": 12, \"Turoperador\": 15}, \"4\": {\"Airbnb\": 6, \"Booking\": 15, \"Turoperador\": 4}, \"5\": {\"Airbnb\": 2, \"Booking\": 14, \"Turoperador\": 12}, \"6\": {\"Airbnb\": 15, \"Booking\": 8}, \"7\": {\"Airbnb\": 14, \"Booking\": 3, \"Turoperador\": 9}, \"8\": {\"Airbnb\": 19, \"Turoperador\": 5}, \"9\": {\"Airbnb\": 15, \"Booking\": 9}, \"10\": {\"Airbnb\": 7, \"Booking\": 6}}}}, {\"nombre\": \"AP 6 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 340, \"noches\": 5, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 996, \"noches\": 14, \"res\": 2, \"dias\": 31.0}, \"8\": {\"rev\": 1905, \"noches\": 26, \"res\": 5, \"dias\": 31.0}, \"9\": {\"rev\": 1775, \"noches\": 25, \"res\": 4, \"dias\": 30.0}, \"10\": {\"rev\": 1402, \"noches\": 23, \"res\": 3, \"dias\": 31.0}, \"11\": {\"rev\": 2261, \"noches\": 26, \"res\": 5, \"dias\": 30.0}, \"12\": {\"rev\": 2501, \"noches\": 26, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 340}, \"7\": {\"Booking\": 358, \"Turoperador\": 638}, \"8\": {\"Booking\": 733, \"Turoperador\": 1172}, \"9\": {\"Booking\": 441, \"Turoperador\": 1334}, \"10\": {\"Turoperador\": 1402}, \"11\": {\"Airbnb\": 264, \"Booking\": 770, \"Turoperador\": 1227}, \"12\": {\"Airbnb\": 1057, \"Booking\": 241, \"Turoperador\": 1202}}, \"canal_noches\": {\"6\": {\"Turoperador\": 5}, \"7\": {\"Booking\": 4, \"Turoperador\": 10}, \"8\": {\"Booking\": 9, \"Turoperador\": 17}, \"9\": {\"Booking\": 6, \"Turoperador\": 19}, \"10\": {\"Turoperador\": 23}, \"11\": {\"Airbnb\": 3, \"Booking\": 7, \"Turoperador\": 16}, \"12\": {\"Airbnb\": 12, \"Booking\": 2, \"Turoperador\": 12}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2195, \"noches\": 31, \"res\": 1, \"dias\": 31.0}, \"2\": {\"rev\": 1982, \"noches\": 28, \"res\": 1, \"dias\": 28.0}, \"3\": {\"rev\": 2610, \"noches\": 30, \"res\": 6, \"dias\": 31.0}, \"4\": {\"rev\": 2315, \"noches\": 28, \"res\": 5, \"dias\": 30.0}, \"5\": {\"rev\": 1159, \"noches\": 17, \"res\": 4, \"dias\": 31.0}, \"6\": {\"rev\": 1040, \"noches\": 18, \"res\": 4, \"dias\": 30.0}, \"7\": {\"rev\": 1823, \"noches\": 24, \"res\": 4, \"dias\": 31.0}, \"8\": {\"rev\": 2469, \"noches\": 27, \"res\": 4, \"dias\": 31.0}, \"9\": {\"rev\": 1075, \"noches\": 15, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"1\": {\"Turoperador\": 2195}, \"2\": {\"Turoperador\": 1982}, \"3\": {\"Airbnb\": 1117, \"Booking\": 487, \"Turoperador\": 1006}, \"4\": {\"Airbnb\": 850, \"Booking\": 870, \"Turoperador\": 595}, \"5\": {\"Airbnb\": 285, \"Booking\": 384, \"Turoperador\": 490}, \"6\": {\"Airbnb\": 366, \"Booking\": 570, \"Motor propio\": 104}, \"7\": {\"Booking\": 1406, \"Motor propio\": 417}, \"8\": {\"Airbnb\": 1342, \"Booking\": 567, \"Turoperador\": 560}, \"9\": {\"Booking\": 95, \"Turoperador\": 980}}, \"canal_noches\": {\"1\": {\"Turoperador\": 31}, \"2\": {\"Turoperador\": 28}, \"3\": {\"Airbnb\": 14, \"Booking\": 4, \"Turoperador\": 12}, \"4\": {\"Airbnb\": 11, \"Booking\": 10, \"Turoperador\": 7}, \"5\": {\"Airbnb\": 5, \"Booking\": 5, \"Turoperador\": 7}, \"6\": {\"Airbnb\": 7, \"Booking\": 9, \"Motor propio\": 2}, \"7\": {\"Booking\": 16, \"Motor propio\": 8}, \"8\": {\"Airbnb\": 14, \"Booking\": 6, \"Turoperador\": 7}, \"9\": {\"Booking\": 1, \"Turoperador\": 14}}}}, {\"nombre\": \"AP 4 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 263, \"noches\": 4, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 1418, \"noches\": 19, \"res\": 3, \"dias\": 31.0}, \"8\": {\"rev\": 1750, \"noches\": 28, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 1162, \"noches\": 20, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 1792, \"noches\": 30, \"res\": 3, \"dias\": 31.0}, \"11\": {\"rev\": 2389, \"noches\": 24, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 2731, \"noches\": 26, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 263}, \"7\": {\"Turoperador\": 1418}, \"8\": {\"Turoperador\": 1750}, \"9\": {\"Turoperador\": 1162}, \"10\": {\"Turoperador\": 1792}, \"11\": {\"Booking\": 1545, \"Turoperador\": 843}, \"12\": {\"Airbnb\": 1162, \"Booking\": 668, \"Turoperador\": 900}}, \"canal_noches\": {\"6\": {\"Turoperador\": 4}, \"7\": {\"Turoperador\": 19}, \"8\": {\"Turoperador\": 28}, \"9\": {\"Turoperador\": 20}, \"10\": {\"Turoperador\": 30}, \"11\": {\"Booking\": 13, \"Turoperador\": 11}, \"12\": {\"Airbnb\": 8, \"Booking\": 8, \"Turoperador\": 10}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 3061, \"noches\": 31, \"res\": 5, \"dias\": 31.0}, \"2\": {\"rev\": 2220, \"noches\": 25, \"res\": 4, \"dias\": 28.0}, \"3\": {\"rev\": 2190, \"noches\": 26, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 2163, \"noches\": 26, \"res\": 3, \"dias\": 30.0}, \"5\": {\"rev\": 758, \"noches\": 13, \"res\": 2, \"dias\": 31.0}, \"6\": {\"rev\": 934, \"noches\": 13, \"res\": 3, \"dias\": 30.0}, \"7\": {\"rev\": 1419, \"noches\": 21, \"res\": 4, \"dias\": 31.0}, \"8\": {\"rev\": 1520, \"noches\": 22, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 1382, \"noches\": 20, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"1\": {\"Airbnb\": 1017, \"Booking\": 189, \"Turoperador\": 1855}, \"2\": {\"Airbnb\": 285, \"Turoperador\": 1935}, \"3\": {\"Airbnb\": 287, \"Booking\": 1543, \"Turoperador\": 360}, \"4\": {\"Booking\": 1241, \"Turoperador\": 922}, \"5\": {\"Booking\": 189, \"Turoperador\": 569}, \"6\": {\"Airbnb\": 239, \"Booking\": 310, \"Turoperador\": 385}, \"7\": {\"Airbnb\": 1209, \"Turoperador\": 210}, \"8\": {\"Turoperador\": 1520}, \"9\": {\"Airbnb\": 478, \"Booking\": 514, \"Turoperador\": 390}}, \"canal_noches\": {\"1\": {\"Airbnb\": 7, \"Booking\": 3, \"Turoperador\": 21}, \"2\": {\"Airbnb\": 3, \"Turoperador\": 22}, \"3\": {\"Airbnb\": 3, \"Booking\": 18, \"Turoperador\": 5}, \"4\": {\"Booking\": 13, \"Turoperador\": 13}, \"5\": {\"Booking\": 3, \"Turoperador\": 10}, \"6\": {\"Airbnb\": 4, \"Booking\": 5, \"Turoperador\": 4}, \"7\": {\"Airbnb\": 18, \"Turoperador\": 3}, \"8\": {\"Turoperador\": 22}, \"9\": {\"Airbnb\": 7, \"Booking\": 7, \"Turoperador\": 6}}}}, {\"nombre\": \"AP 5 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 811, \"noches\": 19, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 1447, \"noches\": 31, \"res\": 2, \"dias\": 31.0}, \"8\": {\"rev\": 1467, \"noches\": 18, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 1342, \"noches\": 21, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 1914, \"noches\": 23, \"res\": 3, \"dias\": 31.0}, \"11\": {\"rev\": 2557, \"noches\": 26, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 2031, \"noches\": 18, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 811}, \"7\": {\"Turoperador\": 1447}, \"8\": {\"Turoperador\": 1467}, \"9\": {\"Turoperador\": 1342}, \"10\": {\"Airbnb\": 980, \"Booking\": 489, \"Turoperador\": 445}, \"11\": {\"Airbnb\": 1877, \"Turoperador\": 680}, \"12\": {\"Airbnb\": 1341, \"Booking\": 690}}, \"canal_noches\": {\"6\": {\"Turoperador\": 19}, \"7\": {\"Turoperador\": 31}, \"8\": {\"Turoperador\": 18}, \"9\": {\"Turoperador\": 21}, \"10\": {\"Airbnb\": 9, \"Booking\": 6, \"Turoperador\": 8}, \"11\": {\"Airbnb\": 18, \"Turoperador\": 8}, \"12\": {\"Airbnb\": 9, \"Booking\": 9}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2780, \"noches\": 27, \"res\": 4, \"dias\": 31.0}, \"2\": {\"rev\": 2162, \"noches\": 24, \"res\": 5, \"dias\": 28.0}, \"3\": {\"rev\": 2502, \"noches\": 26, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 1620, \"noches\": 20, \"res\": 3, \"dias\": 30.0}, \"5\": {\"rev\": 934, \"noches\": 15, \"res\": 3, \"dias\": 31.0}, \"6\": {\"rev\": 1163, \"noches\": 15, \"res\": 4, \"dias\": 30.0}, \"7\": {\"rev\": 1988, \"noches\": 27, \"res\": 5, \"dias\": 31.0}, \"8\": {\"rev\": 1555, \"noches\": 16, \"res\": 2, \"dias\": 31.0}, \"9\": {\"rev\": 770, \"noches\": 11, \"res\": 1, \"dias\": 30.0}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"1\": {\"Airbnb\": 238, \"Booking\": 1346, \"Turoperador\": 1197}, \"2\": {\"Airbnb\": 287, \"Booking\": 795, \"Turoperador\": 1080}, \"3\": {\"Airbnb\": 1437, \"Turoperador\": 1065}, \"4\": {\"Airbnb\": 450, \"Turoperador\": 1170}, \"5\": {\"Airbnb\": 654, \"Turoperador\": 280}, \"6\": {\"Airbnb\": 1163}, \"7\": {\"Airbnb\": 1592, \"Booking\": 396}, \"8\": {\"Airbnb\": 910, \"Booking\": 645}, \"9\": {\"Turoperador\": 770}}, \"canal_noches\": {\"1\": {\"Airbnb\": 3, \"Booking\": 10, \"Turoperador\": 14}, \"2\": {\"Airbnb\": 3, \"Booking\": 9, \"Turoperador\": 12}, \"3\": {\"Airbnb\": 14, \"Turoperador\": 12}, \"4\": {\"Airbnb\": 5, \"Turoperador\": 15}, \"5\": {\"Airbnb\": 11, \"Turoperador\": 4}, \"6\": {\"Airbnb\": 15}, \"7\": {\"Airbnb\": 23, \"Booking\": 4}, \"8\": {\"Airbnb\": 9, \"Booking\": 7}, \"9\": {\"Turoperador\": 11}}}}, {\"nombre\": \"AP 7 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"7\": {\"rev\": 638, \"noches\": 10, \"res\": 1, \"dias\": 31.0}, \"8\": {\"rev\": 336, \"noches\": 4, \"res\": 1, \"dias\": 31.0}, \"9\": {\"rev\": 547, \"noches\": 7, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 1424, \"noches\": 17, \"res\": 4, \"dias\": 31.0}, \"11\": {\"rev\": 2151, \"noches\": 27, \"res\": 3, \"dias\": 30.0}, \"12\": {\"rev\": 2756, \"noches\": 27, \"res\": 3, \"dias\": 31.0}}, \"canal_mes\": {\"7\": {\"Turoperador\": 638}, \"8\": {\"Turoperador\": 336}, \"9\": {\"Airbnb\": 372, \"Booking\": 175}, \"10\": {\"Airbnb\": 418, \"Booking\": 1006}, \"11\": {\"Booking\": 1440, \"Turoperador\": 711}, \"12\": {\"Booking\": 1849, \"Turoperador\": 907}}, \"canal_noches\": {\"7\": {\"Turoperador\": 10}, \"8\": {\"Turoperador\": 4}, \"9\": {\"Airbnb\": 5, \"Booking\": 2}, \"10\": {\"Airbnb\": 4, \"Booking\": 13}, \"11\": {\"Booking\": 18, \"Turoperador\": 9}, \"12\": {\"Booking\": 16, \"Turoperador\": 11}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2501, \"noches\": 27, \"res\": 3, \"dias\": 31.0}, \"2\": {\"rev\": 2245, \"noches\": 24, \"res\": 5, \"dias\": 28.0}, \"3\": {\"rev\": 2368, \"noches\": 26, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 1947, \"noches\": 23, \"res\": 5, \"dias\": 30.0}, \"5\": {\"rev\": 1484, \"noches\": 23, \"res\": 3, \"dias\": 31.0}, \"6\": {\"rev\": 1337, \"noches\": 21, \"res\": 3, \"dias\": 30.0}, \"7\": {\"rev\": 1935, \"noches\": 31, \"res\": 3, \"dias\": 31.0}, \"8\": {\"rev\": 980, \"noches\": 18, \"res\": 2, \"dias\": 31.0}, \"9\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 340, \"noches\": 4, \"res\": 1, \"dias\": 31.0}}, \"canal_mes\": {\"1\": {\"Airbnb\": 916, \"Turoperador\": 1586}, \"2\": {\"Airbnb\": 906, \"Booking\": 400, \"Turoperador\": 939}, \"3\": {\"Booking\": 100, \"Turoperador\": 2268}, \"4\": {\"Airbnb\": 547, \"Turoperador\": 1400}, \"5\": {\"Booking\": 74, \"Turoperador\": 1410}, \"6\": {\"Airbnb\": 605, \"Booking\": 732}, \"7\": {\"Airbnb\": 457, \"Booking\": 1478, \"Turoperador\": 0}, \"8\": {\"Turoperador\": 980}, \"12\": {\"Turoperador\": 340}}, \"canal_noches\": {\"1\": {\"Airbnb\": 9, \"Turoperador\": 18}, \"2\": {\"Airbnb\": 10, \"Booking\": 4, \"Turoperador\": 10}, \"3\": {\"Booking\": 1, \"Turoperador\": 25}, \"4\": {\"Airbnb\": 7, \"Turoperador\": 16}, \"5\": {\"Booking\": 1, \"Turoperador\": 22}, \"6\": {\"Airbnb\": 11, \"Booking\": 10}, \"7\": {\"Airbnb\": 6, \"Booking\": 22, \"Turoperador\": 3}, \"8\": {\"Turoperador\": 18}, \"12\": {\"Turoperador\": 4}}}}, {\"nombre\": \"AP 8 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"7\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"8\": {\"rev\": 554, \"noches\": 9, \"res\": 1, \"dias\": 31.0}, \"9\": {\"rev\": 598, \"noches\": 9, \"res\": 1, \"dias\": 30.0}, \"10\": {\"rev\": 1128, \"noches\": 13, \"res\": 2, \"dias\": 31.0}, \"11\": {\"rev\": 2314, \"noches\": 22, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 1982, \"noches\": 17, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"8\": {\"Turoperador\": 554}, \"9\": {\"Turoperador\": 598}, \"10\": {\"Booking\": 1128}, \"11\": {\"Booking\": 1723, \"Turoperador\": 591}, \"12\": {\"Airbnb\": 625, \"Booking\": 1177, \"Turoperador\": 180}}, \"canal_noches\": {\"8\": {\"Turoperador\": 9}, \"9\": {\"Turoperador\": 9}, \"10\": {\"Booking\": 13}, \"11\": {\"Booking\": 15, \"Turoperador\": 7}, \"12\": {\"Airbnb\": 7, \"Booking\": 7, \"Turoperador\": 3}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2735, \"noches\": 31, \"res\": 3, \"dias\": 31.0}, \"2\": {\"rev\": 2403, \"noches\": 27, \"res\": 6, \"dias\": 28.0}, \"3\": {\"rev\": 2285, \"noches\": 25, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 857, \"noches\": 11, \"res\": 3, \"dias\": 30.0}, \"5\": {\"rev\": 1148, \"noches\": 19, \"res\": 2, \"dias\": 31.0}, \"6\": {\"rev\": 1063, \"noches\": 15, \"res\": 3, \"dias\": 30.0}, \"7\": {\"rev\": 1647, \"noches\": 24, \"res\": 4, \"dias\": 31.0}, \"8\": {\"rev\": 1609, \"noches\": 17, \"res\": 2, \"dias\": 31.0}, \"9\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 1100, \"noches\": 11, \"res\": 1, \"dias\": 31.0}}, \"canal_mes\": {\"1\": {\"Booking\": 2409, \"Turoperador\": 325}, \"2\": {\"Airbnb\": 766, \"Turoperador\": 1638}, \"3\": {\"Booking\": 297, \"Turoperador\": 1268, \"VRBO\": 720}, \"4\": {\"Booking\": 297, \"Turoperador\": 560}, \"5\": {\"Airbnb\": 635, \"Booking\": 513}, \"6\": {\"Airbnb\": 573, \"Turoperador\": 490}, \"7\": {\"Airbnb\": 409, \"Booking\": 818, \"Turoperador\": 420}, \"8\": {\"Airbnb\": 1609}, \"12\": {\"Turoperador\": 1100}}, \"canal_noches\": {\"1\": {\"Booking\": 27, \"Turoperador\": 4}, \"2\": {\"Airbnb\": 8, \"Turoperador\": 19}, \"3\": {\"Booking\": 3, \"Turoperador\": 14, \"VRBO\": 8}, \"4\": {\"Booking\": 3, \"Turoperador\": 8}, \"5\": {\"Airbnb\": 11, \"Booking\": 8}, \"6\": {\"Airbnb\": 8, \"Turoperador\": 7}, \"7\": {\"Airbnb\": 6, \"Booking\": 11, \"Turoperador\": 7}, \"8\": {\"Airbnb\": 17}, \"12\": {\"Turoperador\": 11}}}}, {\"nombre\": \"AP 4 - Jardines del Cura\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 570, \"noches\": 8, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 1710, \"noches\": 23, \"res\": 3, \"dias\": 31.0}, \"8\": {\"rev\": 928, \"noches\": 11, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 1567, \"noches\": 25, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 2008, \"noches\": 28, \"res\": 5, \"dias\": 31.0}, \"11\": {\"rev\": 2131, \"noches\": 22, \"res\": 4, \"dias\": 30.0}, \"12\": {\"rev\": 2269, \"noches\": 26, \"res\": 4, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Turoperador\": 570}, \"7\": {\"Turoperador\": 1710}, \"8\": {\"Turoperador\": 928}, \"9\": {\"Turoperador\": 1567}, \"10\": {\"Booking\": 623, \"Turoperador\": 1385}, \"11\": {\"Booking\": 726, \"Turoperador\": 1405}, \"12\": {\"Booking\": 251, \"Turoperador\": 2019}}, \"canal_noches\": {\"6\": {\"Turoperador\": 8}, \"7\": {\"Turoperador\": 23}, \"8\": {\"Turoperador\": 11}, \"9\": {\"Turoperador\": 25}, \"10\": {\"Booking\": 6, \"Turoperador\": 22}, \"11\": {\"Booking\": 6, \"Turoperador\": 16}, \"12\": {\"Booking\": 2, \"Turoperador\": 24}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 3822, \"noches\": 29, \"res\": 4, \"dias\": 31.0}, \"2\": {\"rev\": 2322, \"noches\": 27, \"res\": 3, \"dias\": 28.0}, \"3\": {\"rev\": 1631, \"noches\": 19, \"res\": 4, \"dias\": 31.0}, \"4\": {\"rev\": 1352, \"noches\": 18, \"res\": 3, \"dias\": 30.0}, \"5\": {\"rev\": 269, \"noches\": 2, \"res\": 1, \"dias\": 31.0}, \"6\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"7\": {\"rev\": 1401, \"noches\": 18, \"res\": 3, \"dias\": 31.0}, \"8\": {\"rev\": 1650, \"noches\": 22, \"res\": 2, \"dias\": 31.0}, \"9\": {\"rev\": 455, \"noches\": 5, \"res\": 1, \"dias\": 30.0}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"1\": {\"Airbnb\": 3025, \"Turoperador\": 797}, \"2\": {\"Turoperador\": 2322}, \"3\": {\"Booking\": 512, \"Turoperador\": 1119}, \"4\": {\"Airbnb\": 302, \"Turoperador\": 1050}, \"5\": {\"Booking\": 269}, \"7\": {\"Booking\": 316, \"Turoperador\": 1085}, \"8\": {\"Turoperador\": 1650}, \"9\": {\"Booking\": 455}}, \"canal_noches\": {\"1\": {\"Airbnb\": 20, \"Turoperador\": 9}, \"2\": {\"Turoperador\": 27}, \"3\": {\"Booking\": 5, \"Turoperador\": 14}, \"4\": {\"Airbnb\": 4, \"Turoperador\": 14}, \"5\": {\"Booking\": 2}, \"7\": {\"Booking\": 3, \"Turoperador\": 15}, \"8\": {\"Turoperador\": 22}, \"9\": {\"Booking\": 5}}}}, {\"nombre\": \"AP 7 - Jardines del Cura\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 365, \"noches\": 4, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 771, \"noches\": 11, \"res\": 2, \"dias\": 31.0}, \"8\": {\"rev\": 957, \"noches\": 11, \"res\": 2, \"dias\": 31.0}, \"9\": {\"rev\": 513, \"noches\": 8, \"res\": 2, \"dias\": 30.0}, \"10\": {\"rev\": 1425, \"noches\": 21, \"res\": 3, \"dias\": 31.0}, \"11\": {\"rev\": 2446, \"noches\": 26, \"res\": 5, \"dias\": 30.0}, \"12\": {\"rev\": 2630, \"noches\": 26, \"res\": 5, \"dias\": 31.0}}, \"canal_mes\": {\"6\": {\"Booking\": 365}, \"7\": {\"Turoperador\": 771}, \"8\": {\"Turoperador\": 957}, \"9\": {\"Turoperador\": 513}, \"10\": {\"Airbnb\": 1425}, \"11\": {\"Airbnb\": 1027, \"Booking\": 1419}, \"12\": {\"Airbnb\": 2446, \"Booking\": 184}}, \"canal_noches\": {\"6\": {\"Booking\": 4}, \"7\": {\"Turoperador\": 11}, \"8\": {\"Turoperador\": 11}, \"9\": {\"Turoperador\": 8}, \"10\": {\"Airbnb\": 21}, \"11\": {\"Airbnb\": 12, \"Booking\": 14}, \"12\": {\"Airbnb\": 24, \"Booking\": 2}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 2601, \"noches\": 29, \"res\": 6, \"dias\": 31.0}, \"2\": {\"rev\": 2114, \"noches\": 26, \"res\": 7, \"dias\": 28.0}, \"3\": {\"rev\": 2016, \"noches\": 31, \"res\": 7, \"dias\": 31.0}, \"4\": {\"rev\": 629, \"noches\": 8, \"res\": 4, \"dias\": 30.0}, \"5\": {\"rev\": 117, \"noches\": 2, \"res\": 1, \"dias\": 31.0}, \"6\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"7\": {\"rev\": 657, \"noches\": 10, \"res\": 1, \"dias\": 31.0}, \"8\": {\"rev\": 925, \"noches\": 14, \"res\": 1, \"dias\": 31.0}, \"9\": {\"rev\": 563, \"noches\": 10, \"res\": 1, \"dias\": 30.0}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"1\": {\"Airbnb\": 1551, \"Turoperador\": 1050}, \"2\": {\"Airbnb\": 903, \"Booking\": 161, \"Turoperador\": 1050}, \"3\": {\"Airbnb\": 1149, \"Booking\": 867}, \"4\": {\"Airbnb\": 233, \"Booking\": 146, \"Turoperador\": 250}, \"5\": {\"Booking\": 117}, \"7\": {\"Booking\": 657}, \"8\": {\"Turoperador\": 925}, \"9\": {\"Booking\": 563}}, \"canal_noches\": {\"1\": {\"Airbnb\": 15, \"Turoperador\": 14}, \"2\": {\"Airbnb\": 10, \"Booking\": 2, \"Turoperador\": 14}, \"3\": {\"Airbnb\": 19, \"Booking\": 12}, \"4\": {\"Airbnb\": 3, \"Booking\": 2, \"Turoperador\": 3}, \"5\": {\"Booking\": 2}, \"7\": {\"Booking\": 10}, \"8\": {\"Turoperador\": 14}, \"9\": {\"Booking\": 10}}}}, {\"nombre\": \"Estudio - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"7\": {\"rev\": 573, \"noches\": 8, \"res\": 2, \"dias\": 31.0}, \"8\": {\"rev\": 1184, \"noches\": 18, \"res\": 3, \"dias\": 31.0}, \"9\": {\"rev\": 820, \"noches\": 14, \"res\": 3, \"dias\": 30.0}, \"10\": {\"rev\": 1336, \"noches\": 25, \"res\": 7, \"dias\": 31.0}, \"11\": {\"rev\": 1327, \"noches\": 16, \"res\": 2, \"dias\": 30.0}, \"12\": {\"rev\": 1619, \"noches\": 16, \"res\": 3, \"dias\": 31.0}}, \"canal_mes\": {\"7\": {\"Turoperador\": 573}, \"8\": {\"Turoperador\": 1184}, \"9\": {\"Airbnb\": 451, \"Turoperador\": 370}, \"10\": {\"Airbnb\": 1096, \"Turoperador\": 240}, \"11\": {\"Airbnb\": 1327}, \"12\": {\"Airbnb\": 1619}}, \"canal_noches\": {\"7\": {\"Turoperador\": 8}, \"8\": {\"Turoperador\": 18}, \"9\": {\"Airbnb\": 8, \"Turoperador\": 6}, \"10\": {\"Airbnb\": 21, \"Turoperador\": 4}, \"11\": {\"Airbnb\": 16}, \"12\": {\"Airbnb\": 16}}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 1850, \"noches\": 26, \"res\": 5, \"dias\": 31.0}, \"2\": {\"rev\": 1276, \"noches\": 18, \"res\": 4, \"dias\": 28.0}, \"3\": {\"rev\": 1873, \"noches\": 28, \"res\": 5, \"dias\": 31.0}, \"4\": {\"rev\": 901, \"noches\": 17, \"res\": 5, \"dias\": 30.0}, \"5\": {\"rev\": 610, \"noches\": 14, \"res\": 2, \"dias\": 31.0}, \"6\": {\"rev\": 149, \"noches\": 3, \"res\": 1, \"dias\": 30.0}, \"7\": {\"rev\": 1318, \"noches\": 26, \"res\": 6, \"dias\": 31.0}, \"8\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"9\": {\"rev\": 322, \"noches\": 5, \"res\": 1, \"dias\": 30.0}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"1\": {\"Airbnb\": 1340, \"Turoperador\": 510}, \"2\": {\"Airbnb\": 1276}, \"3\": {\"Airbnb\": 1873}, \"4\": {\"Airbnb\": 901}, \"5\": {\"Airbnb\": 610}, \"6\": {\"Airbnb\": 149}, \"7\": {\"Airbnb\": 1318}, \"9\": {\"Airbnb\": 322}}, \"canal_noches\": {\"1\": {\"Airbnb\": 20, \"Turoperador\": 6}, \"2\": {\"Airbnb\": 18}, \"3\": {\"Airbnb\": 28}, \"4\": {\"Airbnb\": 17}, \"5\": {\"Airbnb\": 14}, \"6\": {\"Airbnb\": 3}, \"7\": {\"Airbnb\": 26}, \"9\": {\"Airbnb\": 5}}}}, {\"nombre\": \"AP 9 - Oasis\", \"grupo_to\": true, \"2025\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"7\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"8\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"9\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {}, \"canal_noches\": {}}, \"2026\": {\"mensual\": {\"1\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"2\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"3\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"4\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"5\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"6\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"7\": {\"rev\": 446, \"noches\": 5, \"res\": 1, \"dias\": 31.0}, \"8\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"9\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"10\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"11\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}, \"12\": {\"rev\": 0, \"noches\": 0, \"res\": 0, \"dias\": null}}, \"canal_mes\": {\"7\": {\"Turoperador\": 446}}, \"canal_noches\": {\"7\": {\"Turoperador\": 5}}}}], \"comparables\": [\"AP 3 - Oasis\", \"AP 5 - Jardines del Cura\", \"AP 6 - Jardines del Cura\", \"AP 3 - Jardines del Cura\", \"AP 8 - Jardines del Cura\", \"AP 2 - Oasis\", \"AP 6 - Oasis\", \"AP 4 - Oasis\", \"AP 5 - Oasis\", \"AP 7 - Oasis\", \"AP 8 - Oasis\", \"AP 4 - Jardines del Cura\", \"AP 7 - Jardines del Cura\", \"Estudio - Oasis\"], \"todos\": [\"AP 3 - Oasis\", \"AP 5 - Jardines del Cura\", \"AP 6 - Jardines del Cura\", \"AP 3 - Jardines del Cura\", \"AP 8 - Jardines del Cura\", \"AP 2 - Oasis\", \"AP 6 - Oasis\", \"AP 4 - Oasis\", \"AP 5 - Oasis\", \"AP 7 - Oasis\", \"AP 8 - Oasis\", \"AP 4 - Jardines del Cura\", \"AP 7 - Jardines del Cura\", \"Estudio - Oasis\", \"AP 9 - Oasis\"], \"meta\": {\"y1\": 2025, \"y2\": 2026, \"mes_cerrado\": 6, \"generado\": \"24\/07\/2026\", \"hoy\": \"2026-07-24\"}, \"portada\": {\"meses\": [{\"m\": 6, \"n_apto\": 9, \"y2025\": {\"rev\": 5658, \"noches\": 85, \"res\": 13, \"adr\": 66.6, \"occ\": 31.5}, \"y2026\": {\"rev\": 8881, \"noches\": 135, \"res\": 25, \"adr\": 65.8, \"occ\": 50.0}}, {\"m\": 7, \"n_apto\": 13, \"y2025\": {\"rev\": 16753, \"noches\": 247, \"res\": 33, \"adr\": 67.8, \"occ\": 61.3}, \"y2026\": {\"rev\": 21720, \"noches\": 316, \"res\": 53, \"adr\": 68.7, \"occ\": 78.4}}, {\"m\": 8, \"n_apto\": 13, \"y2025\": {\"rev\": 17348, \"noches\": 228, \"res\": 40, \"adr\": 76.1, \"occ\": 56.6}, \"y2026\": {\"rev\": 23297, \"noches\": 286, \"res\": 31, \"adr\": 81.5, \"occ\": 71.0}}, {\"m\": 9, \"n_apto\": 12, \"y2025\": {\"rev\": 16097, \"noches\": 242, \"res\": 37, \"adr\": 66.5, \"occ\": 67.2}, \"y2026\": {\"rev\": 12528, \"noches\": 178, \"res\": 25, \"adr\": 70.4, \"occ\": 49.4}}], \"canal\": {\"y2025\": {\"rev\": {\"Turoperador\": 54325, \"Booking\": 3805, \"Airbnb\": 991}, \"noc\": {\"Turoperador\": 788, \"Booking\": 45, \"Airbnb\": 15}, \"adr\": {\"Turoperador\": 68.9, \"Booking\": 84.6, \"Airbnb\": 66.1}}, \"y2026\": {\"rev\": {\"Airbnb\": 33300, \"Booking\": 18214, \"Turoperador\": 19036, \"Motor propio\": 521}, \"noc\": {\"Airbnb\": 452, \"Booking\": 241, \"Turoperador\": 280, \"Motor propio\": 10}, \"adr\": {\"Airbnb\": 73.7, \"Booking\": 75.6, \"Turoperador\": 68.0, \"Motor propio\": 52.1}}}, \"porAloj\": [{\"nombre\": \"AP 3 - Oasis\", \"rev2025\": 6135, \"rev2026\": 6996, \"adr2026\": 76.0, \"dif\": 14.0}, {\"nombre\": \"AP 5 - Jardines del Cura\", \"rev2025\": 4174, \"rev2026\": 6889, \"adr2026\": 81.0, \"dif\": 65.0}, {\"nombre\": \"AP 2 - Oasis\", \"rev2025\": 5436, \"rev2026\": 6488, \"adr2026\": 66.9, \"dif\": 19.4}, {\"nombre\": \"AP 6 - Oasis\", \"rev2025\": 5016, \"rev2026\": 6407, \"adr2026\": 76.3, \"dif\": 27.7}, {\"nombre\": \"AP 3 - Jardines del Cura\", \"rev2025\": 5415, \"rev2026\": 5956, \"adr2026\": 82.7, \"dif\": 10.0}, {\"nombre\": \"AP 6 - Jardines del Cura\", \"rev2025\": 4972, \"rev2026\": 5694, \"adr2026\": 71.2, \"dif\": 14.5}, {\"nombre\": \"AP 5 - Oasis\", \"rev2025\": 5067, \"rev2026\": 5476, \"adr2026\": 79.4, \"dif\": 8.1}, {\"nombre\": \"AP 8 - Jardines del Cura\", \"rev2025\": 5681, \"rev2026\": 5450, \"adr2026\": 64.9, \"dif\": -4.1}, {\"nombre\": \"AP 4 - Oasis\", \"rev2025\": 4593, \"rev2026\": 5255, \"adr2026\": 69.1, \"dif\": 14.4}, {\"nombre\": \"AP 4 - Jardines del Cura\", \"rev2025\": 4205, \"rev2026\": 3506, \"adr2026\": 77.9, \"dif\": -16.6}, {\"nombre\": \"AP 7 - Oasis\", \"rev2025\": 974, \"rev2026\": 2915, \"adr2026\": 59.5, \"dif\": 199.3}, {\"nombre\": \"AP 7 - Jardines del Cura\", \"rev2025\": 2241, \"rev2026\": 2145, \"adr2026\": 63.1, \"dif\": -4.3}, {\"nombre\": \"Estudio - Oasis\", \"rev2025\": 1393, \"rev2026\": 1640, \"adr2026\": 52.9, \"dif\": 17.7}, {\"nombre\": \"AP 8 - Oasis\", \"rev2025\": 554, \"rev2026\": 1609, \"adr2026\": 94.6, \"dif\": 190.4}], \"meses_nombre\": [\"Junio\", \"Julio\", \"Agosto\", \"Septiembre\"], \"rango\": \"junio a septiembre\"}};\nconst Y1=D.meta.y1,Y2=D.meta.y2,S1=String(Y1),S2=String(Y2),MC=D.meta.mes_cerrado;\nconst C={sea:'#4ABCC5',cadet:'#242B59',tan:'#D1B38C',mut:'#6E6B65',up:'#2E8B6F',dn:'#C0563E'};\nconst PAL=[C.sea,C.cadet,C.tan,'#7A9AA8','#A8B4C8','#C9BBA4'];\nconst nf=n=>new Intl.NumberFormat('es-ES',{maximumFractionDigits:0}).format(n);\nconst eu=n=>nf(n)+' \\u20AC';\nconst MN=['ene','feb','mar','abr','may','jun','jul','ago','sep','oct','nov','dic'];\nconst MF=['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];\nChart.defaults.font.family='Montserrat';Chart.defaults.font.size=11;Chart.defaults.color=C.mut;\nconst GRID={grid:{color:'#F0EEEA'},border:{display:false}},NOGRID={grid:{display:false},border:{display:false}};\nconst CH={};\nfunction mk(id,cfg){if(CH[id])CH[id].destroy();const e=document.getElementById(id);if(e)CH[id]=new Chart(e,cfg);}\nfunction dh(a,b,inv){if(!b)return'';const p=(a\/b-1)*100;const u=inv?p<0:p>0;\nreturn `<span class=\"d ${u?'u':'d'}\">${p>0?'+':''}${p.toFixed(1)}%<\/span>`;}\n\n\/\/ \u2500\u2500 periodos \u2500\u2500\nconst PER={\n ytd:{lab:'YTD comparable',ms:Array.from({length:MC},(_,i)=>i+1),\n      nota:`Compara enero\\u2013${MF[MC-1].toLowerCase()} de ambos a\\u00F1os. Es la \\u00FAnica comparativa en igualdad de condiciones: mismo n\\u00FAmero de meses, ambos cerrados.`},\n q1:{lab:'Q1',ms:[1,2,3],nota:'Primer trimestre: enero, febrero y marzo. Ambos a\\u00F1os cerrados.'},\n q2:{lab:'Q2',ms:[4,5,6],nota:'Segundo trimestre: abril, mayo y junio. Ambos a\\u00F1os cerrados.'},\n q3:{lab:'Q3',ms:[7,8,9],nota:'Tercer trimestre. En '+Y2+' a\\u00FAn en curso: incluye reservas confirmadas pendientes de estancia.'},\n q4:{lab:'Q4',ms:[10,11,12],nota:'Cuarto trimestre. En '+Y2+' es previsi\\u00F3n basada en reservas ya confirmadas.'},\n s1:{lab:'S1',ms:[1,2,3,4,5,6],nota:'Primer semestre completo. Ambos a\\u00F1os cerrados: comparativa fiable.'},\n s2:{lab:'S2',ms:[7,8,9,10,11,12],nota:'Segundo semestre. En '+Y2+' a\\u00FAn por completar: las cifras seguir\\u00E1n subiendo.'},\n anio:{lab:'A\\u00F1o completo',ms:Array.from({length:12},(_,i)=>i+1),\n      nota:`Cuidado al leer: ${Y1} est\\u00E1 cerrado y de ${Y2} solo han transcurrido ${MC} meses. La ca\\u00EDda aparente no es real, es un a\\u00F1o incompleto frente a uno completo.`}\n};\nlet P='ytd', SEL=new Set(D.comparables), MODE='comp';\nconst LIST=D.detalle.map(d=>d.nombre);\nconst ms=()=>PER[P].ms;\nconst cerrado=()=>ms().every(m=>m<=MC);\n\n\/\/ \u2500\u2500 agregacion \u2500\u2500\nfunction sel(){return D.detalle.filter(d=>SEL.has(d.nombre));}\nfunction agg(y,mm,list){\n let rev=0,noc=0,res=0,dias=0,act=new Set();\n (list||sel()).forEach(d=>{mm.forEach(m=>{const v=d[String(y)].mensual[m];if(!v)return;\n  rev+=v.rev;noc+=v.noches;res+=v.res;if(v.dias)dias+=v.dias;if(v.noches>0)act.add(d.nombre);});});\n return{rev,noc,res,dias,adr:noc?rev\/noc:0,occ:dias?noc\/dias*100:0,revpar:dias?rev\/dias:0,\n  aloj:act.size,est:res?noc\/res:0};}\nfunction aggAloj(d,y,mm){\n let rev=0,noc=0,res=0,dias=0,mes=0;\n mm.forEach(m=>{const v=d[String(y)].mensual[m];if(!v)return;\n  rev+=v.rev;noc+=v.noches;res+=v.res;if(v.dias)dias+=v.dias;if(v.noches>0)mes++;});\n return{rev,noc,res,dias,mes,adr:noc?rev\/noc:0,occ:dias?noc\/dias*100:0,revpar:dias?rev\/dias:0};}\nfunction canales(y,mm,list){\n const o={};(list||sel()).forEach(d=>{mm.forEach(m=>{\n  const cm=d[String(y)].canal_mes[m];if(!cm)return;\n  Object.entries(cm).forEach(([k,v])=>o[k]=(o[k]||0)+v);});});\n return o;}\nfunction canalNoches(y,mm,list){\n const o={};(list||sel()).forEach(d=>{mm.forEach(m=>{\n  const cm=d[String(y)].canal_noches[m];if(!cm)return;\n  Object.entries(cm).forEach(([k,v])=>o[k]=(o[k]||0)+v);});});\n return o;}\n\n\/\/ \u2500\u2500 UI selecci\u00f3n \u2500\u2500\ndocument.getElementById('pkList').innerHTML=LIST.map(n=>\n`<label><input type=\"checkbox\" value=\"${n}\"><span>${n}<\/span><\/label>`).join('');\nfunction syncPick(){document.querySelectorAll('#pkList input').forEach(i=>i.checked=SEL.has(i.value));\ndocument.getElementById('pkBtn').textContent=SEL.size+' de '+LIST.length+' seleccionados';}\ndocument.getElementById('pkBtn').onclick=e=>{e.stopPropagation();document.getElementById('pkPop').classList.toggle('on')};\ndocument.addEventListener('click',e=>{if(!e.target.closest('.picker'))document.getElementById('pkPop').classList.remove('on')});\ndocument.getElementById('pkList').onchange=e=>{\n e.target.checked?SEL.add(e.target.value):SEL.delete(e.target.value);setMode('manual');render();};\ndocument.getElementById('pkAll').onclick=()=>{SEL=new Set(LIST);setMode('todos');\n\/\/ \u2500\u2500 portada propietario (datos fijos, meses solidos) \u2500\u2500\nfunction renderPortada(){\nconst P=D.portada;if(!P)return;\ndocument.getElementById('pRango').textContent=P.rango;\ndocument.getElementById('pRango2').textContent=P.rango;\n\/\/ hero: agregado meses solidos cartera constante\nlet R1=0,R2=0,N1=0,N2=0,O1=[],O2=[];\nP.meses.forEach(s=>{R1+=s.y2025.rev;R2+=s.y2026.rev;N1+=s.y2025.noches;N2+=s.y2026.noches;O1.push(s.y2025.occ);O2.push(s.y2026.occ);});\nconst occ1=O1.reduce((a,b)=>a+b,0)\/O1.length,occ2=O2.reduce((a,b)=>a+b,0)\/O2.length;\nconst adr1=N1?R1\/N1:0,adr2=N2?R2\/N2:0;\nconst H=[['Ingresos','+'+((R2\/R1-1)*100).toFixed(0)+'%',`de <b>${eu(R1)}<\/b> a <b>${eu(R2)}<\/b>`],\n['Ocupaci\\u00F3n','+'+(occ2-occ1).toFixed(0)+' pts',`de <b>${occ1.toFixed(0)}%<\/b> a <b>${occ2.toFixed(0)}%<\/b>`],\n['Precio medio\/noche',(adr2>=adr1?'+':'')+((adr2\/adr1-1)*100).toFixed(0)+'%',`de <b>${eu(adr1)}<\/b> a <b>${eu(adr2)}<\/b>`]];\ndocument.getElementById('phHero').innerHTML=H.map(x=>\n`<div><div class=\"mn\">${x[0]}<\/div><div class=\"mv\">${x[1]}<\/div><div class=\"md\">${x[2]}<\/div><\/div>`).join('');\n\/\/ tarjetas mes\ndocument.getElementById('phCards').innerHTML=P.meses.map(s=>{\nconst dr=((s.y2026.rev\/s.y2025.rev-1)*100);\nreturn `<div class=\"pmc\"><div class=\"mm\">${MF[s.m-1]}<\/div>\n<div class=\"comp\"><span class=\"a\">${eu(s.y2025.rev)}<\/span><span class=\"arrow\">\\u2192<\/span><span class=\"b\">${eu(s.y2026.rev)}<\/span><\/div>\n<div class=\"${dr>=0?'up':'dn'}\">${dr>=0?'+':''}${dr.toFixed(0)}% en ingresos<\/div>\n<div class=\"sub\">${s.n_apto} apartamentos<br>Ocupaci\\u00F3n ${s.y2025.occ.toFixed(0)}% \\u2192 <b>${s.y2026.occ.toFixed(0)}%<\/b><\/div><\/div>`;}).join('');\n\/\/ story canal\nconst a25=P.canal.y2025.adr,a26=P.canal.y2026.adr;\nconst to25=a25['Turoperador']||0;\nconst ab=['Airbnb','Booking'].filter(k=>a26[k]).map(k=>a26[k]);\nconst adrAb=ab.length?ab.reduce((a,b)=>a+b,0)\/ab.length:0;\ndocument.getElementById('phStory').innerHTML=`\n<p>En 2025, la mayor parte de las reservas llegaban por <b>turoperador<\/b>, a un precio medio de <b>${eu(to25)} por noche<\/b>.<\/p>\n<p>En 2026 hemos abierto la comercializaci\\u00F3n a portales y reservas directas, vendidas a un precio medio de <b>${eu(adrAb)} por noche<\/b>:\n<span class=\"big\">entre ${eu(a26['Airbnb']||0)} y ${eu(a26['Booking']||0)} por noche seg\\u00FAn el canal.<\/span>\nCada noche vendida por canal abierto en lugar de turoperador vale <b>varios euros m\\u00E1s<\/b>, y ese margen es directamente suyo.<\/p>`;\n\/\/ cajas canal\nfunction cbox(y,dd){const ks=Object.keys(dd.adr).sort((a,b)=>(dd.noc[b]||0)-(dd.noc[a]||0));\nconst tn=Object.values(dd.noc).reduce((a,b)=>a+b,0);\nreturn `<div class=\"pcb\"><div class=\"cy\">${P.rango} \\u00B7 ${y}<\/div>`+ks.map(k=>\n`<div class=\"cr\"><span class=\"nm\">${k}<\/span><span class=\"vl\">${eu(dd.adr[k])} <small>\/noche \\u00B7 ${tn?Math.round((dd.noc[k]||0)\/tn*100):0}%<\/small><\/span><\/div>`).join('')+`<\/div>`;}\ndocument.getElementById('phChan').innerHTML=cbox(2025,P.canal.y2025)+cbox(2026,P.canal.y2026);\ndocument.getElementById('phChNote').textContent='Precio medio por noche de cada canal y peso sobre el total de noches vendidas en los meses comparables.';\n\/\/ tabla aloj\nconst mx=Math.max(...P.porAloj.map(a=>a.rev2026));\ndocument.getElementById('phAloj').innerHTML=\n'<thead><tr><th>Apartamento<\/th><th class=\"num\">'+P.rango+' 2025<\/th><th class=\"num\">'+P.rango+' 2026<\/th><th class=\"num\">Variaci\\u00F3n<\/th><th class=\"num\">Precio medio 2026<\/th><\/tr><\/thead><tbody>'+\nP.porAloj.map(a=>`<tr><td class=\"nm\">${a.nombre}<div class=\"bar\"><i style=\"width:${a.rev2026\/mx*100}%\"><\/i><\/div><\/td>\n<td class=\"num\">${eu(a.rev2025)}<\/td><td class=\"num\">${eu(a.rev2026)}<\/td>\n<td class=\"num ${a.dif>=0?'d u':'d d'}\">${a.dif>=0?'+':''}${a.dif}%<\/td>\n<td class=\"num\">${eu(a.adr2026)}<\/td><\/tr>`).join('')+'<\/tbody>';\nconst suben=P.porAloj.filter(a=>a.dif>=0).length;\ndocument.getElementById('phTblNote').textContent=\n`${suben} de ${P.porAloj.length} apartamentos mejoran sus ingresos respecto a 2025 en los meses comparables.`;\n}\n\nrenderPortada();\nsyncPick();render();};\ndocument.getElementById('pkNone').onclick=()=>{SEL=new Set();setMode('manual');\n\/\/ \u2500\u2500 portada propietario (datos fijos, meses solidos) \u2500\u2500\nfunction renderPortada(){\nconst P=D.portada;if(!P)return;\ndocument.getElementById('pRango').textContent=P.rango;\ndocument.getElementById('pRango2').textContent=P.rango;\n\/\/ hero: agregado meses solidos cartera constante\nlet R1=0,R2=0,N1=0,N2=0,O1=[],O2=[];\nP.meses.forEach(s=>{R1+=s.y2025.rev;R2+=s.y2026.rev;N1+=s.y2025.noches;N2+=s.y2026.noches;O1.push(s.y2025.occ);O2.push(s.y2026.occ);});\nconst occ1=O1.reduce((a,b)=>a+b,0)\/O1.length,occ2=O2.reduce((a,b)=>a+b,0)\/O2.length;\nconst adr1=N1?R1\/N1:0,adr2=N2?R2\/N2:0;\nconst H=[['Ingresos','+'+((R2\/R1-1)*100).toFixed(0)+'%',`de <b>${eu(R1)}<\/b> a <b>${eu(R2)}<\/b>`],\n['Ocupaci\\u00F3n','+'+(occ2-occ1).toFixed(0)+' pts',`de <b>${occ1.toFixed(0)}%<\/b> a <b>${occ2.toFixed(0)}%<\/b>`],\n['Precio medio\/noche',(adr2>=adr1?'+':'')+((adr2\/adr1-1)*100).toFixed(0)+'%',`de <b>${eu(adr1)}<\/b> a <b>${eu(adr2)}<\/b>`]];\ndocument.getElementById('phHero').innerHTML=H.map(x=>\n`<div><div class=\"mn\">${x[0]}<\/div><div class=\"mv\">${x[1]}<\/div><div class=\"md\">${x[2]}<\/div><\/div>`).join('');\n\/\/ tarjetas mes\ndocument.getElementById('phCards').innerHTML=P.meses.map(s=>{\nconst dr=((s.y2026.rev\/s.y2025.rev-1)*100);\nreturn `<div class=\"pmc\"><div class=\"mm\">${MF[s.m-1]}<\/div>\n<div class=\"comp\"><span class=\"a\">${eu(s.y2025.rev)}<\/span><span class=\"arrow\">\\u2192<\/span><span class=\"b\">${eu(s.y2026.rev)}<\/span><\/div>\n<div class=\"${dr>=0?'up':'dn'}\">${dr>=0?'+':''}${dr.toFixed(0)}% en ingresos<\/div>\n<div class=\"sub\">${s.n_apto} apartamentos<br>Ocupaci\\u00F3n ${s.y2025.occ.toFixed(0)}% \\u2192 <b>${s.y2026.occ.toFixed(0)}%<\/b><\/div><\/div>`;}).join('');\n\/\/ story canal\nconst a25=P.canal.y2025.adr,a26=P.canal.y2026.adr;\nconst to25=a25['Turoperador']||0;\nconst ab=['Airbnb','Booking'].filter(k=>a26[k]).map(k=>a26[k]);\nconst adrAb=ab.length?ab.reduce((a,b)=>a+b,0)\/ab.length:0;\ndocument.getElementById('phStory').innerHTML=`\n<p>En 2025, la mayor parte de las reservas llegaban por <b>turoperador<\/b>, a un precio medio de <b>${eu(to25)} por noche<\/b>.<\/p>\n<p>En 2026 hemos abierto la comercializaci\\u00F3n a portales y reservas directas, vendidas a un precio medio de <b>${eu(adrAb)} por noche<\/b>:\n<span class=\"big\">entre ${eu(a26['Airbnb']||0)} y ${eu(a26['Booking']||0)} por noche seg\\u00FAn el canal.<\/span>\nCada noche vendida por canal abierto en lugar de turoperador vale <b>varios euros m\\u00E1s<\/b>, y ese margen es directamente suyo.<\/p>`;\n\/\/ cajas canal\nfunction cbox(y,dd){const ks=Object.keys(dd.adr).sort((a,b)=>(dd.noc[b]||0)-(dd.noc[a]||0));\nconst tn=Object.values(dd.noc).reduce((a,b)=>a+b,0);\nreturn `<div class=\"pcb\"><div class=\"cy\">${P.rango} \\u00B7 ${y}<\/div>`+ks.map(k=>\n`<div class=\"cr\"><span class=\"nm\">${k}<\/span><span class=\"vl\">${eu(dd.adr[k])} <small>\/noche \\u00B7 ${tn?Math.round((dd.noc[k]||0)\/tn*100):0}%<\/small><\/span><\/div>`).join('')+`<\/div>`;}\ndocument.getElementById('phChan').innerHTML=cbox(2025,P.canal.y2025)+cbox(2026,P.canal.y2026);\ndocument.getElementById('phChNote').textContent='Precio medio por noche de cada canal y peso sobre el total de noches vendidas en los meses comparables.';\n\/\/ tabla aloj\nconst mx=Math.max(...P.porAloj.map(a=>a.rev2026));\ndocument.getElementById('phAloj').innerHTML=\n'<thead><tr><th>Apartamento<\/th><th class=\"num\">'+P.rango+' 2025<\/th><th class=\"num\">'+P.rango+' 2026<\/th><th class=\"num\">Variaci\\u00F3n<\/th><th class=\"num\">Precio medio 2026<\/th><\/tr><\/thead><tbody>'+\nP.porAloj.map(a=>`<tr><td class=\"nm\">${a.nombre}<div class=\"bar\"><i style=\"width:${a.rev2026\/mx*100}%\"><\/i><\/div><\/td>\n<td class=\"num\">${eu(a.rev2025)}<\/td><td class=\"num\">${eu(a.rev2026)}<\/td>\n<td class=\"num ${a.dif>=0?'d u':'d d'}\">${a.dif>=0?'+':''}${a.dif}%<\/td>\n<td class=\"num\">${eu(a.adr2026)}<\/td><\/tr>`).join('')+'<\/tbody>';\nconst suben=P.porAloj.filter(a=>a.dif>=0).length;\ndocument.getElementById('phTblNote').textContent=\n`${suben} de ${P.porAloj.length} apartamentos mejoran sus ingresos respecto a 2025 en los meses comparables.`;\n}\n\nrenderPortada();\nsyncPick();render();};\ndocument.getElementById('pkComp').onclick=()=>{SEL=new Set(D.comparables);setMode('comp');\n\/\/ \u2500\u2500 portada propietario (datos fijos, meses solidos) \u2500\u2500\nfunction renderPortada(){\nconst P=D.portada;if(!P)return;\ndocument.getElementById('pRango').textContent=P.rango;\ndocument.getElementById('pRango2').textContent=P.rango;\n\/\/ hero: agregado meses solidos cartera constante\nlet R1=0,R2=0,N1=0,N2=0,O1=[],O2=[];\nP.meses.forEach(s=>{R1+=s.y2025.rev;R2+=s.y2026.rev;N1+=s.y2025.noches;N2+=s.y2026.noches;O1.push(s.y2025.occ);O2.push(s.y2026.occ);});\nconst occ1=O1.reduce((a,b)=>a+b,0)\/O1.length,occ2=O2.reduce((a,b)=>a+b,0)\/O2.length;\nconst adr1=N1?R1\/N1:0,adr2=N2?R2\/N2:0;\nconst H=[['Ingresos','+'+((R2\/R1-1)*100).toFixed(0)+'%',`de <b>${eu(R1)}<\/b> a <b>${eu(R2)}<\/b>`],\n['Ocupaci\\u00F3n','+'+(occ2-occ1).toFixed(0)+' pts',`de <b>${occ1.toFixed(0)}%<\/b> a <b>${occ2.toFixed(0)}%<\/b>`],\n['Precio medio\/noche',(adr2>=adr1?'+':'')+((adr2\/adr1-1)*100).toFixed(0)+'%',`de <b>${eu(adr1)}<\/b> a <b>${eu(adr2)}<\/b>`]];\ndocument.getElementById('phHero').innerHTML=H.map(x=>\n`<div><div class=\"mn\">${x[0]}<\/div><div class=\"mv\">${x[1]}<\/div><div class=\"md\">${x[2]}<\/div><\/div>`).join('');\n\/\/ tarjetas mes\ndocument.getElementById('phCards').innerHTML=P.meses.map(s=>{\nconst dr=((s.y2026.rev\/s.y2025.rev-1)*100);\nreturn `<div class=\"pmc\"><div class=\"mm\">${MF[s.m-1]}<\/div>\n<div class=\"comp\"><span class=\"a\">${eu(s.y2025.rev)}<\/span><span class=\"arrow\">\\u2192<\/span><span class=\"b\">${eu(s.y2026.rev)}<\/span><\/div>\n<div class=\"${dr>=0?'up':'dn'}\">${dr>=0?'+':''}${dr.toFixed(0)}% en ingresos<\/div>\n<div class=\"sub\">${s.n_apto} apartamentos<br>Ocupaci\\u00F3n ${s.y2025.occ.toFixed(0)}% \\u2192 <b>${s.y2026.occ.toFixed(0)}%<\/b><\/div><\/div>`;}).join('');\n\/\/ story canal\nconst a25=P.canal.y2025.adr,a26=P.canal.y2026.adr;\nconst to25=a25['Turoperador']||0;\nconst ab=['Airbnb','Booking'].filter(k=>a26[k]).map(k=>a26[k]);\nconst adrAb=ab.length?ab.reduce((a,b)=>a+b,0)\/ab.length:0;\ndocument.getElementById('phStory').innerHTML=`\n<p>En 2025, la mayor parte de las reservas llegaban por <b>turoperador<\/b>, a un precio medio de <b>${eu(to25)} por noche<\/b>.<\/p>\n<p>En 2026 hemos abierto la comercializaci\\u00F3n a portales y reservas directas, vendidas a un precio medio de <b>${eu(adrAb)} por noche<\/b>:\n<span class=\"big\">entre ${eu(a26['Airbnb']||0)} y ${eu(a26['Booking']||0)} por noche seg\\u00FAn el canal.<\/span>\nCada noche vendida por canal abierto en lugar de turoperador vale <b>varios euros m\\u00E1s<\/b>, y ese margen es directamente suyo.<\/p>`;\n\/\/ cajas canal\nfunction cbox(y,dd){const ks=Object.keys(dd.adr).sort((a,b)=>(dd.noc[b]||0)-(dd.noc[a]||0));\nconst tn=Object.values(dd.noc).reduce((a,b)=>a+b,0);\nreturn `<div class=\"pcb\"><div class=\"cy\">${P.rango} \\u00B7 ${y}<\/div>`+ks.map(k=>\n`<div class=\"cr\"><span class=\"nm\">${k}<\/span><span class=\"vl\">${eu(dd.adr[k])} <small>\/noche \\u00B7 ${tn?Math.round((dd.noc[k]||0)\/tn*100):0}%<\/small><\/span><\/div>`).join('')+`<\/div>`;}\ndocument.getElementById('phChan').innerHTML=cbox(2025,P.canal.y2025)+cbox(2026,P.canal.y2026);\ndocument.getElementById('phChNote').textContent='Precio medio por noche de cada canal y peso sobre el total de noches vendidas en los meses comparables.';\n\/\/ tabla aloj\nconst mx=Math.max(...P.porAloj.map(a=>a.rev2026));\ndocument.getElementById('phAloj').innerHTML=\n'<thead><tr><th>Apartamento<\/th><th class=\"num\">'+P.rango+' 2025<\/th><th class=\"num\">'+P.rango+' 2026<\/th><th class=\"num\">Variaci\\u00F3n<\/th><th class=\"num\">Precio medio 2026<\/th><\/tr><\/thead><tbody>'+\nP.porAloj.map(a=>`<tr><td class=\"nm\">${a.nombre}<div class=\"bar\"><i style=\"width:${a.rev2026\/mx*100}%\"><\/i><\/div><\/td>\n<td class=\"num\">${eu(a.rev2025)}<\/td><td class=\"num\">${eu(a.rev2026)}<\/td>\n<td class=\"num ${a.dif>=0?'d u':'d d'}\">${a.dif>=0?'+':''}${a.dif}%<\/td>\n<td class=\"num\">${eu(a.adr2026)}<\/td><\/tr>`).join('')+'<\/tbody>';\nconst suben=P.porAloj.filter(a=>a.dif>=0).length;\ndocument.getElementById('phTblNote').textContent=\n`${suben} de ${P.porAloj.length} apartamentos mejoran sus ingresos respecto a 2025 en los meses comparables.`;\n}\n\nrenderPortada();\nsyncPick();render();};\ndocument.getElementById('pkOasis').onclick=()=>{SEL=new Set(LIST.filter(n=>\/Oasis|Jardines del Cura\/.test(n)));setMode('manual');\n\/\/ \u2500\u2500 portada propietario (datos fijos, meses solidos) \u2500\u2500\nfunction renderPortada(){\nconst P=D.portada;if(!P)return;\ndocument.getElementById('pRango').textContent=P.rango;\ndocument.getElementById('pRango2').textContent=P.rango;\n\/\/ hero: agregado meses solidos cartera constante\nlet R1=0,R2=0,N1=0,N2=0,O1=[],O2=[];\nP.meses.forEach(s=>{R1+=s.y2025.rev;R2+=s.y2026.rev;N1+=s.y2025.noches;N2+=s.y2026.noches;O1.push(s.y2025.occ);O2.push(s.y2026.occ);});\nconst occ1=O1.reduce((a,b)=>a+b,0)\/O1.length,occ2=O2.reduce((a,b)=>a+b,0)\/O2.length;\nconst adr1=N1?R1\/N1:0,adr2=N2?R2\/N2:0;\nconst H=[['Ingresos','+'+((R2\/R1-1)*100).toFixed(0)+'%',`de <b>${eu(R1)}<\/b> a <b>${eu(R2)}<\/b>`],\n['Ocupaci\\u00F3n','+'+(occ2-occ1).toFixed(0)+' pts',`de <b>${occ1.toFixed(0)}%<\/b> a <b>${occ2.toFixed(0)}%<\/b>`],\n['Precio medio\/noche',(adr2>=adr1?'+':'')+((adr2\/adr1-1)*100).toFixed(0)+'%',`de <b>${eu(adr1)}<\/b> a <b>${eu(adr2)}<\/b>`]];\ndocument.getElementById('phHero').innerHTML=H.map(x=>\n`<div><div class=\"mn\">${x[0]}<\/div><div class=\"mv\">${x[1]}<\/div><div class=\"md\">${x[2]}<\/div><\/div>`).join('');\n\/\/ tarjetas mes\ndocument.getElementById('phCards').innerHTML=P.meses.map(s=>{\nconst dr=((s.y2026.rev\/s.y2025.rev-1)*100);\nreturn `<div class=\"pmc\"><div class=\"mm\">${MF[s.m-1]}<\/div>\n<div class=\"comp\"><span class=\"a\">${eu(s.y2025.rev)}<\/span><span class=\"arrow\">\\u2192<\/span><span class=\"b\">${eu(s.y2026.rev)}<\/span><\/div>\n<div class=\"${dr>=0?'up':'dn'}\">${dr>=0?'+':''}${dr.toFixed(0)}% en ingresos<\/div>\n<div class=\"sub\">${s.n_apto} apartamentos<br>Ocupaci\\u00F3n ${s.y2025.occ.toFixed(0)}% \\u2192 <b>${s.y2026.occ.toFixed(0)}%<\/b><\/div><\/div>`;}).join('');\n\/\/ story canal\nconst a25=P.canal.y2025.adr,a26=P.canal.y2026.adr;\nconst to25=a25['Turoperador']||0;\nconst ab=['Airbnb','Booking'].filter(k=>a26[k]).map(k=>a26[k]);\nconst adrAb=ab.length?ab.reduce((a,b)=>a+b,0)\/ab.length:0;\ndocument.getElementById('phStory').innerHTML=`\n<p>En 2025, la mayor parte de las reservas llegaban por <b>turoperador<\/b>, a un precio medio de <b>${eu(to25)} por noche<\/b>.<\/p>\n<p>En 2026 hemos abierto la comercializaci\\u00F3n a portales y reservas directas, vendidas a un precio medio de <b>${eu(adrAb)} por noche<\/b>:\n<span class=\"big\">entre ${eu(a26['Airbnb']||0)} y ${eu(a26['Booking']||0)} por noche seg\\u00FAn el canal.<\/span>\nCada noche vendida por canal abierto en lugar de turoperador vale <b>varios euros m\\u00E1s<\/b>, y ese margen es directamente suyo.<\/p>`;\n\/\/ cajas canal\nfunction cbox(y,dd){const ks=Object.keys(dd.adr).sort((a,b)=>(dd.noc[b]||0)-(dd.noc[a]||0));\nconst tn=Object.values(dd.noc).reduce((a,b)=>a+b,0);\nreturn `<div class=\"pcb\"><div class=\"cy\">${P.rango} \\u00B7 ${y}<\/div>`+ks.map(k=>\n`<div class=\"cr\"><span class=\"nm\">${k}<\/span><span class=\"vl\">${eu(dd.adr[k])} <small>\/noche \\u00B7 ${tn?Math.round((dd.noc[k]||0)\/tn*100):0}%<\/small><\/span><\/div>`).join('')+`<\/div>`;}\ndocument.getElementById('phChan').innerHTML=cbox(2025,P.canal.y2025)+cbox(2026,P.canal.y2026);\ndocument.getElementById('phChNote').textContent='Precio medio por noche de cada canal y peso sobre el total de noches vendidas en los meses comparables.';\n\/\/ tabla aloj\nconst mx=Math.max(...P.porAloj.map(a=>a.rev2026));\ndocument.getElementById('phAloj').innerHTML=\n'<thead><tr><th>Apartamento<\/th><th class=\"num\">'+P.rango+' 2025<\/th><th class=\"num\">'+P.rango+' 2026<\/th><th class=\"num\">Variaci\\u00F3n<\/th><th class=\"num\">Precio medio 2026<\/th><\/tr><\/thead><tbody>'+\nP.porAloj.map(a=>`<tr><td class=\"nm\">${a.nombre}<div class=\"bar\"><i style=\"width:${a.rev2026\/mx*100}%\"><\/i><\/div><\/td>\n<td class=\"num\">${eu(a.rev2025)}<\/td><td class=\"num\">${eu(a.rev2026)}<\/td>\n<td class=\"num ${a.dif>=0?'d u':'d d'}\">${a.dif>=0?'+':''}${a.dif}%<\/td>\n<td class=\"num\">${eu(a.adr2026)}<\/td><\/tr>`).join('')+'<\/tbody>';\nconst suben=P.porAloj.filter(a=>a.dif>=0).length;\ndocument.getElementById('phTblNote').textContent=\n`${suben} de ${P.porAloj.length} apartamentos mejoran sus ingresos respecto a 2025 en los meses comparables.`;\n}\n\nrenderPortada();\nsyncPick();render();};\nfunction setMode(m){MODE=m;document.querySelectorAll('#segC button').forEach(b=>b.classList.toggle('on',b.dataset.v===m));}\ndocument.querySelectorAll('#segC button').forEach(b=>b.onclick=()=>{\n const v=b.dataset.v;if(v==='comp')SEL=new Set(D.comparables);else if(v==='todos')SEL=new Set(LIST);\n setMode(v);\n\/\/ \u2500\u2500 portada propietario (datos fijos, meses solidos) \u2500\u2500\nfunction renderPortada(){\nconst P=D.portada;if(!P)return;\ndocument.getElementById('pRango').textContent=P.rango;\ndocument.getElementById('pRango2').textContent=P.rango;\n\/\/ hero: agregado meses solidos cartera constante\nlet R1=0,R2=0,N1=0,N2=0,O1=[],O2=[];\nP.meses.forEach(s=>{R1+=s.y2025.rev;R2+=s.y2026.rev;N1+=s.y2025.noches;N2+=s.y2026.noches;O1.push(s.y2025.occ);O2.push(s.y2026.occ);});\nconst occ1=O1.reduce((a,b)=>a+b,0)\/O1.length,occ2=O2.reduce((a,b)=>a+b,0)\/O2.length;\nconst adr1=N1?R1\/N1:0,adr2=N2?R2\/N2:0;\nconst H=[['Ingresos','+'+((R2\/R1-1)*100).toFixed(0)+'%',`de <b>${eu(R1)}<\/b> a <b>${eu(R2)}<\/b>`],\n['Ocupaci\\u00F3n','+'+(occ2-occ1).toFixed(0)+' pts',`de <b>${occ1.toFixed(0)}%<\/b> a <b>${occ2.toFixed(0)}%<\/b>`],\n['Precio medio\/noche',(adr2>=adr1?'+':'')+((adr2\/adr1-1)*100).toFixed(0)+'%',`de <b>${eu(adr1)}<\/b> a <b>${eu(adr2)}<\/b>`]];\ndocument.getElementById('phHero').innerHTML=H.map(x=>\n`<div><div class=\"mn\">${x[0]}<\/div><div class=\"mv\">${x[1]}<\/div><div class=\"md\">${x[2]}<\/div><\/div>`).join('');\n\/\/ tarjetas mes\ndocument.getElementById('phCards').innerHTML=P.meses.map(s=>{\nconst dr=((s.y2026.rev\/s.y2025.rev-1)*100);\nreturn `<div class=\"pmc\"><div class=\"mm\">${MF[s.m-1]}<\/div>\n<div class=\"comp\"><span class=\"a\">${eu(s.y2025.rev)}<\/span><span class=\"arrow\">\\u2192<\/span><span class=\"b\">${eu(s.y2026.rev)}<\/span><\/div>\n<div class=\"${dr>=0?'up':'dn'}\">${dr>=0?'+':''}${dr.toFixed(0)}% en ingresos<\/div>\n<div class=\"sub\">${s.n_apto} apartamentos<br>Ocupaci\\u00F3n ${s.y2025.occ.toFixed(0)}% \\u2192 <b>${s.y2026.occ.toFixed(0)}%<\/b><\/div><\/div>`;}).join('');\n\/\/ story canal\nconst a25=P.canal.y2025.adr,a26=P.canal.y2026.adr;\nconst to25=a25['Turoperador']||0;\nconst ab=['Airbnb','Booking'].filter(k=>a26[k]).map(k=>a26[k]);\nconst adrAb=ab.length?ab.reduce((a,b)=>a+b,0)\/ab.length:0;\ndocument.getElementById('phStory').innerHTML=`\n<p>En 2025, la mayor parte de las reservas llegaban por <b>turoperador<\/b>, a un precio medio de <b>${eu(to25)} por noche<\/b>.<\/p>\n<p>En 2026 hemos abierto la comercializaci\\u00F3n a portales y reservas directas, vendidas a un precio medio de <b>${eu(adrAb)} por noche<\/b>:\n<span class=\"big\">entre ${eu(a26['Airbnb']||0)} y ${eu(a26['Booking']||0)} por noche seg\\u00FAn el canal.<\/span>\nCada noche vendida por canal abierto en lugar de turoperador vale <b>varios euros m\\u00E1s<\/b>, y ese margen es directamente suyo.<\/p>`;\n\/\/ cajas canal\nfunction cbox(y,dd){const ks=Object.keys(dd.adr).sort((a,b)=>(dd.noc[b]||0)-(dd.noc[a]||0));\nconst tn=Object.values(dd.noc).reduce((a,b)=>a+b,0);\nreturn `<div class=\"pcb\"><div class=\"cy\">${P.rango} \\u00B7 ${y}<\/div>`+ks.map(k=>\n`<div class=\"cr\"><span class=\"nm\">${k}<\/span><span class=\"vl\">${eu(dd.adr[k])} <small>\/noche \\u00B7 ${tn?Math.round((dd.noc[k]||0)\/tn*100):0}%<\/small><\/span><\/div>`).join('')+`<\/div>`;}\ndocument.getElementById('phChan').innerHTML=cbox(2025,P.canal.y2025)+cbox(2026,P.canal.y2026);\ndocument.getElementById('phChNote').textContent='Precio medio por noche de cada canal y peso sobre el total de noches vendidas en los meses comparables.';\n\/\/ tabla aloj\nconst mx=Math.max(...P.porAloj.map(a=>a.rev2026));\ndocument.getElementById('phAloj').innerHTML=\n'<thead><tr><th>Apartamento<\/th><th class=\"num\">'+P.rango+' 2025<\/th><th class=\"num\">'+P.rango+' 2026<\/th><th class=\"num\">Variaci\\u00F3n<\/th><th class=\"num\">Precio medio 2026<\/th><\/tr><\/thead><tbody>'+\nP.porAloj.map(a=>`<tr><td class=\"nm\">${a.nombre}<div class=\"bar\"><i style=\"width:${a.rev2026\/mx*100}%\"><\/i><\/div><\/td>\n<td class=\"num\">${eu(a.rev2025)}<\/td><td class=\"num\">${eu(a.rev2026)}<\/td>\n<td class=\"num ${a.dif>=0?'d u':'d d'}\">${a.dif>=0?'+':''}${a.dif}%<\/td>\n<td class=\"num\">${eu(a.adr2026)}<\/td><\/tr>`).join('')+'<\/tbody>';\nconst suben=P.porAloj.filter(a=>a.dif>=0).length;\ndocument.getElementById('phTblNote').textContent=\n`${suben} de ${P.porAloj.length} apartamentos mejoran sus ingresos respecto a 2025 en los meses comparables.`;\n}\n\nrenderPortada();\nsyncPick();render();});\ndocument.querySelectorAll('#segP button').forEach(b=>b.onclick=()=>{\n P=b.dataset.v;document.querySelectorAll('#segP button').forEach(x=>x.classList.toggle('on',x===b));render();});\n\ndocument.getElementById('hGen').textContent=D.meta.generado;\ndocument.getElementById('fGen').textContent=D.meta.generado;\n\n\/\/ \u2500\u2500 render principal \u2500\u2500\nfunction render(){\nconst mm=ms(),A=agg(Y1,mm),B=agg(Y2,mm);\ndocument.getElementById('cntC').textContent=SEL.size+' de '+LIST.length+' alojamientos';\ndocument.getElementById('hPer').textContent=PER[P].lab+' \\u00B7 '+Y1+' vs '+Y2;\ndocument.getElementById('hSel').textContent=SEL.size+' alojamientos \\u00B7 '+\n (MODE==='comp'?'solo comparables':MODE==='todos'?'cartera completa':'selecci\\u00F3n manual');\nconst rango=mm.length===12?'enero \\u2013 diciembre':MF[mm[0]-1]+' \\u2013 '+MF[mm[mm.length-1]-1];\ndocument.getElementById('pbV').textContent=PER[P].lab+'  \\u00B7  '+rango;\ndocument.getElementById('pbN').textContent=PER[P].nota;\ndocument.getElementById('pbL').textContent=cerrado()?'Periodo cerrado \\u00B7 comparativa fiable':'Periodo en curso \\u00B7 leer con cautela';\n\nconst K=[['Revenue',eu(B.rev),eu(A.rev),B.rev,A.rev,0],\n['Ocupaci\\u00F3n',B.occ.toFixed(1)+'<small>%<\/small>',A.occ.toFixed(1)+'%',B.occ,A.occ,1],\n['ADR',eu(B.adr),eu(A.adr),B.adr,A.adr,0],\n['RevPAR',eu(B.revpar),eu(A.revpar),B.revpar,A.revpar,1],\n['Noches',nf(B.noc),nf(A.noc),B.noc,A.noc,0],\n['Reservas',nf(B.res),nf(A.res),B.res,A.res,1],\n['Alojamientos',B.aloj,A.aloj,B.aloj,A.aloj,0],\n['Estancia media',B.est.toFixed(1)+'<small> n<\/small>',A.est.toFixed(1)+' n',B.est,A.est,1]];\ndocument.getElementById('kA').innerHTML=K.map(k=>\n`<div class=\"kpi ${k[5]?'t':''}\"><div class=\"l\">${k[0]}<\/div><div class=\"v\">${k[1]}<\/div>\n<div class=\"cmp\"><span>${Y1}: ${k[2]}<\/span>${dh(k[3],k[4])}<\/div><\/div>`).join('');\n\n\/\/ serie mensual (siempre 12 meses, resalta periodo)\nconst s1=MN.map((_,i)=>{let r=0;sel().forEach(d=>{const v=d[S1].mensual[i+1];if(v)r+=v.rev});return r;});\nconst s2=MN.map((_,i)=>{let r=0;sel().forEach(d=>{const v=d[S2].mensual[i+1];if(v)r+=v.rev});return r;});\nconst inP=MN.map((_,i)=>mm.includes(i+1));\nmk('a1',{type:'bar',data:{labels:MN,datasets:[\n{label:S1,data:s1,backgroundColor:inP.map(x=>x?C.tan:'#EDE7DC'),borderRadius:2},\n{label:S2,data:s2,backgroundColor:inP.map(x=>x?C.sea:'#DCEEF0'),borderRadius:2}]},\noptions:{maintainAspectRatio:false,plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:13}},\ntooltip:{callbacks:{label:x=>x.dataset.label+' '+eu(x.raw),\nafterLabel:x=>inP[x.dataIndex]?'':'fuera del periodo'}}},\nscales:{y:{...GRID,ticks:{callback:v=>nf(v\/1000)+'k'}},x:NOGRID}}});\n\nconst o1=MN.map((_,i)=>{const a=agg(Y1,[i+1]);return +a.occ.toFixed(1)});\nconst o2=MN.map((_,i)=>{const a=agg(Y2,[i+1]);return +a.occ.toFixed(1)});\nmk('a2',{type:'line',data:{labels:MN,datasets:[\n{label:S1,data:o1,borderColor:C.tan,tension:.35,pointRadius:3,borderWidth:2},\n{label:S2,data:o2,borderColor:C.cadet,tension:.35,pointRadius:3,borderWidth:2}]},\noptions:{maintainAspectRatio:false,plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:13}},\ntooltip:{callbacks:{label:x=>x.dataset.label+' '+x.raw+'%'}}},\nscales:{y:{...GRID,ticks:{callback:v=>v+'%'}},x:NOGRID}}});\n\n\/\/ tabla mensual\ndocument.getElementById('tA').innerHTML=\n`<thead><tr class=\"grp\"><th><\/th><th colspan=\"2\">${Y1}<\/th><th colspan=\"2\" class=\"sp\">${Y2}<\/th><th colspan=\"2\" class=\"sp\">Variaci\\u00F3n<\/th><\/tr>\n<tr><th>Mes<\/th><th class=\"num\">Revenue<\/th><th class=\"num\">Ocup.<\/th><th class=\"num sp\">Revenue<\/th>\n<th class=\"num\">Ocup.<\/th><th class=\"num sp\">Revenue<\/th><th class=\"num\">Ocup.<\/th><\/tr><\/thead><tbody>`+\nMN.map((_,i)=>{const fu=i+1>MC;\nreturn `<tr class=\"${inP[i]?'':'fut'}\"><td class=\"nm\">${MF[i]}${fu?' <span class=\"pill c\">en curso<\/span>':''}${inP[i]?'':' <span class=\"pill g\">fuera<\/span>'}<\/td>\n<td class=\"num\">${eu(s1[i])}<\/td><td class=\"num\">${o1[i]}%<\/td>\n<td class=\"num sp\">${eu(s2[i])}<\/td><td class=\"num\">${o2[i]}%<\/td>\n<td class=\"num sp\">${dh(s2[i],s1[i])}<\/td><td class=\"num\">${dh(o2[i],o1[i])}<\/td><\/tr>`}).join('')+\n`<tr style=\"background:#F4F3F0;font-weight:600\"><td class=\"nm\">${PER[P].lab}<\/td>\n<td class=\"num\">${eu(A.rev)}<\/td><td class=\"num\">${A.occ.toFixed(1)}%<\/td>\n<td class=\"num sp\">${eu(B.rev)}<\/td><td class=\"num\">${B.occ.toFixed(1)}%<\/td>\n<td class=\"num sp\">${dh(B.rev,A.rev)}<\/td><td class=\"num\">${dh(B.occ,A.occ)}<\/td><\/tr><\/tbody>`;\n\nrenderIns(A,B,mm);renderDiag(A,B,mm);renderBrk();renderCmp();renderRank();renderCan();renderInv();}\n\n\/\/ \u2500\u2500 lectura automatica (solo desde datos propios) \u2500\u2500\nfunction renderIns(A,B,mm){\nconst L=[];\nconst dRev=A.rev?(B.rev\/A.rev-1)*100:0, dNoc=A.noc?(B.noc\/A.noc-1)*100:0, dAdr=A.adr?(B.adr\/A.adr-1)*100:0;\nif(A.rev){\n const efV=A.adr*(B.noc-A.noc), efP=(B.adr-A.adr)*B.noc;\n L.push([`El revenue del periodo pasa de <b>${eu(A.rev)}<\/b> a <b>${eu(B.rev)}<\/b> (${dRev>0?'+':''}${dRev.toFixed(1)}%). Descompuesto: <b>${eu(efV)}<\/b> vienen de la variaci\\u00F3n de volumen y <b>${eu(efP)}<\/b> de la variaci\\u00F3n de precio medio.`,\n   dRev>0?'g':'w']);\n}\nif(Math.abs(dAdr)>3&&Math.abs(dNoc)>3&&Math.sign(dAdr)!==Math.sign(dNoc)){\n L.push([dNoc>0\n  ?`Se vende <b>m\\u00E1s volumen a menor precio<\/b>: noches ${dNoc>0?'+':''}${dNoc.toFixed(1)}% con ADR ${dAdr.toFixed(1)}%. Es la se\\u00F1al t\\u00EDpica de una estrategia orientada a ocupaci\\u00F3n.`\n  :`Se vende <b>menos volumen a mayor precio<\/b>: noches ${dNoc.toFixed(1)}% con ADR +${dAdr.toFixed(1)}%. Se ha sostenido tarifa a costa de ocupaci\\u00F3n.`,'']);\n}\n\/\/ mejor y peor mes del periodo\nconst per=mm.map(m=>({m,a:agg(Y1,[m]).rev,b:agg(Y2,[m]).rev})).filter(x=>x.a||x.b);\nif(per.length>1){\n const conD=per.filter(x=>x.a>0).map(x=>({...x,d:(x.b\/x.a-1)*100}));\n if(conD.length){\n  const mx=conD.reduce((p,c)=>c.d>p.d?c:p), mn=conD.reduce((p,c)=>c.d<p.d?c:p);\n  L.push([`Mejor evoluci\\u00F3n en <b>${MF[mx.m-1]}<\/b> (${mx.d>0?'+':''}${mx.d.toFixed(1)}%, ${eu(mx.a)} \\u2192 ${eu(mx.b)}). La m\\u00E1s d\\u00E9bil en <b>${MF[mn.m-1]}<\/b> (${mn.d>0?'+':''}${mn.d.toFixed(1)}%, ${eu(mn.a)} \\u2192 ${eu(mn.b)}).`,'']);\n }\n}\n\/\/ estacionalidad: meses bajo la media\nconst occM=mm.map(m=>({m,o:agg(Y2,[m]).occ})).filter(x=>x.o>0);\nif(occM.length>2){\n const med=occM.reduce((s,x)=>s+x.o,0)\/occM.length;\n const bajos=occM.filter(x=>x.o<med*0.8).map(x=>MF[x.m-1]);\n if(bajos.length)L.push([`Meses por debajo del 80% de la ocupaci\\u00F3n media del periodo (${med.toFixed(1)}%): <b>${bajos.join(', ')}<\/b>. Es donde queda margen de mejora.`,'w']);\n}\n\/\/ canales\nconst c1=canales(Y1,mm),c2=canales(Y2,mm);\nconst t1=Object.values(c1).reduce((a,b)=>a+b,0),t2=Object.values(c2).reduce((a,b)=>a+b,0);\nif(c1['Turoperador']||c2['Turoperador']){\n const a=c1['Turoperador']||0,b=c2['Turoperador']||0;\n L.push([`El turoperador aporta <b>${eu(b)}<\/b> (${t2?(b\/t2*100).toFixed(1):0}% del total) frente a <b>${eu(a)}<\/b> (${t1?(a\/t1*100).toFixed(1):0}%) el a\\u00F1o anterior. ${b>=a*0.9&&t2>t1?'Se mantiene en euros: su menor peso relativo se debe a que el resto de canales ha crecido, no a que haya bajado.':''}`,'']);\n const nA=canalNoches(Y1,mm),nB=canalNoches(Y2,mm);\n const adrTO=nB['Turoperador']?b\/nB['Turoperador']:0;\n const otras=['Airbnb','Booking'].reduce((s,k)=>s+(c2[k]||0),0);\n const nOtras=['Airbnb','Booking'].reduce((s,k)=>s+(nB[k]||0),0);\n if(adrTO&&nOtras){const adrO=otras\/nOtras;\n  L.push([`ADR por canal en ${Y2}: turoperador <b>${eu(adrTO)}<\/b> por noche frente a <b>${eu(adrO)}<\/b> en canal abierto. Diferencia de <b>${eu(adrO-adrTO)}<\/b> por noche vendida.`,adrO>adrTO?'g':'w']);}\n}\nif(c1['Sin canal informado']){\n L.push([`En ${Y1} hay <b>${eu(c1['Sin canal informado'])}<\/b> sin canal de origen registrado (reservas migradas al PMS). No se comparan con ${Y2} por no ser un canal real.`,'']);\n}\ndocument.getElementById('insBox').innerHTML=\n`<h4>Lectura del periodo<\/h4><ul>`+L.map(x=>`<li class=\"${x[1]}\">${x[0]}<\/li>`).join('')+`<\/ul>`;}\n\n\n\/\/ \u2500\u2500 diagn\u00f3stico de ADR: por qu\u00e9 se mueve el precio medio \u2500\u2500\nfunction canalRN(y,mm,list){ \/\/ {canal:{rev,noc}}\n const o={};(list||sel()).forEach(d=>{mm.forEach(m=>{\n  const cm=d[String(y)].canal_mes[m]||{}, cn=d[String(y)].canal_noches[m]||{};\n  Object.keys({...cm,...cn}).forEach(k=>{o[k]=o[k]||{rev:0,noc:0};\n   o[k].rev+=cm[k]||0;o[k].noc+=cn[k]||0;});});});\n return o;}\n\nfunction renderDiag(A,B,mm){\nconst box=document.getElementById('diagBox');\nconst dAdr=A.adr?(B.adr-A.adr):0;\n\/\/ fiabilidad: peso de \"Sin canal informado\" en a\u00f1o base\nconst rn1=canalRN(Y1,mm), rn2=canalRN(Y2,mm);\nconst noc1=Object.values(rn1).reduce((s,x)=>s+x.noc,0);\nconst sc=(rn1['Sin canal informado']||{noc:0}).noc;\nconst contam=noc1?sc\/noc1*100:0;\nconst fiable=contam<15 && A.adr>0 && B.adr>0;\n\nlet html=`<div class=\"diag\"><h4>Diagn\u00f3stico del precio medio (ADR)\n<span class=\"tag ${fiable?'ok':'no'}\">${fiable?'an\u00e1lisis fiable':'no fiable en esta selecci\u00f3n'}<\/span><\/h4>`;\n\nif(!fiable){\n html+=`<p style=\"font-size:13px;line-height:1.6;color:#5C5852\">\n No se puede descomponer la variaci\u00f3n de ADR con garant\u00edas en esta selecci\u00f3n: el\n <b>${contam.toFixed(0)}%<\/b> de las noches de ${Y1} son reservas migradas al PMS sin canal de\n origen (\"Sin canal informado\"). El a\u00f1o base est\u00e1 contaminado y cualquier reparto por canal\n ser\u00eda falso. <b>El diagn\u00f3stico de ADR solo es fiable en Oasis y Jardines del Cura<\/b>, que\n tienen canal real en ambos a\u00f1os. Usa el bot\u00f3n <b>Oasis+JdC<\/b> del selector para activarlo.<\/p><\/div>`;\n box.innerHTML=html;return;\n}\n\n\/\/ ADR por canal cada a\u00f1o\nconst adrc=(rn)=>Object.fromEntries(Object.entries(rn).map(([k,v])=>[k,v.noc?v.rev\/v.noc:0]));\nconst ac1=adrc(rn1), ac2=adrc(rn2);\nconst tn1=noc1, tn2=Object.values(rn2).reduce((s,x)=>s+x.noc,0);\nconst w1=Object.fromEntries(Object.entries(rn1).map(([k,v])=>[k,tn1?v.noc\/tn1:0]));\nconst w2=Object.fromEntries(Object.entries(rn2).map(([k,v])=>[k,tn2?v.noc\/tn2:0]));\nconst cs=[...new Set([...Object.keys(rn1),...Object.keys(rn2)])];\n\n\/\/ Descomposici\u00f3n shift-share:\n\/\/ efecto MIX  = \u03a3 (w2-w1) * adr1_canal   (cambi\u00f3 la composici\u00f3n, a precios viejos)\n\/\/ efecto TARIFA = \u03a3 w2 * (adr2-adr1)_canal (mismo canal, cambi\u00f3 su precio)\nlet efMix=0, efTar=0;\ncs.forEach(k=>{const a1=ac1[k]||0,a2=ac2[k]||0;\n efMix += ((w2[k]||0)-(w1[k]||0))*a1;\n efTar += (w2[k]||0)*(a2-a1);});\n\/\/ estancia\nconst est1=A.est,est2=B.est;\n\nconst f=v=>`${v>=0?'+':''}${nf(Math.round(v))} \\u20AC`;\nconst cls=v=>v>=0?'u':'d';\nhtml+=`<p style=\"font-size:13px;color:#5C5852;line-height:1.55\">\nEl ADR pasa de <b>${eu(A.adr)}<\/b> a <b>${eu(B.adr)}<\/b> (${f(dAdr)} por noche).\nEsta es la parte que s\u00ed se puede explicar con los datos:<\/p>\n<div class=\"wf\">\n<div class=\"row\"><div class=\"lbl\">Cambio de <b>mix de canal<\/b><small>Vender por canales m\u00e1s caros o m\u00e1s baratos, sin tocar tarifas<\/small><\/div>\n<div class=\"amt ${cls(efMix)}\">${f(efMix)}<\/div><div class=\"pctm\">${dAdr?Math.round(efMix\/dAdr*100):0}%<\/div><\/div>\n<div class=\"row\"><div class=\"lbl\">Cambio de <b>tarifa dentro de cada canal<\/b><small>Mismo canal cobrando distinto: aqu\u00ed s\u00ed hay decisi\u00f3n de precio<\/small><\/div>\n<div class=\"amt ${cls(efTar)}\">${f(efTar)}<\/div><div class=\"pctm\">${dAdr?Math.round(efTar\/dAdr*100):0}%<\/div><\/div>\n<div class=\"row tot\"><div class=\"lbl\">Variaci\u00f3n total de ADR<\/div>\n<div class=\"amt ${cls(dAdr)}\">${f(dAdr)}<\/div><div class=\"pctm\">100%<\/div><\/div>\n<\/div>`;\n\n\/\/ tabla de canales\nhtml+=`<div class=\"subT\">ADR y peso por canal<\/div><div class=\"canx\">`;\n[[Y1,ac1,w1,rn1],[Y2,ac2,w2,rn2]].forEach(([y,ac,w,rn])=>{\n const ord=cs.filter(k=>rn[k]&&rn[k].noc).sort((a,b)=>(w[b]||0)-(w[a]||0));\n html+=`<div class=\"cbx\"><div class=\"cy\">${y}<\/div>`+\n  ord.map(k=>`<div class=\"cl\"><span>${k}<\/span><b>${eu(ac[k])} \\u00B7 ${Math.round((w[k]||0)*100)}%<\/b><\/div>`).join('')+`<\/div>`;});\nhtml+=`<\/div>`;\n\n\/\/ \u2500\u2500 hip\u00f3tesis inferidas \u2500\u2500\nconst H=[];\nif(Math.abs(efMix)>Math.abs(efTar)*1.3){\n H.push([`El movimiento del ADR es <b>principalmente de mix de canal<\/b> (${Math.round(efMix\/dAdr*100)}% del total), no de tarifa. `,\n  dAdr>0?`Has sustituido canal barato por canal m\u00e1s caro: es efecto comercial, no de pricing.`\n        :`Ha ganado peso un canal m\u00e1s barato. Pregunta a revenue si es deliberado o hay que reequilibrar.`,\n  `\u00bfEl cambio de mix de canal fue una decisi\u00f3n o consecuencia de d\u00f3nde entr\u00f3 la demanda?`]);\n}\nif(Math.abs(efTar)>Math.abs(dAdr)*0.35){\n const to=cs.filter(k=>ac2[k]&&ac1[k]).map(k=>({k,dif:ac2[k]-ac1[k],w:w2[k]||0}))\n   .filter(x=>x.w>0.05).sort((a,b)=>Math.abs(b.dif*b.w)-Math.abs(a.dif*a.w));\n const peor=to[0];\n H.push([`Hay <b>efecto tarifa real<\/b> (${Math.round(efTar\/dAdr*100)}% del cambio): dentro del mismo canal se cobra distinto. `,\n  peor?`El canal que m\u00e1s pesa en esto es <b>${peor.k}<\/b> (${peor.dif>0?'+':''}${Math.round(peor.dif)} \\u20AC por noche).`:'',\n  `\u00bfPor qu\u00e9 cambi\u00f3 la tarifa en ${peor?peor.k:'los canales principales'}? \u00bfDecisi\u00f3n de pricing, presi\u00f3n de mercado o ajuste de \u00faltima hora?`]);\n}\nif(est2>est1*1.08){\n H.push([`La <b>estancia media sube<\/b> de ${est1.toFixed(1)} a ${est2.toFixed(1)} noches. `,\n  `Estancias m\u00e1s largas suelen llevar descuento por semana o mes, lo que baja el ADR aunque llene mejor.`,\n  `\u00bfSe est\u00e1n aplicando descuentos por larga estancia? \u00bfCompensan en ocupaci\u00f3n lo que restan en ADR?`]);\n}else if(est2<est1*0.92){\n H.push([`La <b>estancia media baja<\/b> de ${est1.toFixed(1)} a ${est2.toFixed(1)} noches. `,\n  `Estancias m\u00e1s cortas y m\u00e1s rotaci\u00f3n pueden subir ADR pero aumentan limpieza y huecos.`,\n  `\u00bfInteresa esta rotaci\u00f3n m\u00e1s alta o conviene incentivar estancias largas?`]);\n}\n\/\/ lo que no se puede ver\nH.push([`<b>Lo que estos datos no pueden ver:<\/b> `,\n `si el mercado (competencia, evento, temporada) movi\u00f3 los precios del destino, y con qu\u00e9 antelaci\u00f3n se reserva (booking window). Eso requiere datos de mercado y la fecha de creaci\u00f3n de cada reserva.`,\n `\u00bfC\u00f3mo se movi\u00f3 nuestro ADR frente al del mercado en este periodo? \u00bfY la antelaci\u00f3n media de reserva?`]);\n\nhtml+=`<div class=\"hyp\"><div class=\"ht\">Hip\u00f3tesis e interpretaci\u00f3n (inferido, a validar con revenue)<\/div><ul>`+\n H.map(x=>`<li>${x[0]}${x[1]}<span class=\"q\">Pregunta a tu equipo: ${x[2]}<\/span><\/li>`).join('')+\n `<\/ul><\/div><\/div>`;\nbox.innerHTML=html;}\n\n\/\/ \u2500\u2500 comparativa de periodos \u2500\u2500\nfunction renderCmp(){\nconst rows=Object.entries(PER).map(([k,v])=>{\n const A=agg(Y1,v.ms),B=agg(Y2,v.ms);\n return{k,lab:v.lab,cerr:v.ms.every(m=>m<=MC),A,B};});\ndocument.getElementById('tCmp').innerHTML=\n`<thead><tr class=\"grp\"><th><\/th><th><\/th><th colspan=\"2\">${Y1}<\/th><th colspan=\"2\" class=\"sp\">${Y2}<\/th><th colspan=\"3\" class=\"sp\">Variaci\\u00F3n<\/th><\/tr>\n<tr><th>Periodo<\/th><th>Estado<\/th><th class=\"num\">Revenue<\/th><th class=\"num\">Ocup.<\/th>\n<th class=\"num sp\">Revenue<\/th><th class=\"num\">Ocup.<\/th>\n<th class=\"num sp\">Revenue<\/th><th class=\"num\">Ocup.<\/th><th class=\"num\">ADR<\/th><\/tr><\/thead><tbody>`+\nrows.map(r=>`<tr${r.k===P?' style=\"background:#F4F3F0;font-weight:600\"':''}>\n<td class=\"nm\">${r.lab}<\/td>\n<td><span class=\"pill ${r.cerr?'a':'c'}\">${r.cerr?'cerrado':'en curso'}<\/span><\/td>\n<td class=\"num\">${eu(r.A.rev)}<\/td><td class=\"num\">${r.A.occ.toFixed(1)}%<\/td>\n<td class=\"num sp\">${eu(r.B.rev)}<\/td><td class=\"num\">${r.B.occ.toFixed(1)}%<\/td>\n<td class=\"num sp\">${dh(r.B.rev,r.A.rev)}<\/td><td class=\"num\">${dh(r.B.occ,r.A.occ)}<\/td>\n<td class=\"num\">${dh(r.B.adr,r.A.adr)}<\/td><\/tr>`).join('')+'<\/tbody>';\nconst cerr=rows.filter(r=>r.cerr),curso=rows.filter(r=>!r.cerr);\ndocument.getElementById('cmpNota').innerHTML=\n`<b>Por qu\\u00E9 esta tabla importa.<\/b> Los periodos marcados como cerrados comparan meses completos en ambos a\\u00F1os: son los \\u00FAnicos v\\u00E1lidos para juzgar rendimiento. Los marcados en curso incluyen meses de ${Y2} a\\u00FAn sin completar, por lo que su variaci\\u00F3n ser\\u00E1 negativa por construcci\\u00F3n y no refleja una ca\\u00EDda real.`;\nmk('cmp1',{type:'bar',data:{labels:rows.map(r=>r.lab),datasets:[\n{label:S1,data:rows.map(r=>r.A.rev),backgroundColor:C.tan,borderRadius:2},\n{label:S2,data:rows.map(r=>r.B.rev),backgroundColor:rows.map(r=>r.cerr?C.sea:'#DCEEF0'),borderRadius:2}]},\noptions:{maintainAspectRatio:false,plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:13}},\ntooltip:{callbacks:{label:x=>x.dataset.label+' '+eu(x.raw),\nafterLabel:x=>rows[x.dataIndex].cerr?'periodo cerrado':'periodo en curso'}}},\nscales:{y:{...GRID,ticks:{callback:v=>nf(v\/1000)+'k'}},x:NOGRID}}});}\n\n\/\/ \u2500\u2500 desglose individual \u2500\u2500\nfunction renderBrk(){\nconst s=sel(),sl=document.getElementById('selB'),prev=sl.value;\ndocument.getElementById('brkS').textContent=s.length\n ?`KPIs individuales del periodo seleccionado, comparados entre ${Y1} y ${Y2}.`\n :'Selecciona al menos un alojamiento arriba.';\nsl.innerHTML=[...s].sort((a,b)=>aggAloj(b,Y2,ms()).rev-aggAloj(a,Y2,ms()).rev)\n .map(d=>`<option value=\"${d.nombre}\">${d.nombre}<\/option>`).join('');\nif(s.some(d=>d.nombre===prev))sl.value=prev;\nsl.onchange=drawBrk;drawBrk();}\n\nfunction drawBrk(){\nconst box=document.getElementById('brkBox'),n=document.getElementById('selB').value;\nconst d=D.detalle.find(x=>x.nombre===n),mm=ms();\nif(!d){box.innerHTML='<div class=\"empty\">No hay alojamientos seleccionados.<\/div>';return;}\nconst a=aggAloj(d,Y1,mm),b=aggAloj(d,Y2,mm);\nconst K=[['Revenue',eu(a.rev),eu(b.rev),b.rev,a.rev],\n['Reservas',a.res,b.res,b.res,a.res],\n['ADR',eu(a.adr),eu(b.adr),b.adr,a.adr],\n['Noches',nf(a.noc),nf(b.noc),b.noc,a.noc],\n['Ocupaci\\u00F3n',a.occ.toFixed(1)+'%',b.occ.toFixed(1)+'%',b.occ,a.occ]];\nconst mx=K.map(k=>Math.max(k[3],k[4])||1);\nbox.innerHTML=`<div class=\"bhead\"><span class=\"dot\"><\/span><span class=\"bn\">${d.nombre}<\/span>\n<span class=\"by\">${PER[P].lab} \\u00B7 ${Y1} vs ${Y2}<\/span>\n<span class=\"bm\">${b.mes} meses con actividad en ${Y2}${d.grupo_to?' \\u00B7 con turoperador':''}<\/span><\/div>\n<div class=\"bk\">`+K.map((k,i)=>`<div class=\"bkc\"><div class=\"l\">${k[0]}<\/div>\n<div class=\"y1\"><span>${Y1}<\/span><b>${k[1]}<\/b><\/div>\n<div class=\"y2\"><span>${Y2}<\/span><b>${k[2]}<\/b><\/div>\n<div class=\"dl\">${dh(k[3],k[4])}<span class=\"ar\">${Y1} \\u2192 ${Y2}<\/span><\/div>\n<div class=\"mb\"><span>${Y1}<\/span><i style=\"width:${k[4]\/mx[i]*100}%;background:var(--tan)\"><\/i><\/div>\n<div class=\"mb\"><span>${Y2}<\/span><i style=\"width:${k[3]\/mx[i]*100}%;background:var(--sea)\"><\/i><\/div>\n<\/div>`).join('')+`<\/div>\n<div class=\"g2\">\n<div class=\"card\"><h3>Revenue mensual \\u00B7 ${d.nombre}<\/h3><div class=\"cs\">${Y1} vs ${Y2} \\u00B7 meses del periodo destacados<\/div><div class=\"ch\"><canvas id=\"b1\"><\/canvas><\/div><\/div>\n<div class=\"card\"><h3>Canales \\u00B7 ${PER[P].lab}<\/h3><div class=\"cs\">Origen de los ingresos de esta unidad<\/div><div class=\"ch\"><canvas id=\"b2\"><\/canvas><\/div><\/div><\/div>`;\nconst inP=MN.map((_,i)=>mm.includes(i+1));\nmk('b1',{type:'bar',data:{labels:MN,datasets:[\n{label:S1,data:MN.map((_,i)=>{const v=d[S1].mensual[i+1];return v?v.rev:0}),\n backgroundColor:inP.map(x=>x?C.tan:'#EDE7DC'),borderRadius:2},\n{label:S2,data:MN.map((_,i)=>{const v=d[S2].mensual[i+1];return v?v.rev:0}),\n backgroundColor:inP.map(x=>x?C.sea:'#DCEEF0'),borderRadius:2}]},\noptions:{maintainAspectRatio:false,plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:13}},\ntooltip:{callbacks:{label:x=>x.dataset.label+' '+eu(x.raw)}}},\nscales:{y:{...GRID,ticks:{callback:v=>nf(v)+' \\u20AC'}},x:NOGRID}}});\nconst cb=canales(Y2,mm,[d]),ck=Object.keys(cb);\nmk('b2',{type:'doughnut',data:{labels:ck.length?ck:['Sin datos'],\ndatasets:[{data:ck.length?ck.map(k=>cb[k]):[1],backgroundColor:PAL,borderWidth:2,borderColor:'#fff'}]},\noptions:{maintainAspectRatio:false,cutout:'58%',plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:12}},\ntooltip:{callbacks:{label:x=>x.label+' '+eu(x.raw)}}}}});}\n\n\/\/ \u2500\u2500 ranking \u2500\u2500\nlet rk='rev2',rd=-1;\nfunction renderRank(){\nconst mm=ms();\nconst rows=sel().map(d=>{const a=aggAloj(d,Y1,mm),b=aggAloj(d,Y2,mm);\n return{n:d.nombre,rev1:a.rev,rev2:b.rev,occ1:a.occ,occ2:b.occ,adr1:a.adr,adr2:b.adr,\n  noc2:b.noc,res2:b.res,m2:b.mes,to:d.grupo_to};});\nconst mxr=Math.max(...rows.map(r=>r.rev2),1);\nrows.sort((a,b)=>typeof a[rk]==='string'?rd*a[rk].localeCompare(b[rk]):rd*(a[rk]-b[rk]));\nconst CO=[['n','Alojamiento',0],['rev1',Y1,1],['rev2',Y2,1],['occ2','Ocup.',1],\n['adr2','ADR',1],['noc2','Noches',1],['res2','Reservas',1],['m2','Meses',1]];\ndocument.getElementById('tR').innerHTML='<thead><tr>'+CO.map(c=>\n`<th class=\"${c[2]?'num':''}\" data-k=\"${c[0]}\">${c[1]}${rk===c[0]?(rd<0?' \\u2193':' \\u2191'):''}<\/th>`).join('')+'<\/tr><\/thead><tbody>'+\nrows.map(r=>`<tr><td class=\"nm\">${r.n}${r.to?' <span class=\"pill g\">TO<\/span>':''}\n<div class=\"bar\"><i style=\"width:${r.rev2\/mxr*100}%\"><\/i><\/div><\/td>\n<td class=\"num\">${eu(r.rev1)}<\/td><td class=\"num\">${eu(r.rev2)} ${dh(r.rev2,r.rev1)}<\/td>\n<td class=\"num\">${r.occ2.toFixed(1)}% ${dh(r.occ2,r.occ1)}<\/td><td class=\"num\">${eu(r.adr2)}<\/td>\n<td class=\"num\">${nf(r.noc2)}<\/td><td class=\"num\">${r.res2}<\/td><td class=\"num\">${r.m2}<\/td><\/tr>`).join('')+'<\/tbody>';\ndocument.querySelectorAll('#tR th').forEach(t=>t.onclick=()=>{\n const k=t.dataset.k;if(rk===k)rd=-rd;else{rk=k;rd=k==='n'?1:-1;}renderRank();});}\n\n\/\/ \u2500\u2500 canales \u2500\u2500\nfunction renderCan(){\nconst mm=ms(),c1=canales(Y1,mm),c2=canales(Y2,mm),n1=canalNoches(Y1,mm),n2=canalNoches(Y2,mm);\nconst ks=[...new Set([...Object.keys(c1),...Object.keys(c2)])].sort((a,b)=>(c2[b]||0)-(c2[a]||0));\nconst t1=Object.values(c1).reduce((a,b)=>a+b,0),t2=Object.values(c2).reduce((a,b)=>a+b,0);\nmk('n1',{type:'bar',data:{labels:ks,datasets:[\n{label:S1,data:ks.map(k=>c1[k]||0),backgroundColor:C.tan,borderRadius:2},\n{label:S2,data:ks.map(k=>c2[k]||0),backgroundColor:C.sea,borderRadius:2}]},\noptions:{maintainAspectRatio:false,plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:13}},\ntooltip:{callbacks:{label:x=>x.dataset.label+' '+eu(x.raw)}}},\nscales:{y:{...GRID,ticks:{callback:v=>nf(v\/1000)+'k'}},x:NOGRID}}});\nconst k2=ks.filter(k=>c2[k]);\nmk('n2',{type:'doughnut',data:{labels:k2,datasets:[{data:k2.map(k=>c2[k]),\nbackgroundColor:PAL,borderWidth:2,borderColor:'#fff'}]},\noptions:{maintainAspectRatio:false,cutout:'58%',plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:12}},\ntooltip:{callbacks:{label:x=>x.label+' '+eu(x.raw)+' ('+(c2[x.label]\/t2*100).toFixed(1)+'%)'}}}}});\ndocument.getElementById('tN').innerHTML=\n`<thead><tr class=\"grp\"><th><\/th><th colspan=\"3\">${Y1}<\/th><th colspan=\"3\" class=\"sp\">${Y2}<\/th><\/tr>\n<tr><th>Canal<\/th><th class=\"num\">Revenue<\/th><th class=\"num\">%<\/th><th class=\"num\">ADR<\/th>\n<th class=\"num sp\">Revenue<\/th><th class=\"num\">%<\/th><th class=\"num\">ADR<\/th><\/tr><\/thead><tbody>`+\nks.map((k,i)=>{const a=c1[k]||0,b=c2[k]||0,na=n1[k]||0,nb=n2[k]||0;\nreturn `<tr><td class=\"nm\"><span class=\"pill ${k==='Turoperador'?'c':k==='Sin canal informado'?'g':['a','b','a','b'][i%4]}\">${k}<\/span><\/td>\n<td class=\"num\">${eu(a)}<\/td><td class=\"num\">${t1?(a\/t1*100).toFixed(1):0}%<\/td><td class=\"num\">${na?eu(a\/na):'\\u2014'}<\/td>\n<td class=\"num sp\">${eu(b)}<\/td><td class=\"num\">${t2?(b\/t2*100).toFixed(1):0}%<\/td><td class=\"num\">${nb?eu(b\/nb):'\\u2014'}<\/td><\/tr>`}).join('')+'<\/tbody>';\nconst hayTO=c1['Turoperador']||c2['Turoperador'], haySC=c1['Sin canal informado'];\ndocument.getElementById('canNota').innerHTML=\n(hayTO?`<b>Turoperador.<\/b> Las reservas de turoperador se registran en el PMS como FrontOffice y aqu\\u00ED aparecen etiquetadas como tal. Afecta \\u00FAnicamente a Oasis y Jardines del Cura. `:'')+\n(haySC?`<b>Sin canal informado.<\/b> Corresponde a reservas cargadas al PMS durante la migraci\\u00F3n desde el gestor anterior, sin canal de origen. No es un canal comercial y no debe compararse con ${Y2}.`:'');}\n\n\/\/ \u2500\u2500 inventario \u2500\u2500\nfunction renderInv(){\nconst mm=ms();\nconst s1=MN.map((_,i)=>sel().filter(d=>{const v=d[S1].mensual[i+1];return v&&v.noches>0}).length);\nconst s2=MN.map((_,i)=>sel().filter(d=>{const v=d[S2].mensual[i+1];return v&&v.noches>0}).length);\nmk('i1',{type:'line',data:{labels:MN,datasets:[\n{label:S1,data:s1,borderColor:C.tan,backgroundColor:'rgba(209,179,140,.16)',fill:true,stepped:true,pointRadius:0,borderWidth:2.5},\n{label:S2,data:s2,borderColor:C.cadet,backgroundColor:'rgba(36,43,89,.07)',fill:true,stepped:true,pointRadius:0,borderWidth:2.5}]},\noptions:{maintainAspectRatio:false,plugins:{legend:{position:'bottom',labels:{boxWidth:10,padding:13}},\ntooltip:{callbacks:{label:x=>x.dataset.label+' \\u00B7 '+x.raw+' alojamientos'}}},\nscales:{y:{...GRID,beginAtZero:true},x:NOGRID}}});\ndrawInv();}\ndocument.getElementById('selIY').innerHTML=[Y1,Y2].map(y=>`<option>${y}<\/option>`).join('');\ndocument.getElementById('selIY').value=Y2;\ndocument.getElementById('selIM').innerHTML=MF.map((m,i)=>`<option value=\"${i+1}\">${m}<\/option>`).join('');\ndocument.getElementById('selIM').value=Math.min(MC,12);\ndocument.getElementById('selIY').onchange=drawInv;\ndocument.getElementById('selIM').onchange=drawInv;\nfunction drawInv(){\nconst y=document.getElementById('selIY').value,m=+document.getElementById('selIM').value;\nconst l=sel().filter(d=>{const v=d[String(y)].mensual[m];return v&&v.noches>0}).map(d=>d.nombre).sort();\ndocument.getElementById('boxI').innerHTML=l.length\n?`<div style=\"font-size:12px;color:var(--mut);margin-bottom:7px\">${l.length} alojamientos con actividad en ${MF[m-1]} ${y}<\/div>\n<div class=\"chips\">${l.map(n=>`<span class=\"chip\">${n}<\/span>`).join('')}<\/div>`\n:'<div style=\"color:var(--mut);font-size:13px\">Sin actividad registrada.<\/div>';}\n\ndocument.querySelectorAll('.nv button').forEach(b=>b.onclick=()=>{\ndocument.querySelectorAll('.nv button').forEach(x=>x.classList.remove('on'));\ndocument.querySelectorAll('.pane').forEach(x=>x.classList.remove('on'));\nb.classList.add('on');document.getElementById(b.dataset.p).classList.add('on');\nwindow.scrollTo({top:0,behavior:'smooth'});});\n\n\n\/\/ \u2500\u2500 portada propietario (datos fijos, meses solidos) \u2500\u2500\nfunction renderPortada(){\nconst P=D.portada;if(!P)return;\ndocument.getElementById('pRango').textContent=P.rango;\ndocument.getElementById('pRango2').textContent=P.rango;\n\/\/ hero: agregado meses solidos cartera constante\nlet R1=0,R2=0,N1=0,N2=0,O1=[],O2=[];\nP.meses.forEach(s=>{R1+=s.y2025.rev;R2+=s.y2026.rev;N1+=s.y2025.noches;N2+=s.y2026.noches;O1.push(s.y2025.occ);O2.push(s.y2026.occ);});\nconst occ1=O1.reduce((a,b)=>a+b,0)\/O1.length,occ2=O2.reduce((a,b)=>a+b,0)\/O2.length;\nconst adr1=N1?R1\/N1:0,adr2=N2?R2\/N2:0;\nconst H=[['Ingresos','+'+((R2\/R1-1)*100).toFixed(0)+'%',`de <b>${eu(R1)}<\/b> a <b>${eu(R2)}<\/b>`],\n['Ocupaci\\u00F3n','+'+(occ2-occ1).toFixed(0)+' pts',`de <b>${occ1.toFixed(0)}%<\/b> a <b>${occ2.toFixed(0)}%<\/b>`],\n['Precio medio\/noche',(adr2>=adr1?'+':'')+((adr2\/adr1-1)*100).toFixed(0)+'%',`de <b>${eu(adr1)}<\/b> a <b>${eu(adr2)}<\/b>`]];\ndocument.getElementById('phHero').innerHTML=H.map(x=>\n`<div><div class=\"mn\">${x[0]}<\/div><div class=\"mv\">${x[1]}<\/div><div class=\"md\">${x[2]}<\/div><\/div>`).join('');\n\/\/ tarjetas mes\ndocument.getElementById('phCards').innerHTML=P.meses.map(s=>{\nconst dr=((s.y2026.rev\/s.y2025.rev-1)*100);\nreturn `<div class=\"pmc\"><div class=\"mm\">${MF[s.m-1]}<\/div>\n<div class=\"comp\"><span class=\"a\">${eu(s.y2025.rev)}<\/span><span class=\"arrow\">\\u2192<\/span><span class=\"b\">${eu(s.y2026.rev)}<\/span><\/div>\n<div class=\"${dr>=0?'up':'dn'}\">${dr>=0?'+':''}${dr.toFixed(0)}% en ingresos<\/div>\n<div class=\"sub\">${s.n_apto} apartamentos<br>Ocupaci\\u00F3n ${s.y2025.occ.toFixed(0)}% \\u2192 <b>${s.y2026.occ.toFixed(0)}%<\/b><\/div><\/div>`;}).join('');\n\/\/ story canal\nconst a25=P.canal.y2025.adr,a26=P.canal.y2026.adr;\nconst to25=a25['Turoperador']||0;\nconst ab=['Airbnb','Booking'].filter(k=>a26[k]).map(k=>a26[k]);\nconst adrAb=ab.length?ab.reduce((a,b)=>a+b,0)\/ab.length:0;\ndocument.getElementById('phStory').innerHTML=`\n<p>En 2025, la mayor parte de las reservas llegaban por <b>turoperador<\/b>, a un precio medio de <b>${eu(to25)} por noche<\/b>.<\/p>\n<p>En 2026 hemos abierto la comercializaci\\u00F3n a portales y reservas directas, vendidas a un precio medio de <b>${eu(adrAb)} por noche<\/b>:\n<span class=\"big\">entre ${eu(a26['Airbnb']||0)} y ${eu(a26['Booking']||0)} por noche seg\\u00FAn el canal.<\/span>\nCada noche vendida por canal abierto en lugar de turoperador vale <b>varios euros m\\u00E1s<\/b>, y ese margen es directamente suyo.<\/p>`;\n\/\/ cajas canal\nfunction cbox(y,dd){const ks=Object.keys(dd.adr).sort((a,b)=>(dd.noc[b]||0)-(dd.noc[a]||0));\nconst tn=Object.values(dd.noc).reduce((a,b)=>a+b,0);\nreturn `<div class=\"pcb\"><div class=\"cy\">${P.rango} \\u00B7 ${y}<\/div>`+ks.map(k=>\n`<div class=\"cr\"><span class=\"nm\">${k}<\/span><span class=\"vl\">${eu(dd.adr[k])} <small>\/noche \\u00B7 ${tn?Math.round((dd.noc[k]||0)\/tn*100):0}%<\/small><\/span><\/div>`).join('')+`<\/div>`;}\ndocument.getElementById('phChan').innerHTML=cbox(2025,P.canal.y2025)+cbox(2026,P.canal.y2026);\ndocument.getElementById('phChNote').textContent='Precio medio por noche de cada canal y peso sobre el total de noches vendidas en los meses comparables.';\n\/\/ tabla aloj\nconst mx=Math.max(...P.porAloj.map(a=>a.rev2026));\ndocument.getElementById('phAloj').innerHTML=\n'<thead><tr><th>Apartamento<\/th><th class=\"num\">'+P.rango+' 2025<\/th><th class=\"num\">'+P.rango+' 2026<\/th><th class=\"num\">Variaci\\u00F3n<\/th><th class=\"num\">Precio medio 2026<\/th><\/tr><\/thead><tbody>'+\nP.porAloj.map(a=>`<tr><td class=\"nm\">${a.nombre}<div class=\"bar\"><i style=\"width:${a.rev2026\/mx*100}%\"><\/i><\/div><\/td>\n<td class=\"num\">${eu(a.rev2025)}<\/td><td class=\"num\">${eu(a.rev2026)}<\/td>\n<td class=\"num ${a.dif>=0?'d u':'d d'}\">${a.dif>=0?'+':''}${a.dif}%<\/td>\n<td class=\"num\">${eu(a.adr2026)}<\/td><\/tr>`).join('')+'<\/tbody>';\nconst suben=P.porAloj.filter(a=>a.dif>=0).length;\ndocument.getElementById('phTblNote').textContent=\n`${suben} de ${P.porAloj.length} apartamentos mejoran sus ingresos respecto a 2025 en los meses comparables.`;\n}\n\nrenderPortada();\nsyncPick();render();\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>Oasis y Jardines del Cura &middot; Informe de gesti\u00f3n Villas RiveroOasis y Jardines del Cura Actualizado Nuestra gesti\u00f3n Datos completos Comparativa de periodos Ranking Canales Inventario Periodo YTDQ1Q2 Q3Q4S1 S2A&ntilde;o completo Cartera ComparablesTodos Manual Alojamientos Seleccionar&hellip; TodosNinguno ComparablesOasis+JdC Su cartera con nuestra gesti\u00f3n C\u00f3mo ha evolucionado el rendimiento Comparamos los meses de de 2025 y [&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-1498","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>Dashboard Oasis Resort - 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=\"http:\/\/villasrivero.com\/en\/dashboard-oasis-resort\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dashboard Oasis Resort - Villas Rivero\" \/>\n<meta property=\"og:description\" content=\"Oasis y Jardines del Cura &middot; Informe de gesti\u00f3n Villas RiveroOasis y Jardines del Cura Actualizado Nuestra gesti\u00f3n Datos completos Comparativa de periodos Ranking Canales Inventario Periodo YTDQ1Q2 Q3Q4S1 S2A&ntilde;o completo Cartera ComparablesTodos Manual Alojamientos Seleccionar&hellip; TodosNinguno ComparablesOasis+JdC Su cartera con nuestra gesti\u00f3n C\u00f3mo ha evolucionado el rendimiento Comparamos los meses de de 2025 y [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/villasrivero.com\/en\/dashboard-oasis-resort\/\" \/>\n<meta property=\"og:site_name\" content=\"Villas Rivero\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-30T12:02:13+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=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/villasrivero.com\\\/dashboard-oasis-resort\\\/\",\"url\":\"http:\\\/\\\/villasrivero.com\\\/dashboard-oasis-resort\\\/\",\"name\":\"Dashboard Oasis Resort - Villas Rivero\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/villasrivero.com\\\/#website\"},\"datePublished\":\"2026-07-30T11:51:04+00:00\",\"dateModified\":\"2026-07-30T12:02:13+00:00\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/villasrivero.com\\\/dashboard-oasis-resort\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/villasrivero.com\\\/dashboard-oasis-resort\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/villasrivero.com\\\/dashboard-oasis-resort\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/villasrivero.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dashboard Oasis Resort\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\\\/\\\/villasrivero.com\\\/#website\",\"url\":\"http:\\\/\\\/villasrivero.com\\\/\",\"name\":\"Villas Rivero\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\\\/\\\/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":"Dashboard Oasis Resort - 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":"http:\/\/villasrivero.com\/en\/dashboard-oasis-resort\/","og_locale":"en_GB","og_type":"article","og_title":"Dashboard Oasis Resort - Villas Rivero","og_description":"Oasis y Jardines del Cura &middot; Informe de gesti\u00f3n Villas RiveroOasis y Jardines del Cura Actualizado Nuestra gesti\u00f3n Datos completos Comparativa de periodos Ranking Canales Inventario Periodo YTDQ1Q2 Q3Q4S1 S2A&ntilde;o completo Cartera ComparablesTodos Manual Alojamientos Seleccionar&hellip; TodosNinguno ComparablesOasis+JdC Su cartera con nuestra gesti\u00f3n C\u00f3mo ha evolucionado el rendimiento Comparamos los meses de de 2025 y [&hellip;]","og_url":"http:\/\/villasrivero.com\/en\/dashboard-oasis-resort\/","og_site_name":"Villas Rivero","article_modified_time":"2026-07-30T12:02:13+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/villasrivero.com\/dashboard-oasis-resort\/","url":"http:\/\/villasrivero.com\/dashboard-oasis-resort\/","name":"Dashboard Oasis Resort - Villas Rivero","isPartOf":{"@id":"http:\/\/villasrivero.com\/#website"},"datePublished":"2026-07-30T11:51:04+00:00","dateModified":"2026-07-30T12:02:13+00:00","breadcrumb":{"@id":"http:\/\/villasrivero.com\/dashboard-oasis-resort\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["http:\/\/villasrivero.com\/dashboard-oasis-resort\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/villasrivero.com\/dashboard-oasis-resort\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/villasrivero.com\/en\/"},{"@type":"ListItem","position":2,"name":"Dashboard Oasis Resort"}]},{"@type":"WebSite","@id":"http:\/\/villasrivero.com\/#website","url":"http:\/\/villasrivero.com\/","name":"Villas Rivero","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/villasrivero.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"}]}},"_links":{"self":[{"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages\/1498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/comments?post=1498"}],"version-history":[{"count":7,"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages\/1498\/revisions"}],"predecessor-version":[{"id":1506,"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/pages\/1498\/revisions\/1506"}],"wp:attachment":[{"href":"https:\/\/villasrivero.com\/en\/wp-json\/wp\/v2\/media?parent=1498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}