Napredni Kalkulator za Obračun Starosne Penzije u Srbiji

Autor: Aleksandar Maričić, dipl. ecc.

Klikni na Kalkulator Starosne Penzije (Srbija) i isprobaj program

U skladu sa složenim pravilima obračuna starosnih penzija u Srbiji, razvijen je napredni web kalkulator koji omogućava tačan i transparentan obračun penzije na osnovu zvanične formule:
VP = LB × OB, gde su:

  • VP – visina penzije
  • LB – lični bodovi
  • OB – opšti bod (vrednost koju propisuje država, trenutno 1.360 RSD)


Ključne karakteristike programa

Ručni unos zarada po godinama (UZO)

Korisnik može ručno uneti svoju prosečnu mesečnu zaradu od 1980. do 2024. godine direktno u tabelu unutar veb aplikacije.

Automatsko prepoznavanje prosečnih zarada (PRZR)

Program koristi zvanične prosečne zarade u Srbiji (PRZR) po godinama, preuzete sa sajta PIO fonda i RZS-a. Time se obezbeđuje realan i tačan obračun ličnih koeficijenata.

Uvoz CSV fajla

Podržano je učitavanje podataka iz CSV fajla, u formatu:

godina,uzo
2001,5200
2002,11000
...

Ovo omogućava brzo popunjavanje podataka za korisnike koji vode elektronsku evidenciju zarada.

Automatski obračun ličnih bodova

Program automatski:

  • Izračunava lični godišnji koeficijent za svaku godinu: LGK = UZO / PRZR
  • Izračunava prosečan lični koeficijent (LK) kao prosek svih LGK vrednosti
  • Množi ga sa brojem godina unetih zarada (PS) da dobije lične bodove (LB)
  • Konačno, LB se množi sa OB da dobije mesečnu penziju

Izvoz rezultata u PDF

Korisnik može jednim klikom da generiše PDF izveštaj sa svim proračunima, što može služiti kao prilog za ličnu evidenciju, pravno savetovanje ili komunikaciju sa PIO fondom.


Tehničke specifikacije

  • Frontend: HTML, JavaScript (nativni), jsPDF biblioteka za PDF izvoz
  • Podaci: Statistički PRZR podaci integrisani kao JSON objekat u aplikaciju
  • Mogućnost proširenja: podrška za API integraciju i automatsko učitavanje podataka iz zvaničnih izvora

Potencijalna buduća proširenja

  • Automatsko preuzimanje PRZR sa sajta PIO fonda ili RZS-a (parsing PDF/Excel)
  • Podrška za beneficirani radni staž, bodove za decu i posebne kategorije osiguranika
  • Izračun za prevremenu ili invalidsku penziju
  • Uvoz iz CROSO XML izveštaja

Ovaj program predstavlja praktičan alat za svakog građanina Srbije koji želi da sazna približan iznos svoje buduće penzije, na osnovu ličnih zarada. Uz podršku za realne statističke podatke i PDF izvoz, korisnik ima pouzdanu osnovu za planiranje svoje finansijske budućnosti.

Programski kod: html

<!DOCTYPE html>
<html lang="sr">
<head>
  <meta charset="UTF-8">
  <title>Kalkulator Penzije - Srbija</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
  <style>
    body { font-family: Arial, sans-serif; margin: 20px; background: #f9f9f9; }
    table { border-collapse: collapse; margin-top: 20px; }
    th, td { padding: 6px 8px; border: 1px solid #ccc; text-align: center; font-size: 12px; }
    input[type='number'] { width: 100px; }
    button, input[type='file'] { margin-top: 20px; padding: 10px; font-size: 14px; }
    #result { margin-top: 20px; font-size: 16px; font-weight: bold; white-space: pre-wrap; }
  </style>
</head>
<body>
  <h2>Kalkulator Starosne Penzije (Srbija)</h2>
  <p>Unesite svoje ukupne godišnje zarade (UZO) za svaku godinu od 1980. Možete i učitati CSV fajl sa zaradama u formatu: <code>godina,uzo</code>.</p>

  <input type="file" id="csvInput" accept=".csv" onchange="ucitajCSV(event)">

  <table id="zaradeTabela">
    <thead>
      <tr>
        <th>Godina</th>
        <th>Vaša zarada (UZO)</th>
        <th>Prosečna zarada (PRZR)</th>
      </tr>
    </thead>
    <tbody id="teloTabele"></tbody>
  </table>

  <button onclick="izracunajPenziju()">Izračunaj penziju</button>
  <button onclick="generisiPDF()">Preuzmi PDF</button>

  <div id="result"></div>

  <script>
    const PRZR = {
      1980: 128, 1981: 159, 1982: 210, 1983: 310, 1984: 446, 1985: 612,
      1986: 833, 1987: 1236, 1988: 2424, 1989: 3293, 1990: 3295, 1991: 3426,
      1992: 1040, 1993: 428, 1994: 1161, 1995: 1763, 1996: 2482, 1997: 2474,
      1998: 2639, 1999: 2478, 2000: 2928, 2001: 5211, 2002: 10886, 2003: 14748,
      2004: 20163, 2005: 24509, 2006: 29426, 2007: 35176, 2008: 41786,
      2009: 44326, 2010: 37976, 2011: 44849, 2012: 51461, 2013: 55212,
      2014: 56105, 2015: 45767, 2016: 52555, 2017: 59221, 2018: 63109,
      2019: 63591, 2020: 60073, 2021: 65514, 2022: 73328, 2023: 84631,
      2024: 98000
    };

    const OB = 1360;

    function napraviTabelu() {
      const tbody = document.getElementById("teloTabele");
      for (let godina in PRZR) {
        const tr = document.createElement("tr");
        tr.innerHTML = `
          <td>${godina}</td>
          <td><input type="number" id="uzo-${godina}" min="0" step="1000"></td>
          <td>${PRZR[godina].toLocaleString()} RSD</td>
        `;
        tbody.appendChild(tr);
      }
    }

    function ucitajCSV(event) {
      const file = event.target.files[0];
      const reader = new FileReader();
      reader.onload = function(e) {
        const lines = e.target.result.split('\n');
        lines.forEach(line => {
          const [godina, uzo] = line.trim().split(',');
          const input = document.getElementById(`uzo-${godina}`);
          if (input && !isNaN(uzo)) input.value = parseFloat(uzo);
        });
      };
      reader.readAsText(file);
    }

    let rezultatTekst = "";

    function izracunajPenziju() {
      let zbirKoef = 0;
      let brojGodina = 0;
      rezultatTekst = "";

      for (let godina in PRZR) {
        const uzoInput = document.getElementById(`uzo-${godina}`);
        const uzo = parseFloat(uzoInput.value);
        const przr = PRZR[godina];

        if (!isNaN(uzo) && uzo > 0) {
          const lgk = uzo / przr;
          zbirKoef += lgk;
          brojGodina++;
          rezultatTekst += `Godina ${godina}: UZO = ${uzo.toLocaleString()}, PRZR = ${przr.toLocaleString()}, LGK = ${lgk.toFixed(3)}\n`;
        }
      }

      if (brojGodina === 0) {
        document.getElementById("result").innerText = "Unesite barem jednu godišnju zaradu.";
        return;
      }

      const lk = zbirKoef / brojGodina;
      const ps = brojGodina;
      const lb = lk * ps;
      const vp = lb * OB;

      rezultatTekst += `\nProsečni lični koeficijent: ${lk.toFixed(3)}\nPenzijski staž: ${ps} godina\nLični bodovi: ${lb.toFixed(3)}\n👉 Mesečna penzija: ${vp.toFixed(2).toLocaleString()} RSD`;
      document.getElementById("result").innerText = rezultatTekst;
    }

    function generisiPDF() {
      const { jsPDF } = window.jspdf;
      const doc = new jsPDF();
      doc.setFontSize(12);
      const linije = rezultatTekst.split('\n');
      linije.forEach((linija, i) => {
        doc.text(linija, 10, 10 + i * 7);
      });
      doc.save("penzija-izvestaj.pdf");
    }

    napraviTabelu();
  </script>
</body>
</html>

By Abel

Leave a Reply

Your email address will not be published. Required fields are marked *