{"id":509,"date":"2026-09-03T14:09:25","date_gmt":"2026-09-03T12:09:25","guid":{"rendered":"https:\/\/jacekhoroszko.com\/?page_id=509"},"modified":"2026-09-03T14:10:43","modified_gmt":"2026-09-03T12:10:43","slug":"kalkulator-emerytalny","status":"publish","type":"page","link":"https:\/\/jacekhoroszko.com\/index.php\/kalkulator-emerytalny\/","title":{"rendered":"Kalkulator Emerytalny"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"509\" class=\"elementor elementor-509\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f49f818 e-con-full e-flex e-con e-parent\" data-id=\"f49f818\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-67372ff elementor-widget elementor-widget-html\" data-id=\"67372ff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ============================================================\n     Kalkulator Emerytalny \u2014 Jacek Horoszko Investment Partner\n     Wklej CA\u0141\u0104 zawarto\u015b\u0107 tego pliku do bloku \"Niestandardowy HTML\"\n     (Custom HTML) w edytorze WordPress.\n     ============================================================ -->\n<div id=\"jhip-eme-calculator\">\n  <div class=\"jhip-eme-header\">\n    <h2>Kalkulator Emerytalny<\/h2>\n    <p>Oblicz luk\u0119 bud\u017cetow\u0105 na emeryturze, potrzebny kapita\u0142 i wymagan\u0105 sk\u0142adk\u0119 miesi\u0119czn\u0105<\/p>\n  <\/div>\n  <div class=\"jhip-eme-tabs\" id=\"jhip-eme-tabs\"><\/div>\n  <div class=\"jhip-eme-content\" id=\"jhip-eme-content\"><\/div>\n<\/div>\n\n<style>\n  #jhip-eme-calculator, #jhip-eme-calculator *, #jhip-eme-calculator *::before, #jhip-eme-calculator *::after {\n    box-sizing: border-box;\n  }\n  #jhip-eme-calculator {\n    --navy:#0F152E; --surface:#1A2442; --surface2:#222E54; --gold:#D3AF37; --red:#A11927; --white:#fff;\n    --text:#F4F5F9; --muted:#9AA6C4; --border:rgba(255,255,255,0.14); --border-soft:rgba(255,255,255,0.08);\n    --growth:#3FBF9F;\n    --shadow:0 8px 24px rgba(0,0,0,0.35);\n    font-family: system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;\n    font-size: 13px; line-height: 1.4; color: var(--text);\n    max-width: 900px; margin: 0 auto;\n    background: var(--navy); border: 1px solid var(--border-soft); border-radius: 18px;\n    padding: 22px 24px 26px; box-shadow: var(--shadow);\n  }\n  #jhip-eme-calculator button { font-family: inherit; }\n\n  \/* \u2014 nag\u0142\u00f3wek \u2014 *\/\n  #jhip-eme-calculator .jhip-eme-header { margin-bottom: 16px; }\n  #jhip-eme-calculator .jhip-eme-header h2 { font-size: 21px; font-weight: 700; font-family: Georgia,serif; color: #fff; margin: 0 0 4px; }\n  #jhip-eme-calculator .jhip-eme-header p { font-size: 12px; color: var(--muted); margin: 0; }\n\n  \/* \u2014 zak\u0142adki + karta tre\u015bci \u2014 *\/\n  #jhip-eme-calculator .jhip-eme-tabs { display: flex; gap: 2px; flex-wrap: wrap; background: transparent; border: none; border-bottom: 1px solid var(--border); border-radius: 0; padding: 0 2px; }\n  #jhip-eme-calculator .jhip-eme-content { background: transparent; border: none; border-radius: 0; padding: 20px 2px 6px; }\n  #jhip-eme-calculator .kap-tab-btn { padding: 11px 16px; border: none; background: none; cursor: pointer; font-size: 12px; font-weight: 700; color: var(--muted); border-bottom: 2.5px solid transparent; }\n  #jhip-eme-calculator .kap-tab-btn.active { color: #fff; border-bottom-color: var(--gold); }\n\n  \/* \u2014 pola formularza (wsp\u00f3lne ze stylem aplikacji) \u2014 *\/\n  #jhip-eme-calculator .eme-wrap { max-width: 880px; margin: 0 auto; }\n  #jhip-eme-calculator .su-section-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.09em; color: var(--muted); margin: 20px 0 10px; }\n  #jhip-eme-calculator .su-section-label:first-of-type { margin-top: 0; }\n  #jhip-eme-calculator .su-field { margin-bottom: 9px; min-width: 0; }\n  #jhip-eme-calculator .su-field-label { display: block; font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--muted); margin-bottom: 4px; }\n  #jhip-eme-calculator .su-text-input { width: 100%; padding: 9px 11px; border: 1.5px solid var(--border); border-radius: 8px; font-size: 13px; color: var(--text); background: var(--surface2); font-family: inherit; outline: none; }\n  #jhip-eme-calculator .su-text-input:focus { border-color: var(--gold); }\n  #jhip-eme-calculator .su-money-wrap { position: relative; }\n  #jhip-eme-calculator .su-money-input { width: 100%; padding: 8px 32px 8px 10px; border: 1.5px solid var(--border); border-radius: 8px; font-size: 13px; color: var(--text); background: var(--surface2); font-family: inherit; outline: none; }\n  #jhip-eme-calculator .su-money-input:focus { border-color: var(--gold); }\n  #jhip-eme-calculator .su-money-suffix { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); font-size: 10px; color: var(--muted); pointer-events: none; }\n  #jhip-eme-calculator .kap-select { width: 100%; padding: 7px 9px; border: 1.5px solid var(--border); border-radius: 8px; font-size: 12px; font-weight: 600; color: var(--text); background: var(--surface2); outline: none; font-family: inherit; cursor: pointer; }\n  #jhip-eme-calculator .kap-select:focus { border-color: var(--gold); }\n  #jhip-eme-calculator .tool-btn { padding: 9px 18px; border-radius: 20px; border: none; background: var(--gold); color: var(--navy); font-size: 12px; font-weight: 700; cursor: pointer; }\n  #jhip-eme-calculator .tool-btn:hover { opacity: 0.86; }\n  #jhip-eme-calculator .kap-actionbar { display: flex; gap: 8px; margin-bottom: 16px; flex-wrap: wrap; align-items: center; }\n  #jhip-eme-calculator .kap-btn-genpdf { background: var(--gold); border: none; border-radius: 8px; padding: 8px 18px; font-size: 13px; font-weight: 700; color: var(--navy); cursor: pointer; }\n\n  #jhip-eme-calculator .eme-form-card { background: var(--surface); border-radius: 12px; border: 1px solid var(--border-soft); padding: 18px 20px; margin-bottom: 14px; }\n  #jhip-eme-calculator .eme-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 16px; }\n  #jhip-eme-calculator .eme-result-cards { display: grid; grid-template-columns: repeat(auto-fit,minmax(210px,1fr)); gap: 12px; margin-bottom: 14px; }\n  #jhip-eme-calculator .eme-result-card { background: var(--surface); border-radius: 12px; border: 1px solid var(--border-soft); border-top: 4px solid; padding: 14px 16px; }\n  #jhip-eme-calculator .eme-result-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); margin-bottom: 6px; }\n  #jhip-eme-calculator .eme-result-val { font-size: 20px; font-weight: 900; color: #fff; }\n  #jhip-eme-calculator .eme-result-sub { font-size: 11px; color: var(--muted); margin-top: 4px; }\n  #jhip-eme-calculator .eme-savings-box { background: var(--surface2); border-radius: 12px; padding: 16px 20px; color: #fff; display: flex; gap: 14px; flex-wrap: wrap; justify-content: space-between; align-items: center; margin-bottom: 18px; }\n  #jhip-eme-calculator .eme-savings-chip { background: rgba(255,255,255,0.07); border-radius: 8px; padding: 10px 16px; border-left: 3px solid var(--gold); min-width: 190px; }\n  #jhip-eme-calculator .eme-savings-chip-label { font-size: 11px; color: rgba(255,255,255,0.65); margin-bottom: 3px; }\n  #jhip-eme-calculator .eme-savings-chip-val { font-size: 17px; font-weight: 800; }\n  #jhip-eme-calculator .eme-note { font-size: 11px; color: var(--muted); margin: -4px 0 10px; }\n\n  @media (max-width: 560px) {\n    #jhip-eme-calculator { padding: 16px; }\n    #jhip-eme-calculator .eme-form-grid { grid-template-columns: 1fr; }\n    #jhip-eme-calculator .eme-savings-box { flex-direction: column; align-items: stretch; }\n  }\n<\/style>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@emailjs\/browser@4\/dist\/email.min.js\"><\/script>\n<script>\n(function () {\n  \/\/ \u2500\u2500 Pomocnicze formatery \u2500\u2500\n  const esc = s => String(s).replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;');\n  const fmtPLN = v => new Intl.NumberFormat('pl-PL', { style: 'currency', currency: 'PLN', maximumFractionDigits: 0 }).format(Math.round(v || 0));\n  const fmtR = v => `${Number(v || 0).toFixed(2).replace('.', ',')}%`;\n\n  \/\/ \u2500\u2500 Silnik odsetkowy (identyczny z Analizatorem Portfela \/ Kalkulatorem IKE-IKZE) \u2500\u2500\n  const kapFV = (S, C, rPA, months) => {\n    if (months <= 0) return S;\n    const r = Math.pow(1 + rPA \/ 100, 1 \/ 12) - 1;\n    if (r < 1e-12) return S + C * months;\n    return S * Math.pow(1 + r, months) + C * (Math.pow(1 + r, months) - 1) \/ r;\n  };\n  function kapProject(C0, rPA, months, indexRatePA) {\n    if (!indexRatePA) return { fv: kapFV(0, C0, rPA, months) };\n    if (months <= 0) return { fv: 0 };\n    const r = Math.pow(1 + rPA \/ 100, 1 \/ 12) - 1;\n    let fv = 0, c = C0;\n    for (let m = 1; m <= months; m++) {\n      fv = fv * (1 + r) + c;\n      if (m % 12 === 0) c *= (1 + indexRatePA \/ 100);\n    }\n    return { fv };\n  }\n\n  \/\/ \u2500\u2500 Wysy\u0142ka wyniku na e-mail (EmailJS \u2014 to samo konto\/szablon co pozosta\u0142e kalkulatory) \u2500\u2500\n  const EMAILJS_PUBLIC_KEY  = 'lKDuaTSIkMgu12jLj';\n  const EMAILJS_SERVICE_ID  = 'service_cs1bt29';\n  const EMAILJS_TEMPLATE_ID = 'template_06apygu';\n  const JHIP_LOGO_DATAURI  = 'https:\/\/jacekhoroszko.com\/wp-content\/uploads\/2026\/07\/logo-email.png';\n  const JHIP_PHOTO_DATAURI = 'https:\/\/jacekhoroszko.com\/wp-content\/uploads\/2026\/07\/photo-email.jpg';\n  const JHIP_LEAD_EMAIL = 'jacek.horoszko@phinance.pl';\n\n  \/\/ \u2500\u2500 Korekta stopy zast\u0105pienia w zale\u017cno\u015bci od formy dochod\u00f3w\/rozliczania sk\u0142adki emerytalnej \u2500\u2500\n  \/\/ UoP = pe\u0142na sk\u0142adka emerytalna od wynagrodzenia (najwy\u017csza relatywnie emerytura).\n  \/\/ Umowa zlecenia = po\u015brodku. JDG (zasady og\u00f3lne\/liniowy) = ni\u017csza. JDG rycza\u0142t = najni\u017csza.\n  const EME_FORMA_MULT = { uop: 1, zlecenie: 0.85, jdg_ogolne: 0.65, jdg_liniowy: 0.65, jdg_ryczalt: 0.45 };\n  function emeFormaKey(s) { return s.forma === 'jdg' ? `jdg_${s.formaOpodatkowania || 'ogolne'}` : (s.forma || 'uop'); }\n  function emeFormaMult(s) { return EME_FORMA_MULT[emeFormaKey(s)] != null ? EME_FORMA_MULT[emeFormaKey(s)] : 1; }\n  function emeFormaLabel(s) {\n    if (s.forma === 'zlecenie') return 'Umowa zlecenia';\n    if (s.forma === 'jdg') {\n      if (s.formaOpodatkowania === 'ryczalt') return 'JDG \u2014 rycza\u0142t';\n      if (s.formaOpodatkowania === 'liniowy') return 'JDG \u2014 podatek liniowy';\n      return 'JDG \u2014 zasady og\u00f3lne';\n    }\n    return 'Umowa o prac\u0119';\n  }\n\n  \/\/ \u2500\u2500 Stan \u2500\u2500\n  const state = {\n    tab: 'config',\n    wynagrodzenie: 8000,\n    koszty: 6000,\n    lataDoEmerytury: 20,\n    stopaZastapienia: 30,\n    lataNaEmeryturze: 20,\n    inflacja: 3.5,\n    oprocentowanie: 5,\n    forma: 'uop',\n    formaOpodatkowania: 'ogolne',\n  };\n\n  \/\/ \u2500\u2500 Silnik oblicze\u0144 \u2500\u2500\n  \/\/ Luka bud\u017cetowa = oczekiwana emerytura (koszty miesi\u0119czne) \u2212 potencjalna emerytura z ZUS (wynagrodzenie \u00d7 stopa zast\u0105pienia).\n  \/\/ Kapita\u0142 potrzebny liczony jest w dzisiejszych z\u0142ot\u00f3wkach (realnie), a nast\u0119pnie \u2014 \u017ceby policzy\u0107 nominaln\u0105\n  \/\/ sk\u0142adk\u0119 miesi\u0119czn\u0105 do odk\u0142adania \u2014 przeliczany na przysz\u0142\u0105 warto\u015b\u0107 nominaln\u0105 w dniu emerytury (powi\u0119kszon\u0105 o inflacj\u0119).\n  function emeCalc(s) {\n    const wynagrodzenie = Number(s.wynagrodzenie) || 0;\n    const koszty = Number(s.koszty) || 0;\n    const stopaZast = Number(s.stopaZastapienia) || 0;\n    const lataDo = Math.max(0, Number(s.lataDoEmerytury) || 0);\n    const lataEm = Math.max(0, Number(s.lataNaEmeryturze) || 0);\n    const inflR = Number(s.inflacja) || 0;\n    const opR = Number(s.oprocentowanie) || 0;\n\n    const zus = wynagrodzenie * stopaZast \/ 100 * emeFormaMult(s);\n    \/\/ Oczekiwana emerytura: min. 80% obecnego wynagrodzenia, ale nie mniej ni\u017c koszty + 20% zapasu.\n    const oczekiwana = Math.round(Math.max(wynagrodzenie * 0.8, koszty * 1.2));\n    const luka = Math.max(0, oczekiwana - zus);\n\n    const months = Math.round(lataDo * 12);\n\n    \/\/ Potrzeba emerytalna nominalnie: kapita\u0142 = luka \u00d7 12 \u00d7 lata na emeryturze, wp\u0142ata p\u0142aska.\n    const kapitalNominalny = luka * 12 * lataEm;\n    const unitSkarpeta = months > 0 ? kapProject(1, 0, months, 0).fv : 0;\n    const unitOproc = months > 0 ? kapProject(1, opR, months, 0).fv : 0;\n    const skladkaSkarpeta = unitSkarpeta > 0 ? kapitalNominalny \/ unitSkarpeta : kapitalNominalny;\n    const skladkaOprocentowana = unitOproc > 0 ? kapitalNominalny \/ unitOproc : kapitalNominalny;\n\n    \/\/ Z inflacj\u0105: koszty rosn\u0105 co rok na emeryturze, kapita\u0142 przeliczony na warto\u015b\u0107 nominaln\u0105\n    \/\/ w dniu emerytury, a wp\u0142ata miesi\u0119czna indeksowana o t\u0119 sam\u0105 inflacj\u0119.\n    let sumInfl = 0;\n    for (let y = 0; y < lataEm; y++) sumInfl += luka * 12 * Math.pow(1 + inflR \/ 100, y);\n    const kapitalInflacja = sumInfl * Math.pow(1 + inflR \/ 100, lataDo);\n    const unitSkarpetaInfl = months > 0 ? kapProject(1, 0, months, inflR).fv : 0;\n    const unitOprocInfl = months > 0 ? kapProject(1, opR, months, inflR).fv : 0;\n    const skladkaSkarpetaInflacja = unitSkarpetaInfl > 0 ? kapitalInflacja \/ unitSkarpetaInfl : kapitalInflacja;\n    const skladkaOprocentowanaInflacja = unitOprocInfl > 0 ? kapitalInflacja \/ unitOprocInfl : kapitalInflacja;\n\n    return { wynagrodzenie, koszty, stopaZast, lataDo, lataEm, inflR, opR, zus, oczekiwana, luka, months,\n      kapitalNominalny, skladkaSkarpeta, skladkaOprocentowana,\n      kapitalInflacja, skladkaSkarpetaInflacja, skladkaOprocentowanaInflacja,\n      formaLabel: emeFormaLabel(s) };\n  }\n\n  \/\/ \u2500\u2500 Nawigacja i render \u2500\u2500\n  function renderTabs() {\n    document.getElementById('jhip-eme-tabs').innerHTML = `\n      <button class=\"kap-tab-btn ${state.tab === 'config' ? 'active' : ''}\" onclick=\"JhipEme.setTab('config')\">\u2699 Konfiguracja<\/button>\n      <button class=\"kap-tab-btn ${state.tab === 'results' ? 'active' : ''}\" onclick=\"JhipEme.setTab('results')\">\ud83d\udcc8 Wyniki<\/button>\n    `;\n  }\n  function renderContentOnly() {\n    document.getElementById('jhip-eme-content').innerHTML = state.tab === 'config' ? renderConfig() : renderResults();\n  }\n  function render() { renderTabs(); renderContentOnly(); }\n  function setTab(t) { state.tab = t; render(); }\n  function upd(key, val) { state[key] = val; renderContentOnly(); }\n\n  function renderConfig() {\n    return `<div class=\"eme-wrap\">\n      <div class=\"eme-form-card\">\n        <div class=\"su-section-label\" style=\"margin-top:0\">Sytuacja dzi\u015b<\/div>\n        <div class=\"eme-form-grid\">\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">Wynagrodzenie dzi\u015b (PLN\/mies.)<\/span>\n            <div class=\"su-money-wrap\"><input class=\"su-money-input\" type=\"number\" min=\"0\" value=\"${state.wynagrodzenie}\" onchange=\"JhipEme.upd('wynagrodzenie',Math.max(0,parseFloat(this.value)||0))\"><span class=\"su-money-suffix\">PLN<\/span><\/div>\n          <\/div>\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">Koszty miesi\u0119czne na emeryturze (PLN\/mies.)<\/span>\n            <div class=\"su-money-wrap\"><input class=\"su-money-input\" type=\"number\" min=\"0\" value=\"${state.koszty}\" onchange=\"JhipEme.upd('koszty',Math.max(0,parseFloat(this.value)||0))\"><span class=\"su-money-suffix\">PLN<\/span><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"su-section-label\">Horyzont i ZUS<\/div>\n        <div class=\"eme-form-grid\">\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">Lata do emerytury<\/span>\n            <input class=\"su-text-input\" type=\"number\" min=\"0\" max=\"60\" value=\"${state.lataDoEmerytury}\" onchange=\"JhipEme.upd('lataDoEmerytury',Math.max(0,parseInt(this.value)||0))\">\n          <\/div>\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">Lata na emeryturze<\/span>\n            <input class=\"su-text-input\" type=\"number\" min=\"0\" max=\"60\" value=\"${state.lataNaEmeryturze}\" onchange=\"JhipEme.upd('lataNaEmeryturze',Math.max(0,parseInt(this.value)||0))\">\n          <\/div>\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">Forma dochod\u00f3w<\/span>\n            <select class=\"kap-select\" onchange=\"JhipEme.upd('forma',this.value)\">\n              <option value=\"uop\" ${state.forma === 'uop' ? 'selected' : ''}>Umowa o prac\u0119 (UoP)<\/option>\n              <option value=\"zlecenie\" ${state.forma === 'zlecenie' ? 'selected' : ''}>Umowa zlecenia<\/option>\n              <option value=\"jdg\" ${state.forma === 'jdg' ? 'selected' : ''}>Jednoosobowa dzia\u0142alno\u015b\u0107 (JDG)<\/option>\n            <\/select>\n          <\/div>\n          ${state.forma === 'jdg' ? `<div class=\"su-field\">\n            <span class=\"su-field-label\">Forma opodatkowania (JDG)<\/span>\n            <select class=\"kap-select\" onchange=\"JhipEme.upd('formaOpodatkowania',this.value)\">\n              <option value=\"ogolne\" ${state.formaOpodatkowania === 'ogolne' ? 'selected' : ''}>Zasady og\u00f3lne<\/option>\n              <option value=\"liniowy\" ${state.formaOpodatkowania === 'liniowy' ? 'selected' : ''}>Podatek liniowy<\/option>\n              <option value=\"ryczalt\" ${state.formaOpodatkowania === 'ryczalt' ? 'selected' : ''}>Rycza\u0142t<\/option>\n            <\/select>\n          <\/div>` : ''}\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">Stopa zast\u0105pienia (%, bazowa)<\/span>\n            <input class=\"su-text-input\" type=\"number\" min=\"0\" max=\"100\" step=\"0.5\" value=\"${state.stopaZastapienia}\" onchange=\"JhipEme.upd('stopaZastapienia',Math.max(0,Math.min(100,parseFloat(this.value)||0)))\">\n          <\/div>\n        <\/div>\n        <div class=\"su-section-label\">Za\u0142o\u017cenia finansowe<\/div>\n        <div class=\"eme-form-grid\">\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">Inflacja (%\/rok)<\/span>\n            <input class=\"su-text-input\" type=\"number\" min=\"0\" max=\"30\" step=\"0.1\" value=\"${state.inflacja}\" onchange=\"JhipEme.upd('inflacja',Math.max(0,parseFloat(this.value)||0))\">\n          <\/div>\n          <div class=\"su-field\">\n            <span class=\"su-field-label\">\u015arednie oprocentowanie oszcz\u0119dno\u015bci (%\/rok)<\/span>\n            <input class=\"su-text-input\" type=\"number\" min=\"0\" max=\"30\" step=\"0.1\" value=\"${state.oprocentowanie}\" onchange=\"JhipEme.upd('oprocentowanie',Math.max(0,parseFloat(this.value)||0))\">\n          <\/div>\n        <\/div>\n      <\/div>\n      <div style=\"text-align:right\">\n        <button class=\"tool-btn\" onclick=\"JhipEme.setTab('results')\">Przejd\u017a do wynik\u00f3w \u2192<\/button>\n      <\/div>\n    <\/div>`;\n  }\n\n  function renderResults() {\n    const r = emeCalc(state);\n    const lukaPokryta = r.luka <= 0;\n    return `<div class=\"eme-wrap\">\n      <div class=\"kap-actionbar\">\n        <button class=\"kap-btn-genpdf\" onclick=\"JhipEme.openEmailForm()\">\u2709 Wy\u015blij na e-mail<\/button>\n      <\/div>\n      <div id=\"jhip-eme-email-panel\" style=\"display:none;background:var(--surface);border:1px solid var(--border-soft);border-radius:10px;padding:14px 16px;margin-bottom:14px\">\n        <div style=\"display:flex;gap:8px;flex-wrap:wrap;align-items:center\">\n          <input id=\"jhip-eme-email-name\" type=\"text\" class=\"su-text-input\" placeholder=\"Imi\u0119\" style=\"max-width:160px\" onkeydown=\"if(event.key==='Enter'){JhipEme.sendResultEmail()}\">\n          <input id=\"jhip-eme-email-phone\" type=\"tel\" class=\"su-text-input\" placeholder=\"Telefon\" style=\"max-width:160px\" onkeydown=\"if(event.key==='Enter'){JhipEme.sendResultEmail()}\">\n          <input id=\"jhip-eme-email-input\" type=\"email\" class=\"su-text-input\" placeholder=\"twoj@email.pl\" style=\"max-width:220px\" onkeydown=\"if(event.key==='Enter'){JhipEme.sendResultEmail()}\">\n          <button id=\"jhip-eme-email-send-btn\" class=\"tool-btn\" onclick=\"JhipEme.sendResultEmail()\">Wy\u015blij<\/button>\n          <button class=\"tool-btn\" style=\"background:transparent;color:var(--muted);border:1px solid var(--border)\" onclick=\"JhipEme.closeEmailForm()\">Anuluj<\/button>\n        <\/div>\n        <div id=\"jhip-eme-email-status\" style=\"font-size:11px;margin-top:8px\"><\/div>\n      <\/div>\n\n      <div class=\"eme-result-cards\">\n        <div class=\"eme-result-card\" style=\"border-top-color:#9CA3AF\">\n          <div class=\"eme-result-label\">Emerytura z ZUS (potencjalna)<\/div>\n          <div class=\"eme-result-val\">${fmtPLN(r.zus)}<\/div>\n          <div class=\"eme-result-sub\">${esc(r.formaLabel || 'Umowa o prac\u0119')} \u00b7 wynagr. ${fmtPLN(r.wynagrodzenie)}<\/div>\n        <\/div>\n        <div class=\"eme-result-card\" style=\"border-top-color:var(--gold)\">\n          <div class=\"eme-result-label\">Oczekiwana emerytura<\/div>\n          <div class=\"eme-result-val\">${fmtPLN(r.oczekiwana)}<\/div>\n          <div class=\"eme-result-sub\">Na podstawie koszt\u00f3w miesi\u0119cznych<\/div>\n        <\/div>\n        <div class=\"eme-result-card\" style=\"border-top-color:#DC2626\">\n          <div class=\"eme-result-label\">Luka bud\u017cetowa \/ mies.<\/div>\n          <div class=\"eme-result-val\" style=\"color:${lukaPokryta ? '#16A34A' : '#DC2626'}\">${fmtPLN(r.luka)}<\/div>\n          <div class=\"eme-result-sub\">${lukaPokryta ? 'ZUS pokrywa oczekiwane koszty' : 'Tyle trzeba dop\u0142aci\u0107 z w\u0142asnego kapita\u0142u'}<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"su-section-label\" style=\"margin-top:0\">Potrzeba emerytalna nominalnie<\/div>\n      <div class=\"eme-result-cards\">\n        <div class=\"eme-result-card\" style=\"border-top-color:var(--gold)\">\n          <div class=\"eme-result-label\">Kapita\u0142 potrzebny (nominalnie)<\/div>\n          <div class=\"eme-result-val\">${fmtPLN(r.kapitalNominalny)}<\/div>\n          <div class=\"eme-result-sub\">luka \u00d7 12 \u00d7 lata na emeryturze<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"eme-savings-box\">\n        <div style=\"font-size:12px;color:rgba(255,255,255,0.65)\">Sk\u0142adka miesi\u0119czna przez ${r.lataDo} lat, by zgromadzi\u0107 ${fmtPLN(r.kapitalNominalny)}:<\/div>\n        <div style=\"display:flex;gap:10px;flex-wrap:wrap\">\n          <div class=\"eme-savings-chip\" style=\"border-left-color:#9CA3AF\">\n            <div class=\"eme-savings-chip-label\">\ud83e\udde6 Do skarpety (bez oprocentowania)<\/div>\n            <div class=\"eme-savings-chip-val\">${fmtPLN(r.skladkaSkarpeta)}<\/div>\n          <\/div>\n          <div class=\"eme-savings-chip\">\n            <div class=\"eme-savings-chip-label\">\ud83d\udcc8 Przy oprocentowaniu ${fmtR(r.opR)}\/rok<\/div>\n            <div class=\"eme-savings-chip-val\">${fmtPLN(r.skladkaOprocentowana)}<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"su-section-label\">Z inflacj\u0105<\/div>\n      <div class=\"eme-note\">Uwzgl\u0119dniamy inflacj\u0119 (rosn\u0105ce koszty na emeryturze) i indeksujemy wp\u0142at\u0119 miesi\u0119czn\u0105 o inflacj\u0119.<\/div>\n      <div class=\"eme-result-cards\">\n        <div class=\"eme-result-card\" style=\"border-top-color:var(--gold)\">\n          <div class=\"eme-result-label\">Warto\u015b\u0107 potrzebna (z inflacj\u0105)<\/div>\n          <div class=\"eme-result-val\">${fmtPLN(r.kapitalInflacja)}<\/div>\n          <div class=\"eme-result-sub\">koszty rosn\u0105ce o ${fmtR(r.inflR)}\/rok na emeryturze, przeliczone na dzie\u0144 emerytury<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"eme-savings-box\" style=\"margin-bottom:0\">\n        <div style=\"font-size:12px;color:rgba(255,255,255,0.65)\">Sk\u0142adka miesi\u0119czna przez ${r.lataDo} lat, by zgromadzi\u0107 ${fmtPLN(r.kapitalInflacja)}:<\/div>\n        <div style=\"display:flex;gap:10px;flex-wrap:wrap\">\n          <div class=\"eme-savings-chip\" style=\"border-left-color:#9CA3AF\">\n            <div class=\"eme-savings-chip-label\">\ud83e\udde6 Do skarpety (bez oprocentowania)<\/div>\n            <div class=\"eme-savings-chip-val\">${fmtPLN(r.skladkaSkarpetaInflacja)}<\/div>\n          <\/div>\n          <div class=\"eme-savings-chip\">\n            <div class=\"eme-savings-chip-label\">\ud83d\udcc8 Przy oprocentowaniu ${fmtR(r.opR)}\/rok<\/div>\n            <div class=\"eme-savings-chip-val\">${fmtPLN(r.skladkaOprocentowanaInflacja)}<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>`;\n  }\n\n  \/\/ \u2500\u2500 E-mail \u2500\u2500\n  function emailjsReady() {\n    return typeof window.emailjs !== 'undefined' && EMAILJS_PUBLIC_KEY.indexOf('TWOJ_') !== 0;\n  }\n\n  function buildEmailHTML(r) {\n    const date = new Date().toLocaleDateString('pl-PL', { day: 'numeric', month: 'long', year: 'numeric' });\n    const lukaPokryta = r.luka <= 0;\n    const row = (label, val, color) => `<tr><td bgcolor=\"#ffffff\" style=\"background-color:#ffffff;padding:7px 0;border-bottom:1px solid #EEEEEE;color:#6B7280;font-size:13px\">${label}<\/td><td bgcolor=\"#ffffff\" style=\"background-color:#ffffff;padding:7px 0;border-bottom:1px solid #EEEEEE;text-align:right;font-weight:700;font-size:13px;color:${color || '#0F152E'}\">${val}<\/td><\/tr>`;\n    const rows = row('Emerytura z ZUS (potencjalna)', fmtPLN(r.zus))\n      + row('Oczekiwana emerytura (na podst. koszt\u00f3w)', fmtPLN(r.oczekiwana))\n      + row('Luka bud\u017cetowa \/ mies.', fmtPLN(r.luka), lukaPokryta ? '#16A34A' : '#A11927')\n      + row('Kapita\u0142 potrzebny (nominalnie)', fmtPLN(r.kapitalNominalny), '#D3AF37')\n      + row('Sk\u0142adka mies. do skarpety (nominalnie)', fmtPLN(r.skladkaSkarpeta))\n      + row(`Sk\u0142adka mies. przy ${fmtR(r.opR)}\/rok (nominalnie)`, fmtPLN(r.skladkaOprocentowana))\n      + row('Kapita\u0142 potrzebny (z inflacj\u0105)', fmtPLN(r.kapitalInflacja), '#D3AF37')\n      + row('Sk\u0142adka mies. do skarpety (z inflacj\u0105)', fmtPLN(r.skladkaSkarpetaInflacja))\n      + row(`Sk\u0142adka mies. przy ${fmtR(r.opR)}\/rok (z inflacj\u0105)`, fmtPLN(r.skladkaOprocentowanaInflacja));\n    return `<div style=\"font-family:Arial,Helvetica,sans-serif;max-width:600px;margin:0 auto;background:#ffffff\">\n      <table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#0F152E;border-radius:10px 10px 0 0\">\n        <tr>\n          <td style=\"padding:20px 12px 20px 26px;width:56px\" valign=\"middle\"><img decoding=\"async\" src=\"${JHIP_LOGO_DATAURI}\" width=\"44\" alt=\"\" style=\"display:block;width:44px;height:auto\"><\/td>\n          <td style=\"padding:22px 26px 22px 0\" valign=\"middle\">\n            <div style=\"color:#9AA6C4;font-size:10px;letter-spacing:.09em;text-transform:uppercase;margin-bottom:4px\">Jacek Horoszko Investment Partner<\/div>\n            <div style=\"color:#ffffff;font-size:20px;font-weight:700\">Analiza potrzeby emerytalnej<\/div>\n            <div style=\"color:#9AA6C4;font-size:11px;margin-top:4px\">Sporz\u0105dzono: ${date}<\/div>\n          <\/td>\n        <\/tr>\n      <\/table>\n      <div bgcolor=\"#ffffff\" style=\"background-color:#ffffff;border:1px solid #E5E7EB;border-top:none;border-radius:0 0 10px 10px;padding:22px 26px\">\n        <table bgcolor=\"#ffffff\" style=\"width:100%;border-collapse:collapse;background-color:#ffffff\">${rows}<\/table>\n        <div bgcolor=\"#ffffff\" style=\"background-color:#ffffff;margin-top:20px;font-size:10px;color:#9CA3AF;line-height:1.6\">Analiza sporz\u0105dzona przy u\u017cyciu Kalkulatora Emerytalnego Jacek Horoszko Investment Partner. Wariant \u201ez inflacj\u0105\u201d uwzgl\u0119dnia rosn\u0105ce koszty w trakcie emerytury oraz wp\u0142at\u0119 miesi\u0119czn\u0105 indeksowan\u0105 o przyj\u0119t\u0105 inflacj\u0119 ${fmtR(r.inflR)}\/rok. Dane maj\u0105 charakter pogl\u0105dowy i nie stanowi\u0105 porady inwestycyjnej ani oferty w rozumieniu przepis\u00f3w prawa.<\/div>\n        <table role=\"presentation\" bgcolor=\"#ffffff\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin-top:16px;padding-top:14px;border-top:1px solid #E5E7EB;width:100%;background-color:#ffffff\">\n          <tr>\n            <td bgcolor=\"#ffffff\" style=\"background-color:#ffffff;width:56px\" valign=\"top\"><img decoding=\"async\" src=\"${JHIP_PHOTO_DATAURI}\" width=\"48\" alt=\"\" style=\"display:block;width:48px;height:auto;border-radius:8px\"><\/td>\n            <td bgcolor=\"#ffffff\" style=\"background-color:#ffffff\" valign=\"top\">\n              <div style=\"color:#0F152E;font-size:13px;font-weight:700\">Jacek Horoszko<\/div>\n              <div style=\"color:#9CA3AF;font-size:11px\">Investment Partner \u00b7 www.jacekhoroszko.pl<\/div>\n              <div style=\"color:#9CA3AF;font-size:11px\">694 526 704 \u00b7 jacek.horoszko@phinance.pl<\/div>\n            <\/td>\n          <\/tr>\n        <\/table>\n      <\/div>\n    <\/div>`;\n  }\n\n  function buildLeadEmailHTML(r, lead) {\n    const row = (label, val) => `<tr><td bgcolor=\"#ffffff\" style=\"background-color:#ffffff;padding:7px 0;border-bottom:1px solid #EEEEEE;color:#6B7280;font-size:13px\">${label}<\/td><td bgcolor=\"#ffffff\" style=\"background-color:#ffffff;padding:7px 0;border-bottom:1px solid #EEEEEE;text-align:right;font-weight:700;font-size:13px;color:#0F152E\">${val}<\/td><\/tr>`;\n    const rows = row('Imi\u0119', esc(lead.imie))\n      + row('E-mail', esc(lead.email))\n      + row('Telefon', esc(lead.telefon))\n      + row('Wynagrodzenie dzi\u015b', fmtPLN(r.wynagrodzenie))\n      + row('Luka bud\u017cetowa \/ mies.', fmtPLN(r.luka))\n      + row('Kapita\u0142 potrzebny (nominalnie)', fmtPLN(r.kapitalNominalny));\n    return `<div style=\"font-family:Arial,Helvetica,sans-serif;max-width:600px;margin:0 auto;background:#ffffff\">\n      <div style=\"background:#0F152E;padding:18px 24px;border-radius:10px 10px 0 0\">\n        <div style=\"color:#9AA6C4;font-size:10px;letter-spacing:.09em;text-transform:uppercase\">Kalkulator Emerytalny \u2014 jacekhoroszko.com<\/div>\n        <div style=\"color:#ffffff;font-size:18px;font-weight:700;margin-top:4px\">Nowe zg\u0142oszenie od klienta<\/div>\n      <\/div>\n      <div bgcolor=\"#ffffff\" style=\"background-color:#ffffff;border:1px solid #E5E7EB;border-top:none;border-radius:0 0 10px 10px;padding:20px 24px\">\n        <table bgcolor=\"#ffffff\" style=\"width:100%;border-collapse:collapse;background-color:#ffffff\">${rows}<\/table>\n      <\/div>\n    <\/div>`;\n  }\n\n  function openEmailForm() {\n    const panel = document.getElementById('jhip-eme-email-panel');\n    if (panel) panel.style.display = 'block';\n  }\n  function closeEmailForm() {\n    const panel = document.getElementById('jhip-eme-email-panel');\n    if (panel) panel.style.display = 'none';\n  }\n\n  function sendResultEmail() {\n    const nameInput = document.getElementById('jhip-eme-email-name');\n    const phoneInput = document.getElementById('jhip-eme-email-phone');\n    const input = document.getElementById('jhip-eme-email-input');\n    const statusEl = document.getElementById('jhip-eme-email-status');\n    const btn = document.getElementById('jhip-eme-email-send-btn');\n    const imie = (nameInput.value || '').trim();\n    const telefon = (phoneInput.value || '').trim();\n    const email = (input.value || '').trim();\n    const emailRe = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n    const phoneRe = \/^[0-9+()\\s-]{6,20}$\/;\n    if (!imie) {\n      statusEl.textContent = 'Podaj imi\u0119.';\n      statusEl.style.color = '#F3A3AC';\n      return;\n    }\n    if (!phoneRe.test(telefon)) {\n      statusEl.textContent = 'Podaj poprawny numer telefonu.';\n      statusEl.style.color = '#F3A3AC';\n      return;\n    }\n    if (!emailRe.test(email)) {\n      statusEl.textContent = 'Podaj poprawny adres e-mail.';\n      statusEl.style.color = '#F3A3AC';\n      return;\n    }\n    if (!emailjsReady()) {\n      statusEl.textContent = 'Wysy\u0142ka e-mail nie jest jeszcze skonfigurowana.';\n      statusEl.style.color = '#F3A3AC';\n      return;\n    }\n    const r = emeCalc(state);\n    btn.disabled = true;\n    btn.textContent = 'Wysy\u0142anie\u2026';\n    statusEl.textContent = '';\n\n    const clientSend = emailjs.send(EMAILJS_SERVICE_ID, EMAILJS_TEMPLATE_ID, {\n      to_email: email,\n      subject: `${imie}, oto Twoja analiza emerytalna \u2014 Jacek Horoszko Investment Partner`,\n      summary_html: buildEmailHTML(r),\n    }, { publicKey: EMAILJS_PUBLIC_KEY });\n\n    const leadSend = emailjs.send(EMAILJS_SERVICE_ID, EMAILJS_TEMPLATE_ID, {\n      to_email: JHIP_LEAD_EMAIL,\n      subject: `Nowe zg\u0142oszenie z kalkulatora emerytalnego \u2014 ${imie}`,\n      summary_html: buildLeadEmailHTML(r, { imie, telefon, email }),\n    }, { publicKey: EMAILJS_PUBLIC_KEY });\n\n    Promise.all([clientSend, leadSend]).then(function () {\n      statusEl.textContent = '\u2713 Wys\u0142ano! Sprawd\u017a skrzynk\u0119 ' + esc(email) + '.';\n      statusEl.style.color = '#8FD19E';\n      btn.disabled = false;\n      btn.textContent = 'Wy\u015blij';\n    }, function (err) {\n      statusEl.textContent = 'Nie uda\u0142o si\u0119 wys\u0142a\u0107. Spr\u00f3buj ponownie.';\n      statusEl.style.color = '#F3A3AC';\n      btn.disabled = false;\n      btn.textContent = 'Wy\u015blij';\n      console.error('EmailJS error:', err);\n    });\n  }\n\n  \/\/ \u2500\u2500 Inicjalizacja \u2500\u2500\n  window.JhipEme = { setTab, upd, openEmailForm, closeEmailForm, sendResultEmail };\n\n  function init() {\n    if (!document.getElementById('jhip-eme-tabs')) return;\n    render();\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c5a80be elementor-widget elementor-widget-spacer\" data-id=\"c5a80be\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Kalkulator Emerytalny Oblicz luk\u0119 bud\u017cetow\u0105 na emeryturze, potrzebny kapita\u0142 i wymagan\u0105 sk\u0142adk\u0119 miesi\u0119czn\u0105<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-509","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/pages\/509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/comments?post=509"}],"version-history":[{"count":3,"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/pages\/509\/revisions"}],"predecessor-version":[{"id":512,"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/pages\/509\/revisions\/512"}],"wp:attachment":[{"href":"https:\/\/jacekhoroszko.com\/index.php\/wp-json\/wp\/v2\/media?parent=509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}