Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kalkulator Odsetkowy
Forum PHP.pl > Forum > PHP
em1X
Mial kiedys ktos doczynienia ze skryptem typu kalkulator odsetkowy ktory oblicza odsetki od podanych kwot, miedzy dwoma datami na podstawie roznych progow podatkowych? troche zamotane.. przyklad tutaj

http://e-dlugi.pl/odsetki
castor
no nie mialem ale do czego dazysz??

jesli chcesz napisac taki kalkulator to trzeba przemyslec jak sie do tego zabrac i wzasc sie do roboty :wink:

Sorry za glupia odpowiezd ale dziwne pytanie zadalec biggrin.gif

Cytat
Czy mial ktos kiedys doczynienia??...


Jesli potrzebujesz pomocy to pisz w jakiej kwesti a jesli wogole nie wiesz jak sie do tego zabrac to tez napisz moze cos wymislimy :wink:
em1X
ano potrzebuje takiego napisac ale nie wiem jak sie zabrac do tego.. :/
probowalem cos wymyslic ale do niczego nie dochodzilem. Wiem jedynie opisowo jak to zrobic, znaczy jakby co to moge napisac. Gorzej z przeniesieniem tego na php :?
castor
to napisz do czego zes juz doszedl ito pomoge ci to na php przelozyc smile.gif

PS nie oczekuj odpowiedzi odemnie przed poniedzialkiem bo wyjezdzam :wink:
em1X
Wiec to idzie tak. Na e-dlugi.pl sa jakby 2 kalkulatory w jednym (odsetkowy i podatkowy), oba charakteryzuja sie innymi wzorami na obliczenie odsetek.

Zajmijmy sie tylko jednym, latwiejszym odsetkowym (co do drugiego bedzie to tylko kwestia innego wzoru).

W bazie trzymam te progi podatkowe, ktore sa w tabelce:

15/08/1992 60% rocznie
01/05/1993 54% rocznie
15/12/1995 46% rocznie
01/01/1997 35% rocznie
15/04/1998 33% rocznie
01/02/1999 24% rocznie
15/05/1999 21% rocznie
01/11/2000 30% rocznie
15/12/2001 20% rocznie

A teraz jak to dziala.

Ktos podaje date poczatkowa oraz koncowa. Przyklad:

data poczatkowa: 15/05/1994
data koncowa: 20/11/2000

zaleglosc: 2000 pln

I tu sie zaczyna cwancyk smile.gif
Znajdujemy w tablicy najblizszy prog podatkowy dla daty poczatkowej czyli 15/12/1995 (46% rocznie).

Obliczamy miedzy nimi roznice dni np. tym

$roznica_dni = (int)((mktime(0,0,0,$miesiac_daty_pocz,$dzien_daty_pocz,$rok_daty_pocz)-mktime(0,0,0,$miesiac_nast_progu,$dzien_progu,$rok_progu))/86400);

otrzymamy ilosc dni miedzy tymi datami

Ilosc odsetek dla tego progu bedzie wyrazana wzorem:

(kwota zaleglosci*liczba dni zwloki*wysokosc stopy procentowej dla tego progu) dzielone przez 365 (czyli rok)

$odsetki_dla_tego_progu = ($zaleglosc*$roznica_dni*$wysokosc_stopy)/365;

Obliczylismy dopiero wysokosc odsetek dla tego progu. Z tego momenu wyliczyc musimy kolejne progi. A wiec dla kazdego progu trzeba oddzielnie liczyc odsetki a na koncu je zsumowac.

troche poyebane tongue.gif watpie ze ktos to zrobi
castor
Cytat
troche poyebane tongue.gif watpie ze ktos to zrobi


nie wierzysz w nas?questionmark.gifquestionmark.gif

Kod
<?php

if($poczatkowa!=""){

    $db_data=array();

    $db_stopa=array();



    $db_data[0]="15/08/1992";

    $db_data[1]="01/05/1993";

    $db_data[2]="15/12/1995";

    $db_data[3]="01/01/1997";

    $db_data[4]="15/04/1998";

    $db_data[5]="01/02/1999";

    $db_data[6]="15/05/1999";

    $db_data[7]="01/11/2000";

    $db_data[8]="15/12/2001";



    $db_stopa[0]="60";

    $db_stopa[1]="54";

    $db_stopa[2]="46";

    $db_stopa[3]="35";

    $db_stopa[4]="33";

    $db_stopa[5]="24";

    $db_stopa[6]="21";

    $db_stopa[7]="30";

    $db_stopa[8]="20";

    

        

        $poczatkowa=explode("/",chop($poczatkowa));//wyciagamy z stringa date dzien i miesiac

        $poczatkowa=mktime(0,0,0,$poczatkowa[1],$poczatkowa[0],$poczatkowa[2]);//ustalamy stempel czasu dla poczatku---/

        

        $koncowa=explode("/",chop($koncowa));//wyciagamy z stringa date dzien i miesiac

        $koncowa=mktime(0,0,0,$koncowa[1],$koncowa[0],$koncowa[2]);//---a tu stempel czasu dla konca

        $zaleglosc=chop($zaleglosc);//usuwamy rn

        

        $roznica_dni=explode(".",(($koncowa-$poczatkowa)/86400));//liczymy roznice dni i odcinamy wartosc po przecinku

        $roznica_dni=$roznica_dni[0];//tu przypiszujemy te wartosc

        

        

        //--ta petla rozwala nam string na daty i zamienia je na stempel czasu

        for($i=0;$i<count($db_data);$i++){

             $ex=explode("/",$db_data[$i]);

             $tim=mktime(0,0,0,$ex[1],$ex[0],$ex[2]);

             $db_data[$i]=$tim;

        }

        

        

        // tu sorujemy jesli sa nie pokoleji ale w tym samym czasie sortujemy rowniez array ze stopami

        //wiadomo dlaczego :))

        array_multisort($db_data,$db_stopa);

        

        

        //ustalamy na ktorej pozycji jest najblizej polozona data

        $j=0;

        for($i=0;$i<count($db_data);$i++){

             $j=$i;

             if($poczatkowa<$db_data[$i]){

                 break;

             }

        }        

        $roznica_do_wiekszej=$db_data[$j]-$poczatkowa;

        $roznica_do_mniejszej=$poczatkowa-$db_data[$j-1];

        if($roznica_do_wiekszej>$roznica_do_mniejszej){

            $j--;

        }

        //koniec ustalania

        

        

        $stopa="0.".$db_stopa[$j]; // przypisuzjemy prosent stopy do wartosci po przecinku

        $odsetki=($zaleglosc*$roznica_dni*$stopa)/365; // wyliczymy odsetki

}

?>

<html>

<body>

odsetki:<b><?php echo"$odsetki"; ?></b>

<hr>

Wpisz date w takim formacie: 31/05/2001 !!<br>

<form action="<? echo "$PHP_SELF";?>" method="post">

data poczatkowa:<br>

<input type="text" name="poczatkowa" value="15/05/1994"><br>

data koncowa:<br>

<input type="text" name="koncowa" value="20/11/2000"><br>

zaleglosc:<br>

<input type="text" name="zaleglosc" value="2000"><br>

<input type="submit" name="submit" value="przelicz">

</form>

</body>

</html>


jesli masz do tego jakies pytania to pisz lecz nie oczekuj odpowiedzi przed poniedzialkim bo jak juz pisalem znikam na weekend :wink:
castor
widze ze go troche porozsuwalo wiec wez najlepiej
Ctrl+C a u siebie w edytorze textowym Ctrl+V

Ale to to chyba wiesz nie :wink:

Milego weekendu zycze wszystkim!!
Mac
Cytat
widze ze go troche porozsuwalo wiec wez najlepiej
Ctrl+C a u siebie w edytorze textowym Ctrl+V

Ale to to chyba wiesz nie :wink:  

Milego weekendu zycze wszystkim!!

Dziękuje :wink: smile.gif
em1X
szkoda tylko ze zle liczy sad.gif
castor
Noi tak jak czlowiek sie naplanuje a pogoda se w h...ja zagra :cry:

Wracajac do twojego kalkulatorka to nie jest moja winna ze on zle liczy jesli tak jest to wzor ,ktory podales do niczego sie nie nadaje.

Przeanalizujmy krok po kroku:

Mamy takie dane w bazie:

Kod
15/08/1992 60% rocznie

01/05/1993 54% rocznie

15/12/1995 46% rocznie

01/01/1997 35% rocznie

15/04/1998 33% rocznie

01/02/1999 24% rocznie

15/05/1999 21% rocznie

01/11/2000 30% rocznie

15/12/2001 20% rocznie


oraz takie zmienne:
Kod
data poczatkowa: 15/05/1994

data koncowa: 20/11/2000

zaleglosc: 2000 pln


wiec najblizsza data z bazy dla daty poczatkowaej bedzie:
Kod
01/05/1993 54% rocznie

co z tego wynika ze stopa bedzie wynosila: 54%

tak tak .... bo od 15/05/1994 do 15/12/1995 46% mamy 19 miesiecy

a od 01/05/1993 do 15/05/1994 jest ich tylko 12 :wink:

Jesli zalezy ci na tym zeby brana byla po uwage pierwsza data wyzsza od poczatkowej to wywal ze skryptu to:
Kod
        $roznica_do_wiekszej=$db_data[$j]-$poczatkowa;

        $roznica_do_mniejszej=$poczatkowa-$db_data[$j-1];

        if($roznica_do_wiekszej>$roznica_do_mniejszej){

            $j--;

        }


i teraz dalej: roznica dni miedzy data poczatkowa a koncowa to 2381 dni..

i teraz trzymajac sie twojego wzoru :
(kwota zaleglosci*liczba dni zwloki*wysokosc stopy procentowej dla tego progu) dzielone przez 365 (czyli rok)

liczymy:

(2000*2381*0.54)/365 = 7045.150684.....

moj program wyliczyl: 7045.1506849315

czyli to samo :wink:

wiec jesli jest zle to pomysl nad wzorem do wyliczenia tych odsetek.

Ja nie mialem czasu zeby sie nad tym zastanowic przezucilem Ci to tylko na php.

Pomysl nad wzorem a jesli na nic nie wpadniesz to zapytaj sie ludzi z tego banku jak oni to wyliczaja i jak bedziesz mial odpowiedni wzor do ich wyliczenia to wpadnij i ja ci to na php przezuce.
castor
zmienilem zrodlo bo byl tam pewien blad ale to nie zmienia faktu ze i tak dadal zle liczy.

Pomysl nad wzorem :wink:
em1X
// tu byl dlugi post

niestety nie wiedzialem jak go wywalic tongue.gif
em1X
ano troche pokrecilem, z gory przepraszam... wzor byl na odsetki podatkowe, usunalem ze skryptu ten kawalek kodu oraz poprawilem kilka bledow. Mimo to dalej zle sad.gif

Kod
<php

if($poczatkowa!=""){

   $db_data=array();

   $db_stopa=array();



   $db_data[0]="01/01/1998";

   $db_data[1]="21/05/1998";

   $db_data[2]="17/07/1998";

   $db_data[3]="29/10/1998";

   $db_data[4]="10/12/1998";

   $db_data[5]="21/01/1999";

   $db_data[6]="18/11/1999";

   $db_data[7]="24/02/2000";

   $db_data[8]="31/08/2000";

   $db_data[9]="01/03/2001";

   $db_data[10]="29/03/2001";

   $db_data[11]="28/06/2001";

   $db_data[12]="23/08/2001";

   $db_data[13]="26/10/2001";

   $db_data[14]="29/11/2001";



   $db_stopa[0] ="54";

   $db_stopa[1] ="52";

   $db_stopa[2] ="48";

   $db_stopa[3] ="44";

   $db_stopa[4] ="40";

   $db_stopa[5] ="34";

   $db_stopa[6] ="41";

   $db_stopa[7] ="43";

   $db_stopa[8] ="46";

   $db_stopa[9] ="44";

   $db_stopa[10]="42";

   $db_stopa[11]="39";

   $db_stopa[12]="37";

   $db_stopa[13]="34";

   $db_stopa[14]="31";





        $poczatkowa=explode("/",chop($poczatkowa));//wyciagamy z stringa date dzien i miesiac

        $poczatkowa=mktime(0,0,0,$poczatkowa[1],$poczatkowa[0],$poczatkowa[2]);//ustalamy stempel czasu dla poczatku---/



        $koncowa=explode("/",chop($koncowa));//wyciagamy z stringa date dzien i miesiac

        $koncowa=mktime(0,0,0,$koncowa[1],$koncowa[0],$koncowa[2]);//---a tu stempel czasu dla konca

        $zaleglosc=chop($zaleglosc);//usuwamy rn



        $roznica_dni=explode(".",(($koncowa-$poczatkowa)/86400));//liczymy roznice dni i odcinamy wartosc po przecinku

        $roznica_dni=$roznica_dni[0];//tu przypiszujemy te wartosc





        //--ta petla rozwala nam string na daty i zamienia je na stempel czasu

        for($i=0;$i<count($db_data);$i++){

             $ex=explode("/",$db_data[$i]);

             $tim=mktime(0,0,0,$ex[1],$ex[0],$ex[2]);

             $db_data[$i]=$tim;

        }





        // tu sorujemy jesli sa nie pokoleji ale w tym samym czasie sortujemy rowniez array ze stopami

        //wiadomo dlaczego )

        array_multisort($db_data,$db_stopa);





        //ustalamy na ktorej pozycji jest najblizej polozona data

        $j=0;

        for($i=0;$i<count($db_data);$i++){

             $j=$i;

             if($poczatkowa<$db_data[$i]){

                 break;

             }

        }



        //koniec ustalania





        $stopa="0.".$db_stopa[$j]; // przypisujemy procent stopy do wartosci po przecinku

        $razem=round((($zaleglosc*$roznica_dni*$stopa)/365),2); // wyliczamy odsetki

        $odsetki= -round($zaleglosc-$razem,2);

}

?>

<html>

<body>

odsetki :<?php echo $odsetki; ?><br>

zaleglosc :<?php echo"$zaleglosc"; ?><br>

razem :<b><?php echo "$razem"; ?></b>

<hr>

Wpisz date w takim formacie: 31/05/2001 !!<br>

<form action="<? echo "$PHP_SELF";?>" method="post">

data poczatkowa:<br>

<input type="text" name="poczatkowa" value="15/05/1994"><br>

data koncowa:<br>

<input type="text" name="koncowa" value="20/11/2000"><br>

zaleglosc:<br>

<input type="text" name="zaleglosc" value="2000"><br>

<input type="submit" name="submit" value="przelicz">

</form>

</body>

</html>
kryr
Cytat
Noi tak jak czlowiek sie naplanuje a pogoda se w h...ja zagra  

A jak to bedzie po niemiecku?
em1X
kryr zamiast p******* lepiej bys cos madrego o kalkulatorze napisal :x
castor
Nie zrozumialem dokladnie pierwszego postu. Przeciez to jest jasne ze trzeba wyliczyc odsetki osobno dla kazdego progu bo trzeba uzyc do tego danej stopy ktora byla aktualna w danym okresie.

Kod
<?php



if($poczatkowa!=""){

    $db_data=array();

    $db_stopa=array();



    $db_data[0]="15/08/1992";

    $db_data[1]="01/05/1993";

    $db_data[2]="15/12/1995";

    $db_data[3]="01/01/1997";

    $db_data[4]="15/04/1998";

    $db_data[5]="01/02/1999";

    $db_data[6]="15/05/1999";

    $db_data[7]="01/11/2000";

    $db_data[8]="15/12/2001";



    $db_stopa[0]="60";

    $db_stopa[1]="54";

    $db_stopa[2]="46";

    $db_stopa[3]="35";

    $db_stopa[4]="33";

    $db_stopa[5]="24";

    $db_stopa[6]="21";

    $db_stopa[7]="30";

    $db_stopa[8]="20";

    

        

        $poczatkowa=explode("/",chop($poczatkowa));//wyciagamy z stringa date dzien i miesiac

        $poczatkowa=mktime(0,0,0,$poczatkowa[1],$poczatkowa[0],$poczatkowa[2]);//ustalamy stempel czasu dla poczatku---/

        

        $koncowa=explode("/",chop($koncowa));//wyciagamy z stringa date dzien i miesiac

        $koncowa=mktime(0,0,0,$koncowa[1],$koncowa[0],$koncowa[2]);//---a tu stempel czasu dla konca

        $zaleglosc=chop($zaleglosc);//usuwamy rn

        

        

        //--ta petla rozwala nam string na daty i zamienia je na stempel czasu

        for($i=0;$i<count($db_data);$i++){

             $ex=explode("/",$db_data[$i]);

             $tim=mktime(0,0,0,$ex[1],$ex[0],$ex[2]);

             $db_data[$i]=$tim;

        }

        

        

        // tu sorujemy jesli sa nie pokoleji ale w tym samym czasie sortujemy rowniez array ze stopami

        //wiadomo dlaczego :))

        array_multisort($db_data,$db_stopa);

        

        

        //ustalamy na ktorej pozycji jest najblizej polozona data

        $j=0;

        for($i=0;$i<count($db_data);$i++){

             $j=$i;

             if($poczatkowa<$db_data[$i]){

                 break;

             }

        }        

        



        //-------------------liczymy odsetki od daty poczatkowej do pierwszego progu-----//

        $prog=$db_data[$j];

        $roznica_dni=explode(".",(($prog-$poczatkowa)/86400));//liczymy roznice dni i odcinamy wartosc po przecinku

        $roznica_dni=$roznica_dni[0];//tu przypiszujemy te wartosc

        

        $stopa="0.".$db_stopa[$j-1]; // przypisujemy procent stopy do wartosci po przecinku

        $odsetki_progu[]=($zaleglosc*$roznica_dni*$stopa)/365; // wyliczymy odsetki

        $j++;

        

        

        //-----tu liczymy pomiedzy calkowitymi progami---//

        while($koncowa>$db_data[$j]){

                $prog=$db_data[$j];

        

         $roznica_dni=explode(".",(($prog-$db_data[$j-1])/86400));//liczymy roznice dni i odcinamy wartosc po przecinku

         $roznica_dni=$roznica_dni[0];//tu przypiszujemy te wartosc

        

         $stopa="0.".$db_stopa[$j-1]; // przypisujemy procent stopy do wartosci po przecinku

         $odsetki_progu[]=($zaleglosc*$roznica_dni*$stopa)/365; // wyliczymy odsetki

                $j++;

        }

        

        //--------a tu liczymy odsetki po ostatnim progu do dnia koncowego----//

            $roznica_dni=explode(".",(($koncowa-$db_data[$j-1])/86400));//liczymy roznice dni i odcinamy wartosc po przecinku

         $roznica_dni=$roznica_dni[0];//tu przypiszujemy te wartosc        

  $stopa="0.".$db_stopa[$j-1]; // przypisujemy procent stopy do wartosci po przecinku

         $odsetki_progu[]=($zaleglosc*$roznica_dni*$stopa)/365;

        

        

        //----sumujemy odsetki progow

        $odsetki=0;

        for($i=0;$i<count($odsetki_progu);$i++){

         $odsetki=$odsetki+$odsetki_progu[$i];

        }

        

        

}      

?>

<html>

<body>

odsetki :<b><?php echo"$odsetki"; ?></b>

<hr>

Wpisz date w takim formacie: 31/05/2001 !!<br>

<form action="<? echo "$PHP_SELF";?>" method="post">

data poczatkowa:<br>

<input type="text" name="poczatkowa" value="15/05/1994"><br>

data koncowa:<br>

<input type="text" name="koncowa" value="20/11/2000"><br>

zaleglosc:<br>

<input type="text" name="zaleglosc" value="2000"><br>

<input type="submit" name="submit" value="przelicz">

</form>

</body>

</html>


wez pobaw sie tym

Liczy troche inaczej niz to ten kalkulator z banku ale bardzo przyblizonie wiec mysle ze jest to kwesja zaokraglen :wink:

w liniach wyliczajacych roznice dni masz cos takiego:
Kod
$roznica_dni=explode(".",(($koncowa-$db_data[$j-1])/86400));//liczymy roznice dni i odcinamy wartosc po przecinku

$roznica_dni=$roznica_dni[0];//tu przypiszujemy te wartosc


wykomentuj druga linie i wywal to explode czyli zrob cos takiego:
Kod
$roznica_dni=($koncowa-$db_data[$j-1])/86400;//liczymy roznice dni i odcinamy wartosc po przecinku

//$roznica_dni=$roznica_dni[0];//tu przypiszujemy te wartosc


i wartosc sie troche zmieni bo w tym miejscu odcinalem reszte po przecinku w roznicy dnii a oni moze jej nie odcinaja tylko zaokraglaja np: do dwoch miejsc po przecinku..

Pobaw sie tym jak bedziesz mial jakies pytania to wal moze cos wymysle lecz nie oczekuj ode mnie za wiele gdyz nie bede mial w tym tygodniu duzo czasu.
em1X
tyle ze roznica pomiedzy tymi dwoma kalkulatorami to nie sa grosze od zaokraglen tylko cale tysiace tongue.gif wez odpal ten skrypt, wsadz 2 te same daty i kwoty na oba skrypty i porownaj (www.e-dlugi.pl/odsetki)
castor
nie mam teraz mozliwosci tego odpalic lecz zwroc uwage ze ten skrypt zwraca ci trylko odsetki od sumy wiec jesli chcesz otrzymac kwote to dodaj odsetki do zaleglosci!
SonGoace
sam wyjebałem takiego skrypta. liczy procenty w skali od 1 do 36 miesięcy na oprocentowanie od 1 do 99 w skali roku tongue.gif

chętnych zapraszam na GG 1478896
steru
Cytat
sam wyjebałem takiego skrypta.

zboczeniec, wykolejeniec jeden ....
kryr
steru: tacy ludzie nie sa warci posta, nie mowiac juz o uwadze...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.