Blog programisty w Oracle PL/SQL

Jest to blog eksperymentatora programisty w PL/SQL dla Oracle. Wszystkie kody tutaj zamieszczone mogą być dowolnie wykorzystywane i zmieniane. A jeśli Ktoś z Gości znajdzie błąd, będę niezwykle wdzięczny...
Zapisz

Szukaj na tym blogu

niedziela, 22 listopada 2015

Uproszczony kalkulator wynagrodzeń za rok 2015 n. e.

 Poniżej zamieszczam kolejny przykład wykorzystania klauzuli model w wersji iteracyjnej, który przelicza wynagrodzenia brutto z umowy o pracę na poszczególne składniki po stronie pracownika w tym kwotę netto. Nie obsługuje progresji podatkowej ani ograniczenia rocznej podstawy wymiaru składek na ubezpieczenie emerytalne i rentowe (tzw. trzydziestokrotności  prognozowanego przeciętnego wynagrodzenia miesięcznego w gospodarce narodowej na dany rok kalendarzowy).
Istotą przykładu jest pokazanie w jaki elegancki sposób, zbliżony do obliczeń w MS Excel, można przedstawić  niektóre obliczenia finansowe, a zwłaszcza odwoływanie się do wcześniej obliczonych komórek. Zapis taki jest intuicyjny i łatwy do modyfikacji..Arkusz jest jednowymiarowy  w ujęciu klauzuli model, podstawową miarą (do modyfikowania przez użytkownika) jest kwota brutto zaznaczona na zielono. Użytkownik w łatwy sposób może dodawać własne miary np. obciążenia po stronie  pracodawcy lub w inny sposób rozszerzyć poniższe zapytanie.


SELECT i lp,
       DATA_WYPLATY AS "Data wypłaty" ,
       KWOTA_BRUTTO,
       SKLADKA_EMERYTALNA_PRACOWNIK,
       SKLADKA_RENTOWA_PRACOWNIK,
       SKLADKA_WYPADKOWA_PRACOWNIK,
       SKLADKI_PRACOWNIK_RAZEM,      
       DOCHOD_PRACOWNIKA,
       SKLADKA_ZDROWOTNA ,
       ZALICZKA_PODATEK,
       WYNAGRODZENIE_NETTO            
  FROM (SELECT 1 FROM DUAL)
MODEL
   DIMENSION BY (0 d)
   MEASURES (6000 KWOTA_BRUTTO,
    TO_DATE( '2015-01-01', 'YYYY-MM-DD') DATA_WYPLATY  , 0 i,   
    0 SKLADKA_EMERYTALNA_PRACOWNIK,
    0 SKLADKA_RENTOWA_PRACOWNIK,
    0 SKLADKA_WYPADKOWA_PRACOWNIK,    
    0 SKLADKI_PRACOWNIK_RAZEM,
    111.25 KOSZT_UZYSKANIA_PRZYCHODU /*Pracownik niedojeżdżający*/ ,
    0 DOCHOD_PRACOWNIKA,
    0 SKLADKA_ZDROWOTNA,
    0 ZALICZKA_PODATEK,
    0 WYNAGRODZENIE_NETTO )
   RULES
      ITERATE (100) UNTIL (ITERATION_NUMBER >= 11)
       (          
           i[ITERATION_NUMBER] = ITERATION_NUMBER +1,           
           DATA_WYPLATY [ITERATION_NUMBER ] =  LAST_DAY(DECODE( DATA_WYPLATY [ITERATION_NUMBER -1],  NULL, DATA_WYPLATY [ITERATION_NUMBER], 
           ADD_MONTHS( DATA_WYPLATY [ITERATION_NUMBER -1],  1))),
           KWOTA_BRUTTO[ITERATION_NUMBER ] = KWOTA_BRUTTO[ 0 ],        
           SKLADKA_EMERYTALNA_PRACOWNIK[ ITERATION_NUMBER ] = ROUND(KWOTA_BRUTTO[ITERATION_NUMBER ]   *  0.0976, 2),
           SKLADKA_RENTOWA_PRACOWNIK[ ITERATION_NUMBER ] = ROUND(KWOTA_BRUTTO[ITERATION_NUMBER ]   *  0.015, 2),
           SKLADKA_WYPADKOWA_PRACOWNIK[ ITERATION_NUMBER ] = ROUND(KWOTA_BRUTTO[ITERATION_NUMBER ]   *  0.0245, 2) ,
           SKLADKI_PRACOWNIK_RAZEM[ITERATION_NUMBER ]
                = SKLADKA_EMERYTALNA_PRACOWNIK[ ITERATION_NUMBER ] + SKLADKA_RENTOWA_PRACOWNIK[ ITERATION_NUMBER ]
                    +SKLADKA_WYPADKOWA_PRACOWNIK[ ITERATION_NUMBER ],                                              
           DOCHOD_PRACOWNIKA[ITERATION_NUMBER ] = ROUND( KWOTA_BRUTTO[ITERATION_NUMBER ] -SKLADKI_PRACOWNIK_RAZEM[ITERATION_NUMBER ] -  KOSZT_UZYSKANIA_PRZYCHODU[0]),
           SKLADKA_ZDROWOTNA[ITERATION_NUMBER ] = ROUND( (KWOTA_BRUTTO[ITERATION_NUMBER ]  - SKLADKI_PRACOWNIK_RAZEM[0]) * 0.09, 2),
           ZALICZKA_PODATEK[ITERATION_NUMBER ] = ROUND(DOCHOD_PRACOWNIKA[ITERATION_NUMBER ] * 0.18  -  46.33 - ROUND( (DOCHOD_PRACOWNIKA[ITERATION_NUMBER ]  + KOSZT_UZYSKANIA_PRZYCHODU[0]) * 0.0775)),
           WYNAGRODZENIE_NETTO[ITERATION_NUMBER ]= KWOTA_BRUTTO [ITERATION_NUMBER ]   - SKLADKI_PRACOWNIK_RAZEM[ITERATION_NUMBER ]  - SKLADKA_ZDROWOTNA[ITERATION_NUMBER ] - ZALICZKA_PODATEK[ITERATION_NUMBER ]                                    
      )