{"id":3522,"date":"2026-11-09T16:15:06","date_gmt":"2026-11-09T15:15:06","guid":{"rendered":"https:\/\/lacoladaprimus.com\/?page_id=3522"},"modified":"2026-11-09T16:31:14","modified_gmt":"2026-11-09T15:31:14","slug":"3522-2","status":"publish","type":"page","link":"https:\/\/lacoladaprimus.com\/pt-pt\/3522-2\/","title":{"rendered":"Calcule o rendimento da sua lavandaria self-service"},"content":{"rendered":"\n<style data-wp-block-html=\"css\">\n.lc-app {\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important;\n  max-width: 1280px;\n  margin: 20px auto !important;\n  padding: 0 12px !important;\n  color: #1e293b !important;\n  line-height: 1.5 !important;\n  -webkit-font-smoothing: antialiased;\n  font-size: 14px !important;\n  box-sizing: border-box !important;\n}\n.lc-app *, .lc-app *::before, .lc-app *::after {\n  box-sizing: border-box !important;\n}\n.lc-app p {\n  margin: 0 !important;\n  line-height: 1.5 !important;\n}\n.lc-app h1, .lc-app h2, .lc-app h3, .lc-app h4 {\n  font-family: inherit !important;\n  margin: 0 !important;\n}\n.lc-app ul {\n  margin: 0 !important;\n  padding-left: 18px !important;\n}\n.lc-app li {\n  margin: 0 0 4px 0 !important;\n  line-height: 1.5 !important;\n}\n.lc-app table {\n  margin: 0 !important;\n  width: 100% !important;\n  border-collapse: collapse !important;\n  border: none !important;\n  background: transparent !important;\n}\n.lc-app table th, .lc-app table td {\n  border: none !important;\n  vertical-align: middle !important;\n}\n.lc-app input[type=\"number\"] {\n  height: auto !important;\n  line-height: normal !important;\n  margin: 0 !important;\n  box-shadow: none !important;\n  font-family: inherit;\n  font-size: 16px;\n  -moz-appearance: textfield;\n}\n.lc-app input[type=number]::-webkit-inner-spin-button,\n.lc-app input[type=number]::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n@media(min-width:640px){ .lc-app input[type=number]{ font-size: 14px; } }\n.lc-app button {\n  border: none !important;\n  line-height: 1.2 !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n}\n.lc-app a {\n  text-decoration: none !important;\n}\n\n\/* ===== CABE\u00c7ALHO ===== *\/\n.lc-header{background:linear-gradient(135deg,#1d4ed8,#0891b2);color:#fff;padding:16px;border-radius:12px;margin:12px 0;display:flex;align-items:center;gap:16px;box-shadow:0 4px 20px rgba(29,78,216,.25);flex-wrap:wrap}\n@media(min-width:640px){.lc-header{padding:20px 24px;border-radius:16px;margin:16px 0;gap:20px;flex-wrap:nowrap}}\n@media(min-width:768px){.lc-header{padding:24px 28px;margin:20px 0}}\n.lc-header-logo-wrap{background:#ffffff;border-radius:12px;padding:8px 14px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,0.1);max-height:68px;flex-shrink:0}\n.lc-header-logo-wrap img{height:48px;width:auto;max-width:210px;object-fit:contain;display:block}\n.lc-header-text h1{font-size:18px;margin:0;font-weight:800;line-height:1.2;color:#ffffff}\n@media(min-width:640px){.lc-header-text h1{font-size:clamp(20px,3vw,26px)}}\n.lc-header-text p{margin:4px 0 0;font-size:12px;opacity:.92;line-height:1.3;color:#e0f2fe}\n@media(min-width:640px){.lc-header-text p{font-size:clamp(13px,2vw,14px)}}\n\n\/* ===== INFO BANNER ===== *\/\n.lc-info{background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:12px 14px;margin-bottom:16px;font-size:12px;color:#1e40af;line-height:1.5}\n@media(min-width:640px){.lc-info{padding:14px 18px;margin-bottom:24px;font-size:13px;border-radius:12px}}\n.lc-info strong{font-weight:700}\n\n\/* ===== GRID LAYOUT ===== *\/\n.lc-grid{display:grid;grid-template-columns:1fr;gap:16px}\n@media(min-width:640px){.lc-grid{gap:20px}}\n@media(min-width:1024px){.lc-grid{grid-template-columns:1fr 380px;gap:24px}}\n@media(min-width:1280px){.lc-grid{grid-template-columns:1fr 420px}}\n\n\/* ===== SECTIONS ===== *\/\n.lc-section{background:#fff;border-radius:12px;box-shadow:0 1px 8px rgba(0,0,0,.06);border:1px solid #e5e7eb;overflow:hidden;margin-bottom:16px}\n@media(min-width:640px){.lc-section{border-radius:16px;margin-bottom:24px}}\n.lc-section-head{padding:12px 16px;color:#fff;font-size:14px;font-weight:700;display:flex;align-items:center;gap:8px}\n@media(min-width:640px){.lc-section-head{padding:16px 24px;font-size:16px;gap:10px}}\n.lc-section-head .lc-ico{background:rgba(255,255,255,.2);border-radius:6px;padding:4px 6px;display:flex;align-items:center;justify-content:center;font-size:16px}\n@media(min-width:640px){.lc-section-head .lc-ico{border-radius:8px;padding:6px;font-size:18px}}\n.lc-sh-blue{background:linear-gradient(135deg,#2563eb,#1d4ed8)}\n.lc-sh-green{background:linear-gradient(135deg,#059669,#047857)}\n.lc-sh-amber{background:linear-gradient(135deg,#d97706,#b45309)}\n.lc-sh-violet{background:linear-gradient(135deg,#7c3aed,#6d28d9)}\n.lc-sh-rose{background:linear-gradient(135deg,#e11d48,#be123c)}\n.lc-sh-dark{background:linear-gradient(135deg,#374151,#1f2937)}\n.lc-section-body{padding:16px}\n@media(min-width:640px){.lc-section-body{padding:24px}}\n\n\/* ===== FORM ELEMENTS ===== *\/\n.lc-label{display:block;font-size:12px;font-weight:600;color:#374151;margin-bottom:4px}\n@media(min-width:640px){.lc-label{font-size:13px}}\n.lc-input{width:100%;padding:10px 12px;border:1.5px solid #d1d5db;border-radius:8px;font-size:16px;transition:border-color .2s,box-shadow .2s;background:#fff;color:#1e293b}\n@media(min-width:640px){.lc-input{padding:10px 14px;border-radius:10px;font-size:14px}}\n.lc-input:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px rgba(59,130,246,.15)}\n.lc-hint{font-size:11px;margin-top:4px;color:#6b7280}\n.lc-hint-ok{color:#059669;font-weight:600}\n.lc-hint-warn{color:#dc2626;font-weight:600}\n.lc-hint-dim{color:#94a3b8;font-size:11px;font-style:italic}\n.lc-form-grid{display:grid;grid-template-columns:1fr;gap:12px}\n@media(min-width:480px){.lc-form-grid{grid-template-columns:1fr 1fr;gap:16px}}\n.lc-tarif-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}\n@media(min-width:480px){.lc-tarif-grid{gap:12px}}\n@media(min-width:768px){.lc-tarif-grid{grid-template-columns:repeat(4,1fr)}}\n.lc-cost-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}\n@media(min-width:480px){.lc-cost-grid{gap:12px}}\n@media(min-width:640px){.lc-cost-grid{grid-template-columns:repeat(3,1fr)}}\n@media(min-width:900px){.lc-cost-grid{grid-template-columns:repeat(4,1fr)}}\n\n\/* ===== PACK CARDS ===== *\/\n.lc-packs{display:grid;grid-template-columns:1fr;gap:8px;margin-bottom:12px}\n@media(min-width:400px){.lc-packs{grid-template-columns:1fr 1fr}}\n@media(min-width:768px){.lc-packs{grid-template-columns:repeat(3,1fr);gap:10px}}\n@media(min-width:1100px){.lc-packs{grid-template-columns:repeat(5,1fr)}}\n.lc-pack{padding:12px;border-radius:10px;border:2px solid #e5e7eb;cursor:pointer;text-align:left;transition:all .2s;background:#fff}\n@media(min-width:640px){.lc-pack{padding:14px;border-radius:12px}}\n.lc-pack:hover{border-color:#93c5fd;background:#f8fafc}\n.lc-pack.active{border-color:#3b82f6;background:#eff6ff;box-shadow:0 2px 12px rgba(59,130,246,.15);transform:scale(1.02)}\n.lc-pack-name{font-weight:700;color:#1e293b;font-size:13px}\n@media(min-width:640px){.lc-pack-name{font-size:14px}}\n.lc-pack-price{font-size:18px;font-weight:800;color:#2563eb;margin:4px 0}\n@media(min-width:640px){.lc-pack-price{font-size:20px}}\n.lc-pack-desc{font-size:10px;color:#6b7280;line-height:1.3}\n@media(min-width:640px){.lc-pack-desc{font-size:11px}}\n.lc-pack-info{font-size:10px;color:#9ca3af;margin-top:4px}\n@media(min-width:640px){.lc-pack-info{font-size:11px;margin-top:6px}}\n.lc-pack-pop{font-size:10px;color:#3b82f6;margin-top:2px}\n@media(min-width:640px){.lc-pack-pop{font-size:11px}}\n\n\/* ===== ZONE BUTTONS ===== *\/\n.lc-zones{display:grid;grid-template-columns:1fr 1fr;gap:6px}\n@media(min-width:480px){.lc-zones{gap:8px}}\n@media(min-width:640px){.lc-zones{grid-template-columns:repeat(4,1fr)}}\n.lc-zone{padding:10px 6px;border-radius:8px;border:2px solid #e5e7eb;cursor:pointer;text-align:center;transition:all .2s;background:#fff}\n@media(min-width:640px){.lc-zone{padding:12px 8px;border-radius:10px}}\n.lc-zone:hover{border-color:#6ee7b7}\n.lc-zone.active{border-color:#10b981;background:#ecfdf5}\n.lc-zone-emoji{font-size:20px}\n@media(min-width:640px){.lc-zone-emoji{font-size:24px}}\n.lc-zone-label{font-size:11px;font-weight:600;color:#374151;margin-top:2px}\n@media(min-width:640px){.lc-zone-label{font-size:13px}}\n.lc-zone-desc{font-size:9px;color:#9ca3af}\n@media(min-width:640px){.lc-zone-desc{font-size:10px}}\n\n\/* ===== PACK DETAIL ===== *\/\n.lc-pack-detail{background:#f9fafb;border-radius:10px;padding:12px;border:1px solid #e5e7eb}\n@media(min-width:640px){.lc-pack-detail{border-radius:12px;padding:16px}}\n.lc-pack-detail h4{font-size:12px;font-weight:600;color:#374151;margin:0 0 8px}\n@media(min-width:640px){.lc-pack-detail h4{font-size:13px;margin:0 0 10px}}\n.lc-pack-detail-grid{display:grid;grid-template-columns:1fr;gap:4px}\n@media(min-width:400px){.lc-pack-detail-grid{grid-template-columns:1fr 1fr;gap:6px}}\n.lc-pack-item{display:flex;align-items:center;gap:6px;font-size:12px;color:#4b5563}\n@media(min-width:640px){.lc-pack-item{font-size:13px;gap:8px}}\n.lc-badge{padding:2px 6px;border-radius:4px;font-size:10px;font-weight:600}\n@media(min-width:640px){.lc-badge{padding:2px 8px;border-radius:6px;font-size:11px}}\n.lc-badge-blue{background:#dbeafe;color:#1d4ed8}\n.lc-badge-orange{background:#ffedd5;color:#c2410c}\n.lc-badge-green{background:#d1fae5;color:#047857}\n\n\/* ===== RANGE SLIDER ===== *\/\n.lc-range{width:100%;height:6px;border-radius:3px;background:#e2e8f0;outline:none;-webkit-appearance:none;appearance:none;margin-top:8px}\n.lc-range::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;border-radius:50%;background:#2563eb;cursor:pointer;box-shadow:0 2px 6px rgba(37,99,235,.3)}\n.lc-range::-moz-range-thumb{width:22px;height:22px;border-radius:50%;background:#2563eb;cursor:pointer;border:none}\n@media(min-width:640px){\n.lc-range::-webkit-slider-thumb{width:20px;height:20px}\n.lc-range::-moz-range-thumb{width:20px;height:20px}\n}\n.lc-range-val{text-align:center;font-size:14px;font-weight:700;color:#2563eb;margin-top:4px}\n\n\/* ===== RESULTS PANEL ===== *\/\n.lc-results{position:relative}\n@media(min-width:1024px){.lc-results{position:sticky;top:16px}}\n.lc-result-card{border-radius:10px;padding:12px;margin-bottom:10px;border:1px solid}\n@media(min-width:640px){.lc-result-card{border-radius:12px;padding:16px;margin-bottom:12px}}\n.lc-result-label{font-size:10px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}\n@media(min-width:640px){.lc-result-label{font-size:11px}}\n.lc-result-value{font-size:20px;font-weight:800;margin-top:2px}\n@media(min-width:640px){.lc-result-value{font-size:22px;margin-top:4px}}\n.lc-result-sub{font-size:10px;margin-top:2px}\n@media(min-width:640px){.lc-result-sub{font-size:11px}}\n.lc-rc-gray{background:#f9fafb;border-color:#e5e7eb}\n.lc-rc-gray .lc-result-label,.lc-rc-gray .lc-result-value{color:#1f2937}\n.lc-rc-gray .lc-result-sub{color:#6b7280}\n.lc-rc-green{background:#ecfdf5;border-color:#a7f3d0}\n.lc-rc-green .lc-result-label,.lc-rc-green .lc-result-value{color:#047857}\n.lc-rc-green .lc-result-sub{color:#059669}\n.lc-rc-red{background:#fef2f2;border-color:#fecaca}\n.lc-rc-red .lc-result-label,.lc-rc-red .lc-result-value{color:#b91c1c}\n.lc-rc-red .lc-result-sub{color:#dc2626}\n.lc-rc-blue{background:#eff6ff;border-color:#bfdbfe}\n.lc-rc-blue .lc-result-label,.lc-rc-blue .lc-result-value{color:#1d4ed8}\n.lc-rc-blue .lc-result-sub{color:#2563eb}\n.lc-rc-orange{background:#fff7ed;border-color:#fed7aa}\n.lc-rc-orange .lc-result-label,.lc-rc-orange .lc-result-value{color:#c2410c}\n.lc-rc-orange .lc-result-sub{color:#ea580c}\n.lc-rc-purple{background:linear-gradient(135deg,#f5f3ff,#eef2ff);border-color:#c4b5fd}\n.lc-rc-purple .lc-result-label{color:#6d28d9}\n.lc-roi-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:8px}\n@media(min-width:640px){.lc-roi-grid{gap:12px;margin-top:10px}}\n.lc-roi-item .lc-roi-val{font-size:16px;font-weight:800}\n@media(min-width:640px){.lc-roi-item .lc-roi-val{font-size:18px}}\n.lc-roi-item .lc-roi-lbl{font-size:10px}\n@media(min-width:640px){.lc-roi-item .lc-roi-lbl{font-size:11px}}\n.lc-roi-purple .lc-roi-val{color:#6d28d9}\n.lc-roi-purple .lc-roi-lbl{color:#7c3aed}\n.lc-roi-indigo .lc-roi-val{color:#4338ca}\n.lc-roi-indigo .lc-roi-lbl{color:#4f46e5}\n\n\/* ===== CHARTS ===== *\/\n.lc-chart-box{margin-top:14px}\n@media(min-width:640px){.lc-chart-box{margin-top:16px}}\n.lc-chart-title{font-size:12px;font-weight:600;color:#374151;margin-bottom:6px}\n@media(min-width:640px){.lc-chart-title{font-size:13px;margin-bottom:8px}}\n.lc-chart-wrap{position:relative;height:200px}\n@media(min-width:640px){.lc-chart-wrap{height:220px}}\n.lc-chart-wrap-pie{height:180px}\n@media(min-width:480px){.lc-chart-wrap-pie{height:200px}}\n@media(min-width:640px){.lc-chart-wrap-pie{height:220px}}\n.lc-chart-wrap-line{height:180px}\n@media(min-width:640px){.lc-chart-wrap-line{height:200px}}\n.lc-pie-legend{display:grid;grid-template-columns:1fr 1fr;gap:4px 8px;margin-top:8px}\n@media(min-width:480px){.lc-pie-legend{grid-template-columns:repeat(2,1fr);gap:4px 12px}}\n@media(min-width:640px){.lc-pie-legend{grid-template-columns:repeat(3,1fr);gap:6px 12px;margin-top:10px}}\n@media(min-width:900px){.lc-pie-legend{grid-template-columns:repeat(4,1fr)}}\n.lc-pie-legend-item{display:flex;align-items:center;gap:6px;font-size:11px;color:#4b5563;line-height:1.3}\n@media(min-width:640px){.lc-pie-legend-item{font-size:12px;gap:8px}}\n.lc-pie-legend-color{width:10px;height:10px;border-radius:2px;flex-shrink:0}\n@media(min-width:640px){.lc-pie-legend-color{width:12px;height:12px}}\n.lc-pie-legend-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.lc-pie-legend-value{font-weight:600;color:#1f293b;margin-left:auto;font-size:10px}\n@media(min-width:640px){.lc-pie-legend-value{font-size:11px}}\n\n\/* ===== VIABILITY ===== *\/\n.lc-viability{border-radius:10px;padding:12px;border:2px solid;margin-top:12px}\n@media(min-width:640px){.lc-viability{border-radius:12px;padding:16px;margin-top:16px}}\n.lc-viability-inner{display:flex;align-items:center;gap:10px}\n@media(min-width:640px){.lc-viability-inner{gap:12px}}\n.lc-viability-emoji{font-size:24px}\n@media(min-width:640px){.lc-viability-emoji{font-size:28px}}\n.lc-viability-title{font-weight:700;color:#1f293b;font-size:13px}\n@media(min-width:640px){.lc-viability-title{font-size:14px}}\n.lc-viability-desc{font-size:10px;color:#4b5563}\n@media(min-width:640px){.lc-viability-desc{font-size:11px}}\n.lc-v-green{background:#ecfdf5;border-color:#34d399}\n.lc-v-yellow{background:#fefce8;border-color:#fbbf24}\n.lc-v-orange{background:#fff7ed;border-color:#fb923c}\n.lc-v-red{background:#fef2f2;border-color:#f87171}\n\n\/* ===== BOT\u00d5ES PDF E AVISOS ===== *\/\n.lc-btn-pdf{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:13px 18px;background:linear-gradient(135deg,#1d4ed8,#0891b2);color:#ffffff;border:none;border-radius:10px;font-weight:700;font-size:13px;cursor:pointer;transition:all .2s ease;box-shadow:0 4px 14px rgba(29,78,216,.28);margin-top:14px}\n.lc-btn-pdf:hover{background:linear-gradient(135deg,#1e40af,#0e7490);box-shadow:0 6px 18px rgba(29,78,216,.38);transform:translateY(-1px)}\n.lc-btn-pdf:active{transform:translateY(0)}\n.lc-btn-pdf:disabled{opacity:.65;cursor:not-allowed;transform:none}\n.lc-btn-pdf-lg{padding:14px 26px;font-size:14px;width:auto;margin-top:0}\n@media(min-width:640px){.lc-btn-pdf-lg{font-size:15px;padding:15px 32px}}\n.lc-spinner{display:inline-block;width:16px;height:16px;border:2.5px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:lc-spin .8s linear infinite}\n@keyframes lc-spin{to{transform:rotate(360deg)}}\n\n.lc-disclaimer-box{background:#fffbeb;border:1px solid #fde68a;border-left:4px solid #f59e0b;color:#92400e;border-radius:8px;padding:10px 12px;font-size:11px;line-height:1.45;margin-top:12px}\n.lc-disclaimer-box strong{font-weight:700}\n\n.lc-pdf-banner{background:#f0fdf4;border:1.5px solid #86efac;border-radius:12px;padding:16px;margin-top:18px;display:flex;flex-direction:column;gap:14px;align-items:flex-start}\n@media(min-width:640px){.lc-pdf-banner{flex-direction:row;align-items:center;justify-content:space-between;padding:20px 24px}}\n.lc-pdf-banner-info h4{margin:0 0 4px;font-size:14px;font-weight:800;color:#166534}\n@media(min-width:640px){.lc-pdf-banner-info h4{font-size:16px}}\n.lc-pdf-banner-info p{margin:0;font-size:11px;color:#15803d;line-height:1.4}\n@media(min-width:640px){.lc-pdf-banner-info p{font-size:12px}}\n\n\/* ===== CART\u00c3O DE CONTACTO ===== *\/\n.lc-contact-card{background:linear-gradient(135deg,#0f172a,#1e3a8a);color:#ffffff;border-radius:14px;padding:20px 16px;margin-top:20px;box-shadow:0 8px 24px rgba(15,23,42,.15)}\n@media(min-width:640px){.lc-contact-card{padding:26px 28px;border-radius:16px}}\n.lc-cc-head{display:flex;align-items:center;gap:12px;margin-bottom:12px}\n.lc-cc-icon{font-size:28px}\n.lc-cc-title{font-size:16px;font-weight:800;color:#ffffff;margin:0}\n@media(min-width:640px){.lc-cc-title{font-size:18px}}\n.lc-cc-sub{font-size:12px;color:#93c5fd;margin-top:2px}\n.lc-cc-grid{display:grid;grid-template-columns:1fr;gap:16px;margin-top:16px}\n@media(min-width:768px){.lc-cc-grid{grid-template-columns:1.2fr .8fr;gap:24px;align-items:center}}\n.lc-cc-bullets{margin:0;padding-left:18px;font-size:12px;line-height:1.6;color:#e2e8f0}\n.lc-cc-actions{display:flex;flex-direction:column;gap:10px;background:rgba(255,255,255,.08);padding:14px;border-radius:10px;border:1px solid rgba(255,255,255,.15)}\n.lc-cc-btn-phone{display:flex;align-items:center;justify-content:center;gap:8px;background:#10b981;color:#fff;padding:10px 14px;border-radius:8px;font-weight:700;font-size:14px;text-decoration:none;transition:background .2s}\n.lc-cc-btn-phone:hover{background:#059669}\n.lc-cc-btn-web{display:flex;align-items:center;justify-content:center;gap:8px;background:#ffffff;color:#1e40af;padding:10px 14px;border-radius:8px;font-weight:700;font-size:13px;text-decoration:none;transition:background .2s}\n.lc-cc-btn-web:hover{background:#f1f5f9}\n\n\/* ===== TABELA DE RESUMO ===== *\/\n.lc-table-wrap{overflow-x:auto;margin-top:8px;-webkit-overflow-scrolling:touch}\n.lc-table{width:100%;border-collapse:collapse;font-size:12px;min-width:400px}\n@media(min-width:640px){.lc-table{font-size:13px}}\n.lc-table th{text-align:left;padding:8px 12px;font-weight:600;color:#374151;border-bottom:2px solid #e5e7eb;white-space:nowrap}\n@media(min-width:640px){.lc-table th{padding:10px 16px}}\n.lc-table th:last-child,.lc-table .lc-td-r{text-align:right}\n.lc-table td{padding:6px 12px;border-bottom:1px solid #f3f4f6}\n@media(min-width:640px){.lc-table td{padding:8px 16px}}\n.lc-table .lc-tr-income{background:#ecfdf5}\n.lc-table .lc-tr-income td{color:#047857;font-weight:600}\n.lc-table .lc-tr-cost td:first-child{padding-left:24px;color:#6b7280}\n@media(min-width:640px){.lc-table .lc-tr-cost td:first-child{padding-left:32px}}\n.lc-table .lc-tr-cost td:last-child,.lc-table .lc-tr-cost .lc-td-r{color:#dc2626}\n.lc-table .lc-tr-total{background:#f9fafb;border-top:2px solid #d1d5db}\n.lc-table .lc-tr-total td{font-weight:700;color:#374151}\n.lc-table .lc-tr-benefit{font-weight:700}\n.lc-table .lc-tr-benefit td{padding:10px 12px}\n@media(min-width:640px){.lc-table .lc-tr-benefit td{padding:12px 16px}}\n.lc-tr-pos{background:#eff6ff}\n.lc-tr-pos td{color:#1d4ed8}\n.lc-tr-neg{background:#fff7ed}\n.lc-tr-neg td{color:#c2410c}\n\n\/* ===== KPIs ===== *\/\n.lc-kpis{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:16px}\n@media(min-width:480px){.lc-kpis{grid-template-columns:repeat(5,1fr);gap:10px}}\n.lc-kpi{background:#f9fafb;border-radius:8px;padding:10px;text-align:center;border:1px solid #e5e7eb}\n@media(min-width:640px){.lc-kpi{border-radius:10px;padding:12px}}\n.lc-kpi-label{font-size:10px;color:#6b7280;text-transform:uppercase;letter-spacing:.3px}\n@media(min-width:640px){.lc-kpi-label{font-size:11px}}\n.lc-kpi-value{font-size:14px;font-weight:700;color:#1f293b;margin-top:2px}\n@media(min-width:640px){.lc-kpi-value{font-size:16px}}\n\n\/* ===== FOOTER ===== *\/\n.lc-footer{text-align:center;padding:20px 12px;border-top:1px solid #e5e7eb;margin-top:24px}\n@media(min-width:640px){.lc-footer{padding:24px 16px;margin-top:32px}}\n.lc-footer-brand{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:8px}\n.lc-footer-logo{width:28px;height:28px;background:#2563eb;border-radius:6px;display:flex;align-items:center;justify-content:center}\n@media(min-width:640px){.lc-footer-logo{width:32px;height:32px;border-radius:8px}}\n.lc-footer-logo svg{width:16px;height:16px}\n@media(min-width:640px){.lc-footer-logo svg{width:20px;height:20px}}\n.lc-footer-name{font-weight:700;color:#374151;font-size:13px}\n@media(min-width:640px){.lc-footer-name{font-size:14px}}\n.lc-footer p{font-size:10px;color:#9ca3af;margin:4px 0;max-width:600px;margin-left:auto;margin-right:auto;line-height:1.5}\n@media(min-width:640px){.lc-footer p{font-size:11px}}\n.lc-footer a{color:#2563eb;text-decoration:underline}\n\n\/* ===== NOTAS ===== *\/\n.lc-note{background:#f9fafb;border-radius:8px;padding:10px 12px;border:1px solid #e5e7eb;margin-top:12px;font-size:11px;color:#4b5563;line-height:1.5}\n@media(min-width:640px){.lc-note{border-radius:10px;padding:12px 16px;font-size:12px;line-height:1.6}}\n\n\/* ===== UTILIT\u00c1RIOS ===== *\/\n.lc-mt-12{margin-top:12px}\n@media(min-width:640px){.lc-mt-12{margin-top:16px}}\n.lc-mt-16{margin-top:16px}\n@media(min-width:640px){.lc-mt-16{margin-top:20px}}\n\n\/* ===== SCROLLBAR ===== *\/\n.lc-table-wrap::-webkit-scrollbar{height:6px}\n.lc-table-wrap::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}\n.lc-table-wrap::-webkit-scrollbar-thumb{background:#94a3b8;border-radius:3px}\n<\/style>\n\n<script data-wp-block-html=\"js\">\n(function(){\n  function runLacoladaCalculator(){\n    \/\/ ===== DATA (PORTUGU\u00caS) =====\n    var PACKS = {\n      basic: {\n        name:'Basic', price:28790, desc:'A sua primeira lavandaria, pronta a faturar',\n        lavadoras:[{c:2,kg:10,t:'Lavadora 10Kg'},{c:1,kg:16,t:'Lavadora 16Kg'}],\n        secadoras:[{c:1,kg:18,t:'Secadora 18Kg'}], monederos:4, pop:'5.000 - 15.000', minM2:30\n      },\n      standard: {\n        name:'Standard', price:35150, desc:'Mais variedade de cargas, mais clientes',\n        lavadoras:[{c:1,kg:10,t:'Lavadora 10Kg'},{c:1,kg:12,t:'Lavadora 12Kg'},{c:1,kg:16,t:'Lavadora 16Kg'}],\n        secadoras:[{c:2,kg:18,t:'Secadora 18Kg'}], monederos:5, pop:'10.000 - 25.000', minM2:40\n      },\n      classic: {\n        name:'Classic Original', price:34035, desc:'A configura\u00e7\u00e3o mais popular entre parceiros',\n        lavadoras:[{c:2,kg:10,t:'Lavadora 10Kg'},{c:1,kg:16,t:'Lavadora 16Kg'}],\n        secadoras:[{c:2,kg:18,t:'Secadora 18Kg'}], monederos:5, pop:'10.000 - 30.000', minM2:40\n      },\n      original: {\n        name:'Original', price:43360, desc:'Para espa\u00e7os com elevado tr\u00e1fego pedonal',\n        lavadoras:[{c:2,kg:12,t:'Lavadora 12Kg'},{c:2,kg:16,t:'Lavadora 16Kg'}],\n        secadoras:[{c:2,kg:18,t:'Secadora 18Kg'}], monederos:6, pop:'20.000 - 50.000', minM2:50\n      },\n      grandUrban: {\n        name:'Grand Urban', price:55715, desc:'Para grandes popula\u00e7\u00f5es e elevada procura',\n        lavadoras:[{c:3,kg:12,t:'Lavadora 12Kg'},{c:2,kg:16,t:'Lavadora 16Kg'}],\n        secadoras:[{c:3,kg:18,t:'Secadora 18Kg'}], monederos:8, pop:'30.000 - 100.000+', minM2:60\n      }\n    };\n\n    var ZONES = [\n      {key:'residencial',label:'Residencial',emoji:'\ud83c\udfd8\ufe0f',desc:'Fam\u00edlias e bairros habituais',factor:1.0},\n      {key:'universitaria',label:'Universit\u00e1ria',emoji:'\ud83c\udf93',desc:'Estudantes e elevada rota\u00e7\u00e3o',factor:1.3},\n      {key:'turistica',label:'Tur\u00edstica',emoji:'\ud83c\udfd6\ufe0f',desc:'Zona costeira ou centro tur\u00edstico',factor:1.2},\n      {key:'mixta',label:'Mista',emoji:'\ud83c\udfd9\ufe0f',desc:'Comercial, laboral e residencial',factor:1.1}\n    ];\n\n    var selectedPack = 'classic';\n    var selectedZone = 'residencial';\n\n    \/\/ ===== HELPERS =====\n    function fmt(n){ return Math.round(n).toLocaleString('pt-PT'); }\n    function val(id){\n      var el = document.getElementById(id);\n      if(!el) return 0;\n      var parsed = parseFloat(el.value);\n      return isNaN(parsed) ? 0 : parsed;\n    }\n\n    \/\/ ===== DYNAMIC TARIFF BADGES =====\n    function updateTarifHints(){\n      var p = PACKS[selectedPack];\n      var c10 = 0, c12 = 0, c16 = 0, cSec = 0;\n      p.lavadoras.forEach(function(l){\n        if(l.kg === 10) c10 += l.c;\n        if(l.kg === 12) c12 += l.c;\n        if(l.kg === 16) c16 += l.c;\n      });\n      p.secadoras.forEach(function(s){\n        cSec += s.c;\n      });\n\n      var h10 = document.getElementById('hintP10');\n      var h12 = document.getElementById('hintP12');\n      var h16 = document.getElementById('hintP16');\n      var hSec = document.getElementById('hintPSec');\n\n      if(h10){\n        h10.innerHTML = c10 > 0 ? ('<span class=\"lc-hint-ok\">\ud83d\udfe2 ' + c10 + ' m\u00e1q. no pack ' + p.name + '<\/span>') : ('<span class=\"lc-hint-dim\">\u26aa N\u00e3o inclu\u00edda no pack ' + p.name + '<\/span>');\n      }\n      if(h12){\n        h12.innerHTML = c12 > 0 ? ('<span class=\"lc-hint-ok\">\ud83d\udfe2 ' + c12 + ' m\u00e1q. no pack ' + p.name + '<\/span>') : ('<span class=\"lc-hint-dim\">\u26aa N\u00e3o inclu\u00edda no pack ' + p.name + '<\/span>');\n      }\n      if(h16){\n        h16.innerHTML = c16 > 0 ? ('<span class=\"lc-hint-ok\">\ud83d\udfe2 ' + c16 + ' m\u00e1q. no pack ' + p.name + '<\/span>') : ('<span class=\"lc-hint-dim\">\u26aa N\u00e3o inclu\u00edda no pack ' + p.name + '<\/span>');\n      }\n      if(hSec){\n        hSec.innerHTML = cSec > 0 ? ('<span class=\"lc-hint-ok\">\ud83d\udfe2 ' + cSec + ' m\u00e1q. no pack ' + p.name + '<\/span>') : ('<span class=\"lc-hint-dim\">\u26aa N\u00e3o inclu\u00edda no pack ' + p.name + '<\/span>');\n      }\n    }\n\n    \/\/ ===== INIT PACKS =====\n    function renderPacks(){\n      var c = document.getElementById('packsContainer');\n      c.innerHTML = '';\n      Object.keys(PACKS).forEach(function(key){\n        var p = PACKS[key];\n        var totalLav = p.lavadoras.reduce(function(s,l){return s+l.c;},0);\n        var totalSec = p.secadoras.reduce(function(s,l){return s+l.c;},0);\n        var div = document.createElement('div');\n        div.className = 'lc-pack' + (key===selectedPack?' active':'');\n        div.innerHTML = '<div class=\"lc-pack-name\">'+p.name+'<\/div>'+\n          '<div class=\"lc-pack-price\">'+fmt(p.price)+'\u20ac<\/div>'+\n          '<div class=\"lc-pack-desc\">'+p.desc+'<\/div>'+\n          '<div class=\"lc-pack-info\">'+totalLav+' lav. + '+totalSec+' sec.<\/div>'+\n          '<div class=\"lc-pack-pop\">\ud83d\udc65 '+p.pop+' hab.<\/div>';\n        div.onclick = function(){\n          selectedPack = key;\n          renderPacks();\n          renderPackDetail();\n          updateTarifHints();\n          calculate();\n        };\n        c.appendChild(div);\n      });\n    }\n\n    function renderPackDetail(){\n      var p = PACKS[selectedPack];\n      var html = '<h4>Detalhe do pack selecionado:<\/h4><div class=\"lc-pack-detail-grid\">';\n      p.lavadoras.forEach(function(l){\n        html += '<div class=\"lc-pack-item\"><span class=\"lc-badge lc-badge-blue\">'+l.c+'x<\/span> '+l.t+'<\/div>';\n      });\n      p.secadoras.forEach(function(s){\n        html += '<div class=\"lc-pack-item\"><span class=\"lc-badge lc-badge-orange\">'+s.c+'x<\/span> '+s.t+'<\/div>';\n      });\n      html += '<div class=\"lc-pack-item\"><span class=\"lc-badge lc-badge-green\">'+p.monederos+'x<\/span> Moedeiros de seguran\u00e7a<\/div>';\n      html += '<\/div>';\n      document.getElementById('packDetail').innerHTML = html;\n    }\n\n    \/\/ ===== INIT ZONES =====\n    function renderZones(){\n      var c = document.getElementById('zonesContainer');\n      c.innerHTML = '';\n      ZONES.forEach(function(z){\n        var div = document.createElement('div');\n        div.className = 'lc-zone' + (z.key===selectedZone?' active':'');\n        div.innerHTML = '<div class=\"lc-zone-emoji\">'+z.emoji+'<\/div><div class=\"lc-zone-label\">'+z.label+'<\/div><div class=\"lc-zone-desc\">'+z.desc+'<\/div>';\n        div.onclick = function(){\n          selectedZone = z.key;\n          renderZones();\n          calculate();\n        };\n        c.appendChild(div);\n      });\n    }\n\n    \/\/ ===== CHARTS =====\n    var chartBar, chartPie, chartLine;\n    function isMobile(){ return window.innerWidth < 640; }\n\n    function initCharts(){\n      var mob = isMobile();\n      var fontSize = mob ? 9 : 11;\n      var ctxBar = document.getElementById('chartBar').getContext('2d');\n      chartBar = new Chart(ctxBar, {\n        type:'bar',\n        data:{ labels:['Receitas','Custos','Lucro'], datasets:[{data:[0,0,0],backgroundColor:['#10b981','#ef4444','#3b82f6'],borderRadius:6}] },\n        options:{responsive:true,maintainAspectRatio:false,layout:{padding:{top:5,bottom:5,left:0,right:0}},plugins:{legend:{display:false},tooltip:{callbacks:{label:function(c){return fmt(c.raw)+'\u20ac';}}}},scales:{y:{ticks:{callback:function(v){return (v\/1000).toFixed(0)+'k';},font:{size:fontSize},padding:mob?4:8},grid:{color:'#f0f0f0'},border:{display:false}},x:{ticks:{font:{size:fontSize},padding:mob?2:4},grid:{display:false},border:{display:false}}}}\n      });\n\n      var ctxPie = document.getElementById('chartPie').getContext('2d');\n      chartPie = new Chart(ctxPie, {\n        type:'doughnut',\n        data:{ labels:[], datasets:[{data:[],backgroundColor:[],borderWidth:2,borderColor:'#fff'}] },\n        options:{responsive:true,maintainAspectRatio:false,cutout:mob?'48%':'55%',layout:{padding:{top:mob?0:5,bottom:0,left:mob?0:5,right:mob?0:5}},plugins:{legend:{display:false},tooltip:{callbacks:{label:function(c){return c.label+': '+fmt(c.raw)+'\u20ac';}}}}}\n      });\n\n      var ctxLine = document.getElementById('chartLine').getContext('2d');\n      chartLine = new Chart(ctxLine, {\n        type:'line',\n        data:{ labels:mob?['A1','A2','A3','A4','A5']:['Ano 1','Ano 2','Ano 3','Ano 4','Ano 5'], datasets:[{label:'Cash flow acumulado',data:[0,0,0,0,0],borderColor:'#3b82f6',backgroundColor:'rgba(59,130,246,0.12)',fill:true,tension:0.3,pointRadius:mob?3:5,pointBackgroundColor:'#3b82f6',borderWidth:2}] },\n        options:{responsive:true,maintainAspectRatio:false,layout:{padding:{top:5,bottom:0,left:mob?0:5,right:mob?0:5}},plugins:{legend:{display:false},tooltip:{callbacks:{label:function(c){return fmt(c.raw)+'\u20ac';}}}},scales:{y:{ticks:{callback:function(v){return (v\/1000).toFixed(0)+'k';},font:{size:fontSize},padding:mob?4:8,maxTicksLimit:mob?5:6},grid:{color:'#f0f0f0'},border:{display:false}},x:{ticks:{font:{size:fontSize},padding:mob?2:4,maxRotation:0,minRotation:0},grid:{display:false},border:{display:false}}}}\n      });\n    }\n\n    \/\/ ===== CALCULATE (ALTAMENTE SENS\u00cdVEL A CADA PAR\u00c2METRO) =====\n    function calculate(){\n      var pack = PACKS[selectedPack];\n      var poblacion = Math.max(0, val('inpPoblacion'));\n      var competencia = Math.max(0, val('inpCompetencia'));\n      var m2 = Math.max(1, val('inpM2'));\n      var alquiler = Math.max(0, val('inpAlquiler'));\n      var obra = Math.max(0, val('inpObra'));\n      var p10 = Math.max(0, val('inpPrecio10'));\n      var p12 = Math.max(0, val('inpPrecio12'));\n      var p16 = Math.max(0, val('inpPrecio16'));\n      var pSec = Math.max(0, val('inpPrecioSecado'));\n      var cAgua = Math.max(0, val('inpAgua'));\n      var cLuz = Math.max(0, val('inpLuz'));\n      var cGas = Math.max(0, val('inpGas'));\n      var cProd = Math.max(0, val('inpProductos'));\n      var cMant = Math.max(0, val('inpMantenimiento'));\n      var cSeg = Math.max(0, val('inpSeguros'));\n      var cOtros = Math.max(0, val('inpOtros'));\n      var ocup = Math.max(5, Math.min(100, val('inpOcupacion')));\n\n      document.getElementById('ocupacionVal').textContent = ocup + '%';\n\n      \/\/ Hints interativos\n      var hp = document.getElementById('hintPoblacion');\n      if(poblacion < 5000){ hp.textContent = '\u26a0\ufe0f Popula\u00e7\u00e3o reduzida - procura mais concentrada'; hp.className = 'lc-hint lc-hint-warn'; }\n      else if(poblacion < 15000){ hp.textContent = '\u2705 Popula\u00e7\u00e3o adequada para lavandaria self-service'; hp.className = 'lc-hint lc-hint-ok'; }\n      else if(poblacion < 50000){ hp.textContent = '\u2705 Boa densidade populacional - fluxo de clientes constante'; hp.className = 'lc-hint lc-hint-ok'; }\n      else{ hp.textContent = '\ud83c\udf1f Grande popula\u00e7\u00e3o - elevado potencial e rota\u00e7\u00e3o de clientes'; hp.className = 'lc-hint lc-hint-ok'; }\n\n      var hc = document.getElementById('hintCompetencia');\n      if(competencia === 0){ hc.textContent = '\ud83c\udf1f Sem concorr\u00eancia direta na zona imediata'; hc.className = 'lc-hint lc-hint-ok'; }\n      else if(competencia <= 2){ hc.textContent = '\u2705 Concorr\u00eancia moderada absorvida pela procura'; hc.className = 'lc-hint lc-hint-ok'; }\n      else{ hc.textContent = '\u26a0\ufe0f Zona com elevada concorr\u00eancia direta'; hc.className = 'lc-hint lc-hint-warn'; }\n\n      var hm = document.getElementById('hintM2');\n      if(m2 >= pack.minM2){ hm.textContent = '\u2705 \u00c1rea adequada para o pack ' + pack.name + ' (m\u00edn. ' + pack.minM2 + 'm\u00b2)'; hm.className = 'lc-hint lc-hint-ok'; }\n      else{ hm.textContent = '\u26a0\ufe0f Recomenda-se um m\u00ednimo de ' + pack.minM2 + 'm\u00b2 para este pack (espa\u00e7o reduzido)'; hm.className = 'lc-hint lc-hint-warn'; }\n\n      var ha = document.getElementById('hintAlquiler');\n      ha.textContent = (alquiler \/ m2).toFixed(1) + ' \u20ac\/m\u00b2 por m\u00eas';\n      ha.className = 'lc-hint';\n\n      \/\/ Factor de Zona\n      var zoneFactor = 1.0;\n      ZONES.forEach(function(z){ if(z.key === selectedZone) zoneFactor = z.factor; });\n\n      \/\/ Factor de Popula\u00e7\u00e3o\n      var ajustePop;\n      if(poblacion <= 15000){\n        ajustePop = 0.45 + 0.55 * Math.pow(Math.max(1000, poblacion) \/ 15000.0, 0.7);\n      } else {\n        ajustePop = 1.00 + 0.30 * (1.0 - Math.exp(-(poblacion - 15000.0) \/ 45000.0));\n      }\n\n      \/\/ Factor de Concorr\u00eancia\n      var factorComp = Math.max(0.30, 1.0 - (competencia * 0.15));\n\n      \/\/ Factor de \u00c1rea do Espa\u00e7o\n      var factorM2 = 1.0;\n      if(m2 < pack.minM2){\n        factorM2 = Math.max(0.80, m2 \/ pack.minM2);\n      } else {\n        factorM2 = Math.min(1.04, 0.98 + 0.02 * (m2 \/ pack.minM2));\n      }\n\n      \/\/ Ocupa\u00e7\u00e3o operacional e ciclos di\u00e1rios\n      var ocupFactor = ocup \/ 100.0;\n      var ciclosLavDia = 12 * ocupFactor;\n      var ciclosSecDia = 14 * ocupFactor;\n\n      \/\/ Fatura\u00e7\u00e3o di\u00e1ria segundo equipamentos\n      var ingDiariosLav = 0;\n      pack.lavadoras.forEach(function(l){\n        var precio = l.kg === 10 ? p10 : (l.kg === 12 ? p12 : p16);\n        ingDiariosLav += l.c * ciclosLavDia * precio;\n      });\n      var ingDiariosSec = 0;\n      pack.secadoras.forEach(function(s){\n        ingDiariosSec += s.c * ciclosSecDia * pSec;\n      });\n\n      var ingDiariosBase = (ingDiariosLav + ingDiariosSec) * zoneFactor * factorComp;\n      var ingDiarios = ingDiariosBase * ajustePop * factorM2;\n      var ingMes = ingDiarios * 30;\n      var ingAnual = ingMes * 12;\n\n      \/\/ Custos operacionais\n      var costesMes = alquiler + cAgua + cLuz + cGas + cProd + cMant + cSeg + cOtros;\n      var costesAnual = costesMes * 12;\n\n      \/\/ Lucro e retorno\n      var benefMes = ingMes - costesMes;\n      var benefAnual = benefMes * 12;\n      var inversion = pack.price + obra;\n\n      var roiAnual = inversion > 0 ? (benefAnual \/ inversion) * 100 : 0;\n      var mesesRecup = benefMes > 0 ? Math.ceil(inversion \/ benefMes) : Infinity;\n\n      var totalLav = pack.lavadoras.reduce(function(s,l){ return s + l.c; }, 0);\n      var totalSec = pack.secadoras.reduce(function(s,l){ return s + l.c; }, 0);\n      var totalCiclos = Math.round((totalLav * ciclosLavDia + totalSec * ciclosSecDia) * zoneFactor * factorComp * ajustePop * factorM2);\n\n      var margen = ingMes > 0 ? ((benefMes \/ ingMes) * 100) : 0;\n      var rendM2 = benefMes \/ m2;\n\n      \/\/ ===== ATUALIZAR INTERFACE WEB =====\n      document.getElementById('resInversion').textContent = fmt(inversion) + '\u20ac';\n      document.getElementById('resInversionSub').textContent = 'Equipamentos: ' + fmt(pack.price) + '\u20ac + Obras: ' + fmt(obra) + '\u20ac';\n\n      document.getElementById('resIngresos').textContent = fmt(ingMes) + '\u20ac\/m\u00eas';\n      document.getElementById('resIngresosSub').textContent = fmt(ingAnual) + '\u20ac\/ano \u00b7 ~' + totalCiclos + ' ciclos\/dia';\n\n      document.getElementById('resCostes').textContent = fmt(costesMes) + '\u20ac\/m\u00eas';\n\n      var bCard = document.getElementById('resBeneficioCard');\n      var bLabel = document.getElementById('resBeneficioLabel');\n      var bVal = document.getElementById('resBeneficio');\n      var bSub = document.getElementById('resBeneficioSub');\n      if(benefMes >= 0){\n        bCard.className = 'lc-result-card lc-rc-blue';\n        bLabel.style.color = '#1d4ed8';\n        bVal.style.color = '#1d4ed8';\n        bSub.style.color = '#2563eb';\n      } else {\n        bCard.className = 'lc-result-card lc-rc-orange';\n        bLabel.style.color = '#c2410c';\n        bVal.style.color = '#c2410c';\n        bSub.style.color = '#ea580c';\n      }\n      bVal.textContent = fmt(benefMes) + '\u20ac\/m\u00eas';\n      bSub.textContent = fmt(benefAnual) + '\u20ac\/ano';\n\n      document.getElementById('resRoiAnual').textContent = roiAnual.toFixed(1) + '%';\n      document.getElementById('resMeses').textContent = mesesRecup === Infinity ? 'N\u00e3o amortiz\u00e1vel' : mesesRecup + ' meses';\n\n      \/\/ Gr\u00e1ficos\n      if(chartBar){\n        chartBar.data.datasets[0].data = [Math.round(ingMes), Math.round(costesMes), Math.round(benefMes)];\n        chartBar.update();\n      }\n\n      var costeData = [\n        {name:'Renda',val:alquiler,color:'#ef4444'},\n        {name:'Eletricidade',val:cLuz,color:'#f59e0b'},\n        {name:'\u00c1gua',val:cAgua,color:'#3b82f6'},\n        {name:'G\u00e1s',val:cGas,color:'#8b5cf6'},\n        {name:'Detergentes',val:cProd,color:'#10b981'},\n        {name:'Manuten\u00e7\u00e3o',val:cMant,color:'#ec4899'},\n        {name:'Seguros',val:cSeg,color:'#6366f1'},\n        {name:'Outros',val:cOtros,color:'#64748b'}\n      ].filter(function(d){ return d.val > 0; });\n\n      if(chartPie){\n        chartPie.data.labels = costeData.map(function(d){ return d.name; });\n        chartPie.data.datasets[0].data = costeData.map(function(d){ return d.val; });\n        chartPie.data.datasets[0].backgroundColor = costeData.map(function(d){ return d.color; });\n        chartPie.update();\n      }\n\n      var totalCoste = costeData.reduce(function(s,d){ return s + d.val; }, 0);\n      var legendHtml = '';\n      costeData.forEach(function(d){\n        var pct = totalCoste > 0 ? ((d.val \/ totalCoste) * 100).toFixed(0) : 0;\n        legendHtml += '<div class=\"lc-pie-legend-item\">'+\n          '<span class=\"lc-pie-legend-color\" style=\"background:'+d.color+'\"><\/span>'+\n          '<span class=\"lc-pie-legend-label\">'+d.name+'<\/span>'+\n          '<span class=\"lc-pie-legend-value\">'+pct+'%<\/span>'+\n          '<\/div>';\n      });\n      document.getElementById('pieLegend').innerHTML = legendHtml;\n\n      if(chartLine){\n        var proyData = [1,2,3,4,5].map(function(a){ return Math.round(benefMes * 12 * a - inversion); });\n        chartLine.data.datasets[0].data = proyData;\n        chartLine.update();\n      }\n\n      \/\/ Viabilidade\n      var vBox = document.getElementById('viabilityBox');\n      var vEmoji = document.getElementById('viabilityEmoji');\n      var vTitle = document.getElementById('viabilityTitle');\n      var vDesc = document.getElementById('viabilityDesc');\n      if(benefMes > 1500){ vBox.className='lc-viability lc-v-green'; vEmoji.textContent='\ud83d\udfe2'; vTitle.textContent='Alta Viabilidade'; vDesc.textContent='Excelente oportunidade de neg\u00f3cio rent\u00e1vel'; }\n      else if(benefMes > 800){ vBox.className='lc-viability lc-v-yellow'; vEmoji.textContent='\ud83d\udfe1'; vTitle.textContent='Viabilidade Moderada'; vDesc.textContent='Neg\u00f3cio rent\u00e1vel com margem comercial aceit\u00e1vel'; }\n      else if(benefMes > 0){ vBox.className='lc-viability lc-v-orange'; vEmoji.textContent='\ud83d\udfe0'; vTitle.textContent='Viabilidade Ajustada'; vDesc.textContent='Rentabilidade reduzida, conv\u00e9m otimizar custos'; }\n      else{ vBox.className='lc-viability lc-v-red'; vEmoji.textContent='\ud83d\udd34'; vTitle.textContent='N\u00e3o Vi\u00e1vel'; vDesc.textContent='Rever configura\u00e7\u00e3o ou procurar espa\u00e7o com menor renda'; }\n\n      \/\/ Tabela de resultados\n      var tb = document.getElementById('tableBody');\n      var rows = [\n        {cls:'lc-tr-income',label:'Receitas estimadas por ciclos',m:ingMes,a:ingAnual,neg:false},\n        {cls:'lc-tr-cost',label:'Renda do espa\u00e7o comercial',m:alquiler,a:alquiler*12,neg:true},\n        {cls:'lc-tr-cost',label:'\u00c1gua e saneamento',m:cAgua,a:cAgua*12,neg:true},\n        {cls:'lc-tr-cost',label:'Eletricidade',m:cLuz,a:cLuz*12,neg:true},\n        {cls:'lc-tr-cost',label:'G\u00e1s',m:cGas,a:cGas*12,neg:true},\n        {cls:'lc-tr-cost',label:'Detergentes e qu\u00edmicos de lavagem',m:cProd,a:cProd*12,neg:true},\n        {cls:'lc-tr-cost',label:'Manuten\u00e7\u00e3o preventiva',m:cMant,a:cMant*12,neg:true},\n        {cls:'lc-tr-cost',label:'Seguros e alarmes',m:cSeg,a:cSeg*12,neg:true},\n        {cls:'lc-tr-cost',label:'Outros custos diversos',m:cOtros,a:cOtros*12,neg:true},\n        {cls:'lc-tr-total',label:'Total de Custos Operacionais',m:costesMes,a:costesAnual,neg:true},\n        {cls:'lc-tr-benefit '+(benefMes>=0?'lc-tr-pos':'lc-tr-neg'),label:'LUCRO L\u00cdQUIDO ESTIMADO',m:benefMes,a:benefAnual,neg:benefMes<0}\n      ];\n      var thtml = '';\n      rows.forEach(function(r){\n        var sign = r.neg ? '-' : '';\n        thtml += '<tr class=\"'+r.cls+'\"><td>'+r.label+'<\/td><td class=\"lc-td-r\">'+sign+fmt(r.m)+'\u20ac<\/td><td class=\"lc-td-r\">'+sign+fmt(r.a)+'\u20ac<\/td><\/tr>';\n      });\n      tb.innerHTML = thtml;\n\n      \/\/ KPIs\n      document.getElementById('kpisContainer').innerHTML = \n        '<div class=\"lc-kpi\"><div class=\"lc-kpi-label\">Pack<\/div><div class=\"lc-kpi-value\">'+pack.name+'<\/div><\/div>'+\n        '<div class=\"lc-kpi\"><div class=\"lc-kpi-label\">Equipamentos<\/div><div class=\"lc-kpi-value\">'+totalLav+'L + '+totalSec+'S<\/div><\/div>'+\n        '<div class=\"lc-kpi\"><div class=\"lc-kpi-label\">Ciclos\/dia est.<\/div><div class=\"lc-kpi-value\">'+totalCiclos+'<\/div><\/div>'+\n        '<div class=\"lc-kpi\"><div class=\"lc-kpi-label\">Margem l\u00edquida<\/div><div class=\"lc-kpi-value\">'+margen.toFixed(0)+'%<\/div><\/div>'+\n        '<div class=\"lc-kpi\"><div class=\"lc-kpi-label\">Rendimento m\u00b2<\/div><div class=\"lc-kpi-value\">'+rendM2.toFixed(1)+' \u20ac\/m\u00b2<\/div><\/div>';\n    }\n\n    \/\/ ===== FUN\u00c7\u00c3O AUXILIAR PARA OBTER PNG COM FUNDO BRANCO =====\n    function getCanvasPng(canvasId) {\n      var canvas = document.getElementById(canvasId);\n      if (!canvas) return null;\n      try {\n        var tmpCanvas = document.createElement('canvas');\n        tmpCanvas.width = canvas.width;\n        tmpCanvas.height = canvas.height;\n        var ctx = tmpCanvas.getContext('2d');\n        ctx.fillStyle = '#ffffff';\n        ctx.fillRect(0, 0, tmpCanvas.width, tmpCanvas.height);\n        ctx.drawImage(canvas, 0, 0);\n        return tmpCanvas.toDataURL('image\/png', 1.0);\n      } catch (err) {\n        console.warn('Fallback export canvas ' + canvasId, err);\n        try {\n          return canvas.toDataURL('image\/png');\n        } catch (e) {\n          return null;\n        }\n      }\n    }\n\n    \/\/ ===== GERADOR VECTORIAL DE PDF EM PORTUGU\u00caS (COM JSPDF) =====\n    function generateOfficialPdf(){\n      if(!window.jspdf || !window.jspdf.jsPDF){\n        alert('A biblioteca de exporta\u00e7\u00e3o PDF est\u00e1 a carregar ou indispon\u00edvel. A abrir vista de impress\u00e3o...');\n        window.print();\n        return;\n      }\n\n      var btnR = document.getElementById('btnDownloadPdfRight');\n      var btnB = document.getElementById('btnDownloadPdfBottom');\n      var origR = btnR ? btnR.innerHTML : '';\n      var origB = btnB ? btnB.innerHTML : '';\n      var loadingHtml = '<span class=\"lc-spinner\"><\/span> A gerar PDF oficial...';\n\n      if(btnR){ btnR.innerHTML = loadingHtml; btnR.disabled = true; }\n      if(btnB){ btnB.innerHTML = loadingHtml; btnB.disabled = true; }\n\n      setTimeout(function(){\n        try {\n          var pack = PACKS[selectedPack];\n          var poblacion = Math.max(0, val('inpPoblacion'));\n          var competencia = Math.max(0, val('inpCompetencia'));\n          var m2 = Math.max(1, val('inpM2'));\n          var alquiler = Math.max(0, val('inpAlquiler'));\n          var obra = Math.max(0, val('inpObra'));\n          var p10 = Math.max(0, val('inpPrecio10'));\n          var p12 = Math.max(0, val('inpPrecio12'));\n          var p16 = Math.max(0, val('inpPrecio16'));\n          var pSec = Math.max(0, val('inpPrecioSecado'));\n          var cAgua = Math.max(0, val('inpAgua'));\n          var cLuz = Math.max(0, val('inpLuz'));\n          var cGas = Math.max(0, val('inpGas'));\n          var cProd = Math.max(0, val('inpProductos'));\n          var cMant = Math.max(0, val('inpMantenimiento'));\n          var cSeg = Math.max(0, val('inpSeguros'));\n          var cOtros = Math.max(0, val('inpOtros'));\n          var ocup = Math.max(5, Math.min(100, val('inpOcupacion')));\n\n          var zoneObj = ZONES.find(function(z){ return z.key === selectedZone; }) || ZONES[0];\n          var zoneFactor = zoneObj.factor;\n\n          var ajustePop = poblacion <= 15000 \n            ? (0.45 + 0.55 * Math.pow(Math.max(1000, poblacion) \/ 15000.0, 0.7))\n            : (1.00 + 0.30 * (1.0 - Math.exp(-(poblacion - 15000.0) \/ 45000.0)));\n          var factorComp = Math.max(0.30, 1.0 - (competencia * 0.15));\n          var factorM2 = m2 < pack.minM2 ? Math.max(0.80, m2 \/ pack.minM2) : Math.min(1.04, 0.98 + 0.02 * (m2 \/ pack.minM2));\n\n          var ocupFactor = ocup \/ 100.0;\n          var ciclosLavDia = 12 * ocupFactor;\n          var ciclosSecDia = 14 * ocupFactor;\n\n          var ingDiariosLav = 0;\n          pack.lavadoras.forEach(function(l){\n            var precio = l.kg === 10 ? p10 : (l.kg === 12 ? p12 : p16);\n            ingDiariosLav += l.c * ciclosLavDia * precio;\n          });\n          var ingDiariosSec = 0;\n          pack.secadoras.forEach(function(s){\n            ingDiariosSec += s.c * ciclosSecDia * pSec;\n          });\n\n          var ingDiariosBase = (ingDiariosLav + ingDiariosSec) * zoneFactor * factorComp;\n          var ingDiarios = ingDiariosBase * ajustePop * factorM2;\n          var ingMes = ingDiarios * 30;\n          var ingAnual = ingMes * 12;\n\n          var costesMes = alquiler + cAgua + cLuz + cGas + cProd + cMant + cSeg + cOtros;\n          var costesAnual = costesMes * 12;\n\n          var benefMes = ingMes - costesMes;\n          var benefAnual = benefMes * 12;\n          var inversion = pack.price + obra;\n          var roiAnual = inversion > 0 ? (benefAnual \/ inversion) * 100 : 0;\n          var mesesRecup = benefMes > 0 ? Math.ceil(inversion \/ benefMes) : Infinity;\n\n          var totalLav = pack.lavadoras.reduce(function(s,l){ return s + l.c; }, 0);\n          var totalSec = pack.secadoras.reduce(function(s,l){ return s + l.c; }, 0);\n          var totalCiclos = Math.round((totalLav * ciclosLavDia + totalSec * ciclosSecDia) * zoneFactor * factorComp * ajustePop * factorM2);\n          var margen = ingMes > 0 ? ((benefMes \/ ingMes) * 100) : 0;\n          var rendM2 = benefMes \/ m2;\n\n          var now = new Date();\n          var fechaStr = now.toLocaleDateString('pt-PT', { day:'2-digit', month:'2-digit', year:'numeric', hour:'2-digit', minute:'2-digit' });\n          var refStr = 'LC-' + Math.floor(100000 + Math.random() * 900000);\n\n          const { jsPDF } = window.jspdf;\n          var doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });\n\n          var logoImg = document.getElementById('lcWebLogo');\n          var logoPng = null;\n          if(logoImg){\n            try {\n              var cLogo = document.createElement('canvas');\n              cLogo.width = logoImg.naturalWidth || 300;\n              cLogo.height = logoImg.naturalHeight || 90;\n              var ctxL = cLogo.getContext('2d');\n              ctxL.drawImage(logoImg, 0, 0);\n              logoPng = cLogo.toDataURL('image\/png');\n            } catch(e) {\n              logoPng = null;\n            }\n          }\n\n          \/\/ =========================================================\n          \/\/ P\u00c1GINA 1: RESUMO EXECUTIVO E PAR\u00c2METROS DO PROJETO\n          \/\/ =========================================================\n\n          \/\/ Header Superior (Barra azul corporativa)\n          doc.setFillColor(29, 78, 216);\n          doc.roundedRect(12, 10, 186, 25, 3, 3, 'F');\n\n          \/\/ Log\u00f3tipo\n          doc.setFillColor(255, 255, 255);\n          doc.roundedRect(15, 12, 50, 21, 2, 2, 'F');\n          if(logoPng){\n            try {\n              doc.addImage(logoPng, 'PNG', 16, 13, 48, 19);\n            } catch(errImg){\n              drawLogoFallback(doc, 15, 12);\n            }\n          } else {\n            drawLogoFallback(doc, 15, 12);\n          }\n\n          \/\/ T\u00edtulos\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(13);\n          doc.setTextColor(255, 255, 255);\n          doc.text('ESTUDO DE VIABILIDADE E RENTABILIDADE', 70, 18.5);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(8.5);\n          doc.setTextColor(224, 242, 254);\n          doc.text('Lacolada Clean & Dry \u00b7 Modelo de Lavandaria Self-Service Rent\u00e1vel', 70, 24.5);\n\n          doc.setFontSize(7.5);\n          doc.setTextColor(186, 230, 253);\n          doc.text('Data: ' + fechaStr + '   |   Ref: ' + refStr + '   |   Pack: ' + pack.name, 70, 30.5);\n\n          \/\/ Aviso Legal com Padding Ampliado\n          doc.setFillColor(254, 243, 199);\n          doc.setDrawColor(245, 158, 11);\n          doc.setLineWidth(0.4);\n          doc.roundedRect(12, 38, 186, 24, 2, 2, 'FD');\n\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(7.2);\n          doc.setTextColor(146, 64, 14);\n          doc.text('AVISO INFORMATIVO E CONDICOES DE ESTIMATIVA (NAO VINCULATIVO):', 17, 43.5);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(6.2);\n          doc.setTextColor(120, 53, 15);\n          var legalText = 'Os resultados e projecoes economicas refletidos neste relatorio sao de carater exclusivamente orientativo, estimativo e nao contratual nem vinculativo. Foram calculados aplicando medias comprovadas do setor e a vasta experiencia da Lacolada Clean & Dry com mais de 2.000 aberturas em funcionamento. Os rendimentos reais dependerao de variaveis especificas como a idoneidade exata da localizacao, afluencia e transito pedonal, gestao do negocio, variacoes nos custos de fornecimentos energeticos e fatores locais. Para um estudo tecnico e comercial a medida do seu espaco, contacte a equipa da Lacolada em lacoladaprimus.com ou pelo telefone 677 316 533.';\n          var legalLines = doc.splitTextToSize(legalText, 174);\n          doc.text(legalLines, 17, 47.5, { lineHeightFactor: 1.3 });\n\n          \/\/ 1. Resumo Executivo\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(9.5);\n          doc.setTextColor(30, 64, 175);\n          doc.text('1. RESUMO EXECUTIVO DE METRICAS PRINCIPAIS', 12, 67.5);\n          doc.setDrawColor(203, 213, 225);\n          doc.setLineWidth(0.4);\n          doc.line(12, 69.5, 198, 69.5);\n\n          \/\/ 4 Cart\u00f5es de M\u00e9tricas\n          drawKpiBox(doc, 12, 72, 43.5, 22, 'Investimento Total Estimado', fmt(inversion)+'\u20ac', 'Equip: '+fmt(pack.price)+'\u20ac + Obras: '+fmt(obra)+'\u20ac', 248, 250, 252, 226, 232, 240, 30, 41, 59);\n          drawKpiBox(doc, 59.5, 72, 43.5, 22, 'Faturacao Estimada', fmt(ingMes)+'\u20ac\/mes', fmt(ingAnual)+'\u20ac\/ano \u00b7 ~'+totalCiclos+' c\/d', 236, 253, 245, 167, 243, 208, 4, 120, 87);\n          drawKpiBox(doc, 107, 72, 43.5, 22, 'Custos Operacionais', fmt(costesMes)+'\u20ac\/mes', fmt(costesAnual)+'\u20ac\/ano (Fornec.+Renda)', 254, 242, 242, 254, 202, 202, 185, 28, 28);\n          var bR = benefMes>=0?29:234, bG = benefMes>=0?78:88, bB = benefMes>=0?216:12;\n          var bBgR = benefMes>=0?239:255, bBgG = benefMes>=0?246:247, bBgB = benefMes>=0?255:237;\n          var bBrR = benefMes>=0?191:254, bBrG = benefMes>=0?219:215, bBrB = benefMes>=0?254:170;\n          drawKpiBox(doc, 154.5, 72, 43.5, 22, 'Lucro Liquido Mensal', fmt(benefMes)+'\u20ac\/mes', fmt(benefAnual)+'\u20ac\/ano liquido', bBgR, bBgG, bBgB, bBrR, bBrG, bBrB, bR, bG, bB);\n\n          \/\/ Barra de M\u00e9tricas Secund\u00e1rias\n          doc.setFillColor(248, 250, 252);\n          doc.setDrawColor(226, 232, 240);\n          doc.setLineWidth(0.4);\n          doc.roundedRect(12, 97, 186, 11, 2, 2, 'FD');\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(7);\n          doc.setTextColor(71, 85, 105);\n\n          doc.text('ROI Anual: ', 16, 104);\n          doc.setFont('helvetica', 'bold');\n          doc.setTextColor(15, 23, 42);\n          doc.text(roiAnual.toFixed(1)+'%', 30, 104);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setTextColor(71, 85, 105);\n          doc.text('Prazo Retorno: ', 48, 104);\n          doc.setFont('helvetica', 'bold');\n          doc.setTextColor(15, 23, 42);\n          var recStr = mesesRecup===Infinity?'Nao amortizavel':mesesRecup+' meses ('+(mesesRecup\/12).toFixed(1)+' a.)';\n          doc.text(recStr, 67, 104);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setTextColor(71, 85, 105);\n          doc.text('Margem Liquida: ', 102, 104);\n          doc.setFont('helvetica', 'bold');\n          doc.setTextColor(15, 23, 42);\n          doc.text(margen.toFixed(1)+'%', 123, 104);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setTextColor(71, 85, 105);\n          doc.text('Rendimento: ', 136, 104);\n          doc.setFont('helvetica', 'bold');\n          doc.setTextColor(15, 23, 42);\n          doc.text(rendM2.toFixed(1)+' \u20ac\/m\u00b2', 153, 104);\n\n          var viabLabel = benefMes > 1500 ? 'Alta Viabilidade' : (benefMes > 800 ? 'Viabilidade Moderada' : (benefMes > 0 ? 'Viabilidade Ajustada' : 'Nao Viavel'));\n          var dotR = benefMes > 1500 ? 16 : (benefMes > 800 ? 217 : (benefMes > 0 ? 234 : 220));\n          var dotG = benefMes > 1500 ? 185 : (benefMes > 800 ? 119 : (benefMes > 0 ? 88 : 38));\n          var dotB = benefMes > 1500 ? 129 : (benefMes > 800 ? 6 : (benefMes > 0 ? 12 : 38));\n          doc.setFillColor(dotR, dotG, dotB);\n          doc.circle(171, 103, 1.4, 'F');\n          doc.setFont('helvetica', 'bold');\n          doc.setTextColor(dotR, dotG, dotB);\n          doc.text(viabLabel, 174, 104);\n\n          \/\/ 2. Par\u00e2metros e Configura\u00e7\u00e3o do Projeto\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(9.5);\n          doc.setTextColor(30, 64, 175);\n          doc.text('2. PARAMETROS E CONFIGURACAO DO PROJETO', 12, 114.5);\n          doc.setDrawColor(203, 213, 225);\n          doc.line(12, 116.5, 198, 116.5);\n\n          var lavTxt = pack.lavadoras.map(function(l){ return l.c+'x '+l.t; }).join(', ');\n          var secTxt = pack.secadoras.map(function(s){ return s.c+'x '+s.t; }).join(', ');\n          \n          \/\/ Tabela 1: Pack Equipamentos\n          drawZebraTable(doc, 12, 119, 90, 'PACK DE EQUIPAMENTOS LACOLADA', [\n            ['Pack selecionado', pack.name + ' (' + fmt(pack.price) + '\u20ac)'],\n            ['Lavadoras incluidas', lavTxt],\n            ['Secadoras incluidas', secTxt],\n            ['Moedeiros centrais', pack.monederos + ' unidades de seguranca'],\n            ['Populacao recomendada', pack.pop + ' habitantes'],\n            ['Area minima do espaco', pack.minM2 + ' m2 recomendados']\n          ]);\n\n          \/\/ Tabela 2: Espa\u00e7o e Envolvente\n          drawZebraTable(doc, 108, 119, 90, 'ESPACO E ENVOLVENTE COMERCIAL', [\n            ['Populacao censada na zona', fmt(poblacion) + ' habitantes'],\n            ['Tipologia de zona', zoneObj.label + ' (' + zoneObj.desc + ')'],\n            ['Lavandarias concorrentes', competencia + ' na zona imediata'],\n            ['Area do espaco comercial', m2 + ' m2 uteis'],\n            ['Renda mensal do espaco', fmt(alquiler) + ' \u20ac\/mes (' + (alquiler\/m2).toFixed(1) + ' \u20ac\/m2)'],\n            ['Obras e licencas est.', fmt(obra) + ' \u20ac (canalizacao, luz, gas)']\n          ]);\n\n          \/\/ Tabela 3: Tarifas por Ciclo\n          drawZebraTable(doc, 12, 158, 90, 'TARIFAS POR CICLO E OPERACAO', [\n            ['Tarifa Lavagem 10Kg \/ 12Kg', p10.toFixed(2) + ' \u20ac  |  ' + p12.toFixed(2) + ' \u20ac'],\n            ['Tarifa Lavagem 16Kg \/ Secagem', p16.toFixed(2) + ' \u20ac  |  ' + pSec.toFixed(2) + ' \u20ac'],\n            ['Ocupacao operacional estimada', ocup + '% da capacidade total'],\n            ['Ciclos diarios estimados', '~' + totalCiclos + ' ciclos\/dia'],\n            ['Faturacao diaria estimada', '~' + fmt(ingDiarios) + ' \u20ac\/dia media']\n          ]);\n\n          \/\/ Tabela 4: Custos Operacionais\n          drawZebraTable(doc, 108, 158, 90, 'CUSTOS OPERACIONAIS MENSAIS', [\n            ['Renda mensal do espaco', fmt(alquiler) + ' \u20ac\/mes'],\n            ['Eletricidade + Gas', fmt(cLuz) + ' \u20ac + ' + fmt(cGas) + ' \u20ac = ' + fmt(cLuz+cGas) + ' \u20ac'],\n            ['Agua e saneamento', fmt(cAgua) + ' \u20ac\/mes'],\n            ['Detergentes e quimicos', fmt(cProd) + ' \u20ac\/mes'],\n            ['Manutencao + Seguros + Outros', fmt(cMant + cSeg + cOtros) + ' \u20ac\/mes']\n          ]);\n\n          \/\/ Vantagens Estrat\u00e9gicas\n          doc.setFillColor(240, 249, 255);\n          doc.setDrawColor(186, 230, 253);\n          doc.setLineWidth(0.4);\n          doc.roundedRect(12, 195, 186, 44, 2, 2, 'FD');\n\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(8);\n          doc.setTextColor(3, 105, 161);\n          doc.text('VANTAGENS COMPETITIVAS DO MODELO LACOLADA CLEAN & DRY:', 17, 201);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(7.2);\n          doc.setTextColor(30, 41, 59);\n          var bullets = [\n            '- Sem comissoes de franquia nem royalties mensais: Todo o lucro gerado e 100% seu.',\n            '- Equipamentos profissionais Primus lider mundial: Maxima durabilidade e baixo consumo em agua e eletricidade.',\n            '- Negocio automatizado com minima dedicacao: Modelo self-service comprovado sem custos de pessoal continuo.',\n            '- Acompanhamento tecnico integral: Apoio na escolha do espaco, projeto de engenharia, licencas e instalacao.'\n          ];\n          var by = 207;\n          bullets.forEach(function(b){\n            doc.text(b, 17, by);\n            by += 5.5;\n          });\n\n          doc.setFont('helvetica', 'bold');\n          doc.setTextColor(14, 116, 144);\n          doc.text('Telefone de expansao: 677 316 533  |  Web oficial: lacoladaprimus.com  |  Estudo personalizado sem compromisso', 17, 233.5);\n\n          \/\/ Rodap\u00e9 P\u00e1gina 1\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(7);\n          doc.setTextColor(148, 163, 184);\n          doc.line(12, 281, 198, 281);\n          doc.text('Lacolada Clean & Dry \u00b7 Estudo de Viabilidade Economica \u00b7 Pagina 1 de 2', 12, 286);\n          doc.text('lacoladaprimus.com \u00b7 Tel. 677 316 533', 198, 286, { align: 'right' });\n\n          \/\/ =========================================================\n          \/\/ P\u00c1GINA 2: GR\u00c1FICOS, DEMONSTRA\u00c7\u00c3O DE RESULTADOS E CONTACTO\n          \/\/ =========================================================\n          doc.addPage();\n\n          \/\/ Header Superior P\u00e1gina 2\n          doc.setFillColor(30, 58, 138);\n          doc.roundedRect(12, 10, 186, 12, 2, 2, 'F');\n\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(9);\n          doc.setTextColor(255, 255, 255);\n          doc.text('Lacolada Clean & Dry \u00b7 Projecoes Financeiras e Analise Detalhada', 16, 17.5);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(7.5);\n          doc.setTextColor(191, 219, 254);\n          doc.text('Pagina 2 de 2', 194, 17.5, { align: 'right' });\n\n          \/\/ 3. Gr\u00e1ficos de Rendimento\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(9.5);\n          doc.setTextColor(30, 64, 175);\n          doc.text('3. GRAFICOS DE RENDIMENTO E PROJECAO FINANCEIRA', 12, 28.5);\n          doc.setDrawColor(203, 213, 225);\n          doc.setLineWidth(0.4);\n          doc.line(12, 30.5, 198, 30.5);\n\n          var imgBar = getCanvasPng('chartBar');\n          var imgPie = getCanvasPng('chartPie');\n          var imgLine = getCanvasPng('chartLine');\n\n          \/\/ Gr\u00e1fico 1: Barras\n          doc.setFillColor(255, 255, 255);\n          doc.setDrawColor(226, 232, 240);\n          doc.roundedRect(12, 33, 90, 53, 2, 2, 'FD');\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(7.5);\n          doc.setTextColor(71, 85, 105);\n          doc.text('Receitas vs. Custos vs. Lucro (Mensal)', 15, 37.5);\n          if(imgBar){\n            try {\n              doc.addImage(imgBar, 'PNG', 14, 39.5, 86, 45);\n            } catch(eBar){}\n          }\n\n          \/\/ Gr\u00e1fico 2: Torta\n          doc.roundedRect(108, 33, 90, 53, 2, 2, 'FD');\n          doc.text('Distribuicao de Custos Operacionais', 111, 37.5);\n          if(imgPie){\n            try {\n              doc.addImage(imgPie, 'PNG', 110, 39.5, 86, 45);\n            } catch(ePie){}\n          }\n\n          \/\/ Gr\u00e1fico 3: Linha Proje\u00e7\u00e3o\n          doc.roundedRect(12, 89, 186, 46, 2, 2, 'FD');\n          doc.text('Projecao Acumulada a 5 Anos do Fluxo Liquido de Caixa (\u20ac)', 15, 93.5);\n          if(imgLine){\n            try {\n              doc.addImage(imgLine, 'PNG', 14, 95.5, 182, 38);\n            } catch(eLine){}\n          }\n\n          \/\/ 4. Demonstra\u00e7\u00e3o de Resultados\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(9.5);\n          doc.setTextColor(30, 64, 175);\n          doc.text('4. DEMONSTRACAO DE RESULTADOS DETALHADA (ESTIMATIVA ECONOMICA)', 12, 141.5);\n          doc.setDrawColor(203, 213, 225);\n          doc.line(12, 143.5, 198, 143.5);\n\n          var tableData = [\n            { label: 'RECEITAS ESTIMADAS POR CICLOS DE LAVAGEM E SECAGEM', m: fmt(ingMes)+' \u20ac', a: fmt(ingAnual)+' \u20ac', pct: '100.0%', isIncome: true },\n            { label: 'Renda do espaco comercial', m: fmt(alquiler)+' \u20ac', a: fmt(alquiler*12)+' \u20ac', pct: (ingMes>0?(alquiler\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'Fornecimento eletrico', m: fmt(cLuz)+' \u20ac', a: fmt(cLuz*12)+' \u20ac', pct: (ingMes>0?(cLuz\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'Fornecimento de gas', m: fmt(cGas)+' \u20ac', a: fmt(cGas*12)+' \u20ac', pct: (ingMes>0?(cGas\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'Agua e saneamento', m: fmt(cAgua)+' \u20ac', a: fmt(cAgua*12)+' \u20ac', pct: (ingMes>0?(cAgua\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'Detergentes e amaciadores quimicos', m: fmt(cProd)+' \u20ac', a: fmt(cProd*12)+' \u20ac', pct: (ingMes>0?(cProd\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'Manutencao tecnica preventiva', m: fmt(cMant)+' \u20ac', a: fmt(cMant*12)+' \u20ac', pct: (ingMes>0?(cMant\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'Seguros e servicos de alarme', m: fmt(cSeg)+' \u20ac', a: fmt(cSeg*12)+' \u20ac', pct: (ingMes>0?(cSeg\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'Outros custos diversos e consumiveis', m: fmt(cOtros)+' \u20ac', a: fmt(cOtros*12)+' \u20ac', pct: (ingMes>0?(cOtros\/ingMes*100).toFixed(1)+'%':'-'), isCost: true },\n            { label: 'TOTAL DE CUSTOS OPERACIONAIS MENSAIS', m: fmt(costesMes)+' \u20ac', a: fmt(costesAnual)+' \u20ac', pct: (ingMes>0?(costesMes\/ingMes*100).toFixed(1)+'%':'-'), isTotal: true },\n            { label: 'LUCRO LIQUIDO ESTIMADO DE EXPLORACAO (EBITDA)', m: fmt(benefMes)+' \u20ac', a: fmt(benefAnual)+' \u20ac', pct: 'Margem: '+margen.toFixed(1)+'%', isNet: true }\n          ];\n\n          drawFinancialTable(doc, 146, tableData);\n\n          \/\/ 5. Banner de Contacto\n          doc.setFillColor(15, 23, 42);\n          doc.roundedRect(12, 214, 186, 58, 3, 3, 'F');\n\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(8.5);\n          doc.setTextColor(52, 211, 153);\n          doc.text('QUER MONTAR A SUA PROPRIA LAVANDARIA SELF-SERVICE RENTAVEL?', 17, 221);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(6.5);\n          doc.setTextColor(148, 163, 184);\n          doc.text('Lacolada Clean & Dry acompanha-o desde a validacao do espaco ate a abertura chave na mao', 17, 225.5);\n\n          doc.setDrawColor(30, 41, 59);\n          doc.setLineWidth(0.3);\n          doc.line(17, 227.5, 193, 227.5);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(6.8);\n          doc.setTextColor(226, 232, 240);\n          var contactBullets = [\n            '- Mais de 2.000 lavandarias implantadas com sucesso comprovado em Espanha, Portugal e Europa.',\n            '- Sem comissoes de entrada nem royalties mensais: Todo o lucro comercial e seu.',\n            '- Equipamentos industriais Primus de elevada durabilidade e excelente eficiencia energetica.',\n            '- Acompanhamento personalizado na escolha do espaco e projeto tecnico de engenharia.',\n            '- Negocio automatizado com minima dedicacao e elevada rentabilidade comprovada.'\n          ];\n          var bY = 233.5;\n          contactBullets.forEach(function(b){\n            doc.text(b, 17, bY);\n            bY += 6;\n          });\n\n          \/\/ Caixa azul compacta de contacto\n          doc.setFillColor(30, 58, 138);\n          doc.setDrawColor(59, 130, 246);\n          doc.setLineWidth(0.4);\n          doc.roundedRect(142, 230, 51, 35, 2, 2, 'FD');\n\n          doc.setFont('helvetica', 'bold');\n          doc.setFontSize(6.2);\n          doc.setTextColor(191, 219, 254);\n          doc.text('CONTACTO DIRETO:', 146, 236);\n\n          doc.setFontSize(10.5);\n          doc.setTextColor(52, 211, 153);\n          doc.text('677 316 533', 146, 244);\n\n          doc.setFontSize(8);\n          doc.setTextColor(255, 255, 255);\n          doc.text('lacoladaprimus.com', 146, 252);\n\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(5.8);\n          doc.setTextColor(191, 219, 254);\n          doc.text('Estudo de viabilidade gratuito', 146, 259);\n\n          \/\/ Rodap\u00e9 P\u00e1gina 2\n          doc.setFont('helvetica', 'normal');\n          doc.setFontSize(7);\n          doc.setTextColor(148, 163, 184);\n          doc.line(12, 281, 198, 281);\n          doc.text('Lacolada Clean & Dry \u00b7 Documento informativo nao contratual nem vinculativo \u00b7 (C) 2026', 12, 286);\n          doc.text('lacoladaprimus.com \u00b7 Tel. 677 316 533', 198, 286, { align: 'right' });\n\n          var cleanName = pack.name.replace(\/\\s+\/g,'_');\n          doc.save('Estudo_Rentabilidade_Lacolada_' + cleanName + '.pdf');\n\n        } catch(err){\n          console.error('Erro ao gerar PDF vectorial com jsPDF:', err);\n          alert('Ocorreu um erro ao gerar o PDF. A abrir vista de impress\u00e3o...');\n          window.print();\n        } finally {\n          if(btnR){ btnR.innerHTML = origR; btnR.disabled = false; }\n          if(btnB){ btnB.innerHTML = origB; btnB.disabled = false; }\n        }\n      }, 150);\n    }\n\n    \/\/ Fun\u00e7\u00f5es auxiliares\n    function drawLogoFallback(doc, x, y){\n      doc.setFillColor(255, 255, 255);\n      doc.roundedRect(x, y, 50, 21, 2, 2, 'F');\n      doc.setDrawColor(8, 145, 178);\n      doc.setLineWidth(1);\n      doc.circle(x + 10, y + 10.5, 5.5);\n      doc.circle(x + 10, y + 10.5, 2.8);\n      doc.setFont('helvetica', 'bold');\n      doc.setFontSize(9);\n      doc.setTextColor(29, 78, 216);\n      doc.text('LACOLADA', x + 18, y + 9.5);\n      doc.setFontSize(5.8);\n      doc.setTextColor(8, 145, 178);\n      doc.text('CLEAN & DRY', x + 18, y + 15);\n    }\n\n    function drawKpiBox(doc, x, y, w, h, title, val, sub, bgR, bgG, bgB, brR, brG, brB, txtR, txtG, txtB){\n      doc.setFillColor(bgR, bgG, bgB);\n      doc.setDrawColor(brR, brG, brB);\n      doc.setLineWidth(0.4);\n      doc.roundedRect(x, y, w, h, 2, 2, 'FD');\n\n      doc.setFont('helvetica', 'bold');\n      doc.setFontSize(6.2);\n      doc.setTextColor(txtR, txtG, txtB);\n      doc.text(title.toUpperCase(), x + 3.5, y + 5);\n\n      doc.setFont('helvetica', 'bold');\n      doc.setFontSize(10.5);\n      doc.text(val, x + 3.5, y + 11.5);\n\n      doc.setFont('helvetica', 'normal');\n      doc.setFontSize(5.8);\n      doc.setTextColor(100, 116, 139);\n      doc.text(sub, x + 3.5, y + 17.5);\n    }\n\n    function drawZebraTable(doc, x, y, w, title, rows){\n      doc.setFillColor(30, 58, 138);\n      doc.roundedRect(x, y, w, 6, 1.5, 1.5, 'F');\n      doc.setFont('helvetica', 'bold');\n      doc.setFontSize(6.8);\n      doc.setTextColor(255, 255, 255);\n      doc.text(title, x + 3.5, y + 4.2);\n\n      var curY = y + 6;\n      var rowH = 5.2;\n\n      rows.forEach(function(r, idx){\n        if(idx % 2 === 0){\n          doc.setFillColor(255, 255, 255);\n        } else {\n          doc.setFillColor(241, 245, 249);\n        }\n        doc.rect(x, curY, w, rowH, 'F');\n\n        doc.setDrawColor(226, 232, 240);\n        doc.setLineWidth(0.2);\n        doc.line(x, curY + rowH, x + w, curY + rowH);\n\n        doc.setFont('helvetica', 'normal');\n        doc.setFontSize(6.2);\n        doc.setTextColor(71, 85, 105);\n        doc.text(r[0], x + 3.5, curY + 3.6);\n\n        doc.setFont('helvetica', 'bold');\n        doc.setTextColor(15, 23, 42);\n        doc.text(r[1], x + w - 3.5, curY + 3.6, { align: 'right' });\n\n        curY += rowH;\n      });\n\n      doc.setDrawColor(203, 213, 225);\n      doc.setLineWidth(0.3);\n      doc.roundedRect(x, y, w, curY - y, 1.5, 1.5, 'D');\n    }\n\n    function drawFinancialTable(doc, startY, rows){\n      var x = 12;\n      var w = 186;\n      var y = startY;\n\n      doc.setFillColor(241, 245, 249);\n      doc.rect(x, y, w, 5.8, 'F');\n      doc.setFont('helvetica', 'bold');\n      doc.setFontSize(6.8);\n      doc.setTextColor(51, 65, 85);\n      doc.text('CONCEITO FINANCEIRO', x + 3, y + 4.1);\n      doc.text('MENSAL (\u20ac)', x + 115, y + 4.1, { align: 'right' });\n      doc.text('ANUAL (\u20ac)', x + 150, y + 4.1, { align: 'right' });\n      doc.text('% \/ DETALHE', x + w - 3, y + 4.1, { align: 'right' });\n      y += 5.8;\n\n      rows.forEach(function(r){\n        var rowH = r.isNet ? 6.5 : 5.4;\n\n        if(r.isIncome){\n          doc.setFillColor(236, 253, 245);\n          doc.rect(x, y, w, rowH, 'F');\n          doc.setTextColor(4, 120, 87);\n          doc.setFont('helvetica', 'bold');\n        } else if(r.isTotal){\n          doc.setFillColor(248, 250, 252);\n          doc.rect(x, y, w, rowH, 'F');\n          doc.setDrawColor(203, 213, 225);\n          doc.line(x, y, x + w, y);\n          doc.setTextColor(30, 41, 59);\n          doc.setFont('helvetica', 'bold');\n        } else if(r.isNet){\n          doc.setFillColor(239, 246, 255);\n          doc.rect(x, y, w, rowH, 'F');\n          doc.setDrawColor(147, 197, 253);\n          doc.line(x, y, x + w, y);\n          doc.setTextColor(29, 78, 216);\n          doc.setFont('helvetica', 'bold');\n        } else {\n          doc.setTextColor(51, 65, 85);\n          doc.setFont('helvetica', 'normal');\n        }\n\n        doc.setFontSize(r.isNet ? 7.2 : 6.4);\n        var textY = y + (r.isNet ? 4.5 : 3.8);\n        doc.text(r.label, x + (r.isCost ? 6 : 3), textY);\n        doc.text(r.m, x + 115, textY, { align: 'right' });\n        doc.text(r.a, x + 150, textY, { align: 'right' });\n        doc.text(r.pct, x + w - 3, textY, { align: 'right' });\n\n        doc.setDrawColor(241, 245, 249);\n        doc.setLineWidth(0.2);\n        doc.line(x, y + rowH, x + w, y + rowH);\n\n        y += rowH;\n      });\n    }\n\n    \/\/ ===== LISTENERS =====\n    var inputs = [\n      'inpPoblacion','inpCompetencia','inpM2','inpAlquiler','inpObra',\n      'inpPrecio10','inpPrecio12','inpPrecio16','inpPrecioSecado',\n      'inpAgua','inpLuz','inpGas','inpProductos','inpMantenimiento','inpSeguros','inpOtros',\n      'inpOcupacion'\n    ];\n\n    inputs.forEach(function(id){\n      var el = document.getElementById(id);\n      if(el){\n        el.addEventListener('input', calculate);\n        el.addEventListener('change', calculate);\n        el.addEventListener('keyup', calculate);\n      }\n    });\n\n    var btnRight = document.getElementById('btnDownloadPdfRight');\n    if(btnRight) btnRight.addEventListener('click', generateOfficialPdf);\n\n    var btnBottom = document.getElementById('btnDownloadPdfBottom');\n    if(btnBottom) btnBottom.addEventListener('click', generateOfficialPdf);\n\n    \/\/ ===== RESIZE HANDLER =====\n    var resizeTimer;\n    var lastMob = isMobile();\n    window.addEventListener('resize', function(){\n      clearTimeout(resizeTimer);\n      resizeTimer = setTimeout(function(){\n        var mob = isMobile();\n        var fontSize = mob ? 9 : 11;\n        if(mob !== lastMob){\n          lastMob = mob;\n          if(chartLine){\n            chartLine.data.labels = mob ? ['A1','A2','A3','A4','A5'] : ['Ano 1','Ano 2','Ano 3','Ano 4','Ano 5'];\n            chartLine.data.datasets[0].pointRadius = mob ? 3 : 5;\n            chartLine.options.scales.y.ticks.maxTicksLimit = mob ? 5 : 6;\n          }\n          if(chartPie){\n            chartPie.options.cutout = mob ? '48%' : '55%';\n          }\n          if(chartLine) chartLine.update();\n          if(chartPie) chartPie.update();\n        }\n        if(chartBar){\n          chartBar.options.scales.y.ticks.font.size = fontSize;\n          chartBar.options.scales.x.ticks.font.size = fontSize;\n          chartBar.update();\n        }\n        if(chartLine){\n          chartLine.options.scales.y.ticks.font.size = fontSize;\n          chartLine.options.scales.x.ticks.font.size = fontSize;\n          chartLine.update();\n        }\n      }, 250);\n    });\n\n    \/\/ ===== INIT =====\n    renderPacks();\n    renderPackDetail();\n    renderZones();\n    updateTarifHints();\n    initCharts();\n    calculate();\n  }\n\n  \/\/ Comprobar depend\u00eancias (Chart.js e jsPDF) com toler\u00e2ncia a defer\/async do WordPress\n  function startWhenReady(){\n    if(typeof Chart !== 'undefined' && typeof window.jspdf !== 'undefined'){\n      runLacoladaCalculator();\n    } else {\n      var attempts = 0;\n      var interval = setInterval(function(){\n        attempts++;\n        if(typeof Chart !== 'undefined' && typeof window.jspdf !== 'undefined'){\n          clearInterval(interval);\n          runLacoladaCalculator();\n        } else if(attempts >= 35){\n          clearInterval(interval);\n          var needed = [];\n          if(typeof Chart === 'undefined') needed.push('https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.7\/dist\/chart.umd.min.js');\n          if(typeof window.jspdf === 'undefined') needed.push('https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js');\n          var loaded = 0;\n          needed.forEach(function(src){\n            var s = document.createElement('script');\n            s.src = src;\n            s.onload = s.onerror = function(){\n              loaded++;\n              if(loaded >= needed.length) runLacoladaCalculator();\n            };\n            document.head.appendChild(s);\n          });\n        }\n      }, 100);\n    }\n  }\n\n  if(document.readyState === 'loading'){\n    document.addEventListener('DOMContentLoaded', startWhenReady);\n  } else {\n    startWhenReady();\n  }\n})();\n<\/script>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.7\/dist\/chart.umd.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n\n<div class=\"lc-app\" id=\"lacoladaCalculadora\">\n\n<!-- Cabe\u00e7alho com log\u00f3tipo oficial Lacolada Clean & Dry -->\n<div class=\"lc-header\">\n  <div class=\"lc-header-logo-wrap\">\n    <img id=\"lcWebLogo\" src=\"https:\/\/lacoladaprimus.com\/wp-content\/uploads\/2026\/08\/logo-lacolada-borde.svg\" onerror=\"this.onerror=null;this.src='logo-lacolada-borde.svg';\" alt=\"Lacolada Clean &#038; Dry - Lavandarias Self-Service\" decoding=\"async\">\n  <\/div>\n  <div class=\"lc-header-text\">\n    <h1>Calculadora de Rentabilidade<\/h1>\n    <p>Lacolada Clean &amp; Dry \u00b7 Estimador de ROI para Lavandarias Self-Service Rent\u00e1veis<\/p>\n  <\/div>\n<\/div>\n\n<!-- Banner de Informa\u00e7\u00e3o com car\u00e1ter orientativo -->\n<div class=\"lc-info\">\n  <strong>\ud83d\udcca Ferramenta de estimativa orientativa:<\/strong> Os resultados apresentados t\u00eam car\u00e1ter meramente orientativo e n\u00e3o vinculativo, baseados em m\u00e9dias comprovadas do setor e na vasta experi\u00eancia da Lacolada com mais de 2.000 lavandarias em funcionamento. A rentabilidade real depender\u00e1 da localiza\u00e7\u00e3o exata, visibilidade, tr\u00e1fego pedonal, gest\u00e3o e fatores locais.\n<\/div>\n\n<div class=\"lc-grid\">\n<!-- COLUNA ESQUERDA - DADOS DE ENTRADA -->\n<div>\n\n<!-- 1. Pack de Equipamentos -->\n<div class=\"lc-section\">\n  <div class=\"lc-section-head lc-sh-blue\"><span class=\"lc-ico\">\ud83c\udfed<\/span> 1. Pack de Equipamentos Lacolada<\/div>\n  <div class=\"lc-section-body\">\n    <div class=\"lc-packs\" id=\"packsContainer\"><\/div>\n    <div class=\"lc-pack-detail\" id=\"packDetail\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- 2. Popula\u00e7\u00e3o e Zona -->\n<div class=\"lc-section\">\n  <div class=\"lc-section-head lc-sh-green\"><span class=\"lc-ico\">\ud83d\udccd<\/span> 2. Dados de Popula\u00e7\u00e3o e Zona<\/div>\n  <div class=\"lc-section-body\">\n    <div class=\"lc-form-grid\">\n      <div>\n        <label class=\"lc-label\">N\u00famero de habitantes na zona<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpPoblacion\" value=\"15000\" min=\"1000\" step=\"1000\">\n        <div class=\"lc-hint\" id=\"hintPoblacion\"><\/div>\n      <\/div>\n      <div>\n        <label class=\"lc-label\">Lavandarias concorrentes na zona<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpCompetencia\" value=\"1\" min=\"0\" max=\"15\" step=\"1\">\n        <div class=\"lc-hint\" id=\"hintCompetencia\"><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"lc-mt-16\">\n      <label class=\"lc-label\">Tipo de zona<\/label>\n      <div class=\"lc-zones\" id=\"zonesContainer\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- 3. Espa\u00e7o Comercial -->\n<div class=\"lc-section\">\n  <div class=\"lc-section-head lc-sh-amber\"><span class=\"lc-ico\">\ud83c\udfea<\/span> 3. Dados do Espa\u00e7o Comercial<\/div>\n  <div class=\"lc-section-body\">\n    <div class=\"lc-form-grid\">\n      <div>\n        <label class=\"lc-label\">\u00c1rea do espa\u00e7o (m\u00b2)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpM2\" value=\"45\" min=\"20\" max=\"300\" step=\"1\">\n        <div class=\"lc-hint\" id=\"hintM2\"><\/div>\n      <\/div>\n      <div>\n        <label class=\"lc-label\">Renda mensal (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpAlquiler\" value=\"600\" min=\"0\" step=\"50\">\n        <div class=\"lc-hint\" id=\"hintAlquiler\"><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"lc-mt-16\">\n      <label class=\"lc-label\">Investimento em obras, remodela\u00e7\u00e3o e licen\u00e7as (\u20ac)<\/label>\n      <input type=\"number\" class=\"lc-input\" id=\"inpObra\" value=\"23000\" min=\"0\" step=\"1000\">\n      <div class=\"lc-hint\">Inclui canaliza\u00e7\u00e3o, eletricidade, g\u00e1s, extra\u00e7\u00e3o, carpintaria, reclames e licen\u00e7as.<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- 4. Tarifas por Ciclo -->\n<div class=\"lc-section\">\n  <div class=\"lc-section-head lc-sh-violet\"><span class=\"lc-ico\">\ud83d\udcb0<\/span> 4. Tarifas por Ciclo (\u20ac)<\/div>\n  <div class=\"lc-section-body\">\n    <div class=\"lc-tarif-grid\">\n      <div>\n        <label class=\"lc-label\">Lavagem 10Kg (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpPrecio10\" value=\"5\" min=\"1\" step=\"0.5\">\n        <div class=\"lc-hint\" id=\"hintP10\"><\/div>\n      <\/div>\n      <div>\n        <label class=\"lc-label\">Lavagem 12Kg (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpPrecio12\" value=\"6\" min=\"1\" step=\"0.5\">\n        <div class=\"lc-hint\" id=\"hintP12\"><\/div>\n      <\/div>\n      <div>\n        <label class=\"lc-label\">Lavagem 16Kg (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpPrecio16\" value=\"8\" min=\"1\" step=\"0.5\">\n        <div class=\"lc-hint\" id=\"hintP16\"><\/div>\n      <\/div>\n      <div>\n        <label class=\"lc-label\">Secagem 18Kg (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpPrecioSecado\" value=\"2\" min=\"0.5\" step=\"0.5\">\n        <div class=\"lc-hint\" id=\"hintPSec\"><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"lc-note\">\ud83d\udca1 <strong>Pre\u00e7os orientativos recomendados:<\/strong> Lavagem 10Kg \u2248 4,50\u20ac-5\u20ac | 12Kg \u2248 5,50\u20ac-6\u20ac | 16Kg \u2248 7,50\u20ac-8\u20ac | Secagem \u2248 2\u20ac-2,50\u20ac. As tarifas ativas no seu pack est\u00e3o indicadas acima.<\/div>\n  <\/div>\n<\/div>\n\n<!-- 5. Custos Operacionais Mensais -->\n<div class=\"lc-section\">\n  <div class=\"lc-section-head lc-sh-rose\"><span class=\"lc-ico\">\ud83d\udccb<\/span> 5. Custos Operacionais Mensais (\u20ac)<\/div>\n  <div class=\"lc-section-body\">\n    <div class=\"lc-cost-grid\">\n      <div>\n        <label class=\"lc-label\">\ud83d\udca7 \u00c1gua (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpAgua\" value=\"100\" min=\"0\" step=\"10\">\n      <\/div>\n      <div>\n        <label class=\"lc-label\">\u26a1 Eletricidade (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpLuz\" value=\"200\" min=\"0\" step=\"10\">\n      <\/div>\n      <div>\n        <label class=\"lc-label\">\ud83d\udd25 G\u00e1s (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpGas\" value=\"180\" min=\"0\" step=\"10\">\n      <\/div>\n      <div>\n        <label class=\"lc-label\">\ud83e\uddf4 Detergentes e qu\u00edmicos (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpProductos\" value=\"180\" min=\"0\" step=\"10\">\n      <\/div>\n      <div>\n        <label class=\"lc-label\">\ud83d\udd27 Manuten\u00e7\u00e3o (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpMantenimiento\" value=\"50\" min=\"0\" step=\"10\">\n      <\/div>\n      <div>\n        <label class=\"lc-label\">\ud83d\udee1\ufe0f Seguros e alarmes (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpSeguros\" value=\"40\" min=\"0\" step=\"10\">\n      <\/div>\n      <div>\n        <label class=\"lc-label\">\ud83d\udce6 Outros custos (\u20ac)<\/label>\n        <input type=\"number\" class=\"lc-input\" id=\"inpOtros\" value=\"30\" min=\"0\" step=\"10\">\n      <\/div>\n      <div>\n        <label class=\"lc-label\">\ud83d\udcca Ocupa\u00e7\u00e3o estimada<\/label>\n        <input type=\"range\" class=\"lc-range\" id=\"inpOcupacion\" value=\"45\" min=\"10\" max=\"85\" step=\"1\">\n        <div class=\"lc-range-val\" id=\"ocupacionVal\">45%<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"lc-note\">\ud83d\udca1 <strong>Ocupa\u00e7\u00e3o realista do setor:<\/strong> Uma lavandaria bem localizada atinge uma m\u00e9dia de 35%-50% de ocupa\u00e7\u00e3o no primeiro ano de explora\u00e7\u00e3o. Um valor de 45% \u00e9 realista e prudente.<\/div>\n  <\/div>\n<\/div>\n\n<\/div><!-- \/coluna esquerda -->\n\n<!-- COLUNA DIREITA - RESULTADOS E A\u00c7\u00c3O -->\n<div>\n<div class=\"lc-results\">\n<div class=\"lc-section\">\n  <div class=\"lc-section-head lc-sh-dark\"><span class=\"lc-ico\">\ud83d\udcc8<\/span> Resultados Estimados<\/div>\n  <div class=\"lc-section-body\">\n\n    <div class=\"lc-result-card lc-rc-gray\">\n      <div class=\"lc-result-label\">Investimento Total Estimado<\/div>\n      <div class=\"lc-result-value\" id=\"resInversion\">0\u20ac<\/div>\n      <div class=\"lc-result-sub\" id=\"resInversionSub\"><\/div>\n    <\/div>\n\n    <div class=\"lc-result-card lc-rc-green\">\n      <div class=\"lc-result-label\">Fatura\u00e7\u00e3o Estimada<\/div>\n      <div class=\"lc-result-value\" id=\"resIngresos\">0\u20ac\/m\u00eas<\/div>\n      <div class=\"lc-result-sub\" id=\"resIngresosSub\"><\/div>\n    <\/div>\n\n    <div class=\"lc-result-card lc-rc-red\">\n      <div class=\"lc-result-label\">Custos Operacionais Mensais<\/div>\n      <div class=\"lc-result-value\" id=\"resCostes\">0\u20ac\/m\u00eas<\/div>\n      <div class=\"lc-result-sub\">Renda + Fornecimentos + Consum\u00edveis + Outros<\/div>\n    <\/div>\n\n    <div class=\"lc-result-card\" id=\"resBeneficioCard\">\n      <div class=\"lc-result-label\" id=\"resBeneficioLabel\">Lucro L\u00edquido Mensal Estimado<\/div>\n      <div class=\"lc-result-value\" id=\"resBeneficio\">0\u20ac\/m\u00eas<\/div>\n      <div class=\"lc-result-sub\" id=\"resBeneficioSub\"><\/div>\n    <\/div>\n\n    <div class=\"lc-result-card lc-rc-purple\">\n      <div class=\"lc-result-label\">Rentabilidade e Retorno<\/div>\n      <div class=\"lc-roi-grid\">\n        <div class=\"lc-roi-item lc-roi-purple\">\n          <div class=\"lc-roi-val\" id=\"resRoiAnual\">0%<\/div>\n          <div class=\"lc-roi-lbl\">ROI anual estimado<\/div>\n        <\/div>\n        <div class=\"lc-roi-item lc-roi-indigo\">\n          <div class=\"lc-roi-val\" id=\"resMeses\">0 meses<\/div>\n          <div class=\"lc-roi-lbl\">Prazo de retorno<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Gr\u00e1ficos -->\n    <div class=\"lc-chart-box\">\n      <div class=\"lc-chart-title\">Receitas vs Custos (mensal)<\/div>\n      <div class=\"lc-chart-wrap\"><canvas id=\"chartBar\"><\/canvas><\/div>\n    <\/div>\n    <div class=\"lc-chart-box\">\n      <div class=\"lc-chart-title\">Distribui\u00e7\u00e3o de Custos Operacionais<\/div>\n      <div class=\"lc-chart-wrap lc-chart-wrap-pie\"><canvas id=\"chartPie\"><\/canvas><\/div>\n      <div class=\"lc-pie-legend\" id=\"pieLegend\"><\/div>\n    <\/div>\n    <div class=\"lc-chart-box\">\n      <div class=\"lc-chart-title\">Proje\u00e7\u00e3o a 5 Anos (Cash Flow Acumulado)<\/div>\n      <div class=\"lc-chart-wrap lc-chart-wrap-line\"><canvas id=\"chartLine\"><\/canvas><\/div>\n    <\/div>\n\n    <!-- Viabilidade -->\n    <div class=\"lc-viability\" id=\"viabilityBox\">\n      <div class=\"lc-viability-inner\">\n        <div class=\"lc-viability-emoji\" id=\"viabilityEmoji\">\ud83d\udfe2<\/div>\n        <div>\n          <div class=\"lc-viability-title\" id=\"viabilityTitle\">Alta Viabilidade<\/div>\n          <div class=\"lc-viability-desc\" id=\"viabilityDesc\">Excelente oportunidade de neg\u00f3cio rent\u00e1vel<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Aviso informativo n\u00e3o vinculativo -->\n    <div class=\"lc-disclaimer-box\">\n      <strong>\u26a0\ufe0f Nota orientativa:<\/strong> Estimativas de car\u00e1ter preliminar n\u00e3o vinculativo. Sujeitas \u00e0s condi\u00e7\u00f5es comerciais e t\u00e9cnicas definitivas do espa\u00e7o.\n    <\/div>\n\n    <!-- Bot\u00e3o Descarregar PDF na coluna direita -->\n    <button type=\"button\" class=\"lc-btn-pdf\" id=\"btnDownloadPdfRight\">\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"><\/path><polyline points=\"7 10 12 15 17 10\"><\/polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"><\/line><\/svg>\n      Descarregar Relat\u00f3rio em PDF\n    <\/button>\n\n  <\/div>\n<\/div>\n<\/div>\n<\/div><!-- \/coluna direita -->\n<\/div><!-- \/grid -->\n\n<!-- Sec\u00e7\u00e3o de Resumo Detalhado -->\n<div class=\"lc-section\">\n  <div class=\"lc-section-head lc-sh-dark\"><span class=\"lc-ico\">\ud83d\udcca<\/span> Resumo Detalhado da Estimativa Econ\u00f3mica<\/div>\n  <div class=\"lc-section-body\">\n    <div class=\"lc-table-wrap\">\n      <table class=\"lc-table\">\n        <thead><tr><th>Conceito<\/th><th class=\"lc-td-r\">Mensal<\/th><th class=\"lc-td-r\">Anual<\/th><\/tr><\/thead>\n        <tbody id=\"tableBody\"><\/tbody>\n      <\/table>\n    <\/div>\n    <div class=\"lc-kpis\" id=\"kpisContainer\"><\/div>\n\n    <!-- Banner com bot\u00e3o grande para descarregar PDF -->\n    <div class=\"lc-pdf-banner\">\n      <div class=\"lc-pdf-banner-info\">\n        <h4>\ud83d\udcc4 Pretende descarregar ou guardar este estudo de viabilidade?<\/h4>\n        <p>Gere um relat\u00f3rio oficial em PDF completo com todos os dados inseridos, an\u00e1lise financeira, gr\u00e1ficos oficiais e a identidade visual da Lacolada Clean &amp; Dry, pronto para analisar ou apresentar.<\/p>\n      <\/div>\n      <button type=\"button\" class=\"lc-btn-pdf lc-btn-pdf-lg\" id=\"btnDownloadPdfBottom\">\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"><\/path><polyline points=\"7 10 12 15 17 10\"><\/polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"><\/line><\/svg>\n        Descarregar Relat\u00f3rio Completo em PDF\n      <\/button>\n    <\/div>\n\n    <!-- Aviso legal orientativo e n\u00e3o vinculativo -->\n    <div class=\"lc-disclaimer-box\" style=\"margin-top:16px;\">\n      <strong>\ud83d\udccc AVISO LEGAL E CONDI\u00c7\u00d5ES DE ESTIMATIVA (N\u00c3O VINCULATIVO):<\/strong> Os resultados financeiros, custos, receitas e prazos de amortiza\u00e7\u00e3o apresentados neste documento e no relat\u00f3rio descarreg\u00e1vel s\u00e3o proje\u00e7\u00f5es orientativas e estimativas, sem valor contractual nem vinculativo. Baseiam-se em dados m\u00e9dios do setor e na experi\u00eancia da Lacolada Clean &amp; Dry com mais de 2.000 lavandarias em funcionamento. A Lacolada n\u00e3o assume qualquer responsabilidade por desvios devidos a flutua\u00e7\u00f5es macroecon\u00f3micas, custos energ\u00e9ticos locais, gest\u00e3o ou aflu\u00eancia pedonal real.\n    <\/div>\n\n    <!-- Cart\u00e3o de Contacto Direto com a Lacolada Clean & Dry -->\n    <div class=\"lc-contact-card\">\n      <div class=\"lc-cc-head\">\n        <div class=\"lc-cc-icon\">\ud83d\ude80<\/div>\n        <div>\n          <h3 class=\"lc-cc-title\">QUER MONTAR A SUA PR\u00d3PRIA LAVANDARIA SELF-SERVICE RENT\u00c1VEL?<\/h3>\n          <div class=\"lc-cc-sub\">Acompanhamo-lo desde a valida\u00e7\u00e3o do espa\u00e7o at\u00e9 \u00e0 abertura chave na m\u00e3o<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"lc-cc-grid\">\n        <div>\n          <ul class=\"lc-cc-bullets\">\n            <li><strong>Sem comiss\u00f5es nem royalties mensais:<\/strong> Todo o lucro da sua fatura\u00e7\u00e3o \u00e9 100% para si.<\/li>\n            <li><strong>Equipamentos profissionais Primus:<\/strong> Tecnologia industrial de baixo consumo em \u00e1gua e energia.<\/li>\n            <li><strong>Estudo de viabilidade gratuito:<\/strong> Analisamos o potencial do seu espa\u00e7o ou ajudamos a encontrar um local ideal.<\/li>\n            <li><strong>Mais de 2.000 aberturas:<\/strong> Experi\u00eancia l\u00edder incontest\u00e1vel em Espanha, Portugal e Europa.<\/li>\n          <\/ul>\n        <\/div>\n        <div class=\"lc-cc-actions\">\n          <a href=\"tel:677316533\" class=\"lc-cc-btn-phone\">\n            \ud83d\udcde Ligar para 677 316 533\n          <\/a>\n          <a href=\"https:\/\/lacoladaprimus.com\/pt-pt\/\" target=\"_blank\" rel=\"noopener\" class=\"lc-cc-btn-web\">\n            \ud83c\udf10 Visitar lacoladaprimus.com\n          <\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/div>\n\n<!-- Rodap\u00e9 -->\n<div class=\"lc-footer\">\n  <div class=\"lc-footer-brand\">\n    <div class=\"lc-footer-logo\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><circle cx=\"12\" cy=\"12\" r=\"6\"\/><\/svg>\n    <\/div>\n    <span class=\"lc-footer-name\">Lacolada Clean &amp; Dry<\/span>\n  <\/div>\n  <p>Calculadora de rentabilidade e viabilidade econ\u00f3mica para lavandarias self-service. Dados orientativos baseados em mais de 2.000 instala\u00e7\u00f5es realizadas. Para um estudo personalizado sem compromisso, contacte a equipa de expans\u00e3o da Lacolada em <a href=\"https:\/\/lacoladaprimus.com\/pt-pt\/\" target=\"_blank\" rel=\"noopener\">lacoladaprimus.com<\/a> ou ligue diretamente para o <a href=\"tel:677316533\">677 316 533<\/a>.<\/p>\n  <p>&copy; 2026 Lacolada Clean &amp; Dry \u00b7 Ferramenta de estimativa n\u00e3o vinculativa<\/p>\n<\/div>\n\n<\/div><!-- \/lc-app -->\n","protected":false},"excerpt":{"rendered":"<p>Calculadora de Rentabilidade Lacolada Clean &amp; Dry \u00b7 Estimador de ROI para Lavandarias Self-Service Rent\u00e1veis \ud83d\udcca Ferramenta de estimativa orientativa: Os resultados apresentados t\u00eam car\u00e1ter meramente orientativo e n\u00e3o vinculativo, baseados em m\u00e9dias comprovadas do setor e na vasta experi\u00eancia da Lacolada com mais de 2.000 lavandarias em funcionamento. A rentabilidade real depender\u00e1 da localiza\u00e7\u00e3o&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-3522","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/lacoladaprimus.com\/pt-pt\/wp-json\/wp\/v2\/pages\/3522","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lacoladaprimus.com\/pt-pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/lacoladaprimus.com\/pt-pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/lacoladaprimus.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lacoladaprimus.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=3522"}],"version-history":[{"count":0,"href":"https:\/\/lacoladaprimus.com\/pt-pt\/wp-json\/wp\/v2\/pages\/3522\/revisions"}],"wp:attachment":[{"href":"https:\/\/lacoladaprimus.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=3522"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}