Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Obliczanie czasu i odsetek
Forum PHP.pl > Forum > PHP
blackneron
Mam problem ze zdefiniowaniem odsetek dla określonego przedziału czasowego.

Biorąc pod uwagę takie fakty:
-------------------------------------------------------------------------
Odsetki ustawowe-> Stawka:11,5%, obowiązuje od 15.10.2005
Odsetki podatkowe-> Stawka: 15%, obowiązuje od 26.06.2008
-------------------------------------------------------------------------


Póki co mam tak:

  1. <?php
  2. function get_age($date_start, $date_end) {
  3.    $t_lived = get_timestamp($date_end) - get_timestamp($date_start);
  4.    $seconds_one_year = get_days_per_year($date_start, $date_end) * 24 * 60 * 60;
  5.    $age = array();
  6.    $age['years_exact'] = $t_lived / $seconds_one_year;
  7.    $age['years'] = floor($t_lived / $seconds_one_year);
  8.    $seconds_remaining = $t_lived % $seconds_one_year;
  9.    $age['days'] = round($seconds_remaining / (24 * 60 * 60));
  10.    return $age;
  11. }
  12. function get_timestamp($date) {
  13.    list($y, $m, $d) = explode('-', $date);
  14.    return mktime(0, 0, 0, $m, $d, $y);
  15. }
  16. function get_days_per_year($date_start, $date_end) {
  17.    list($y1) = explode('-', $date_start);
  18.    list($y2) = explode('-', $date_end);
  19.    $years_days = array();
  20.    for($y = $y1; $y <= $y2; $y++) {
  21.        $years_days[] = date('L', mktime(0, 0, 0, 1, 1, $y)) ? 366 : 365;
  22.    
  23.    return round(array_sum($years_days) / count($years_days), 2);
  24. }
  25.  
  26. }
  27.  
  28. $poczatek = ''.$odroku.'-'.$odmiesiaca.'-'.$oddnia.'';
  29. $koniec = ''.$doroku.'-'.$domiesiaca.'-'.$dodnia.'';
  30.  
  31. $age = get_age($poczatek, $koniec);
  32.  
  33. $liczbaDni = $age[days]+($age[years]*365)+1;
  34.  
  35. $wzor = ($kwota*$liczbaDni*($stawka_proc)) / $liczbaDniWroku;
  36. ?>


Jakoś dziwnie źle liczy, może ktoś wyłapie co trzeba by zmienić ..


Dla kwoty zadłużenia: 500 zł.
Stawka procentowe: 11.5 %

Wynik: przy dacie: 08-08-2004 do 10-10-2008, wg mojego kodu:

Ilość dni zadłużenia: 1521
Wysokość odsetek: 312.53 zł.


Powinno wyjść (wg strony www.pit.pl/kalkulator_odsetek_2507.php)
Ilość dni zadłużenia: 1525
Wysokość odsetek: 249,43 zł.

Proszę o jakąś podpowiedź w temacie. Pozdrawiam.
webdice
Proszę poprawić tytuł tematu, sam tag nie jest tytułem.
pinochet
1. Zmien temat
2. Strasznie to karkołomne biggrin.gif liczbe dni mozna obliczyc tak:
  1. <?php
  2. $poczatek = ''.$odroku.'-'.$odmiesiaca.'-'.$oddnia.'';
  3.  $koniec = ''.$doroku.'-'.$domiesiaca.'-'.$dodnia.'';
  4.  $liczbaDni = ceil ( ( strtotime($koniec) - strtotime($poczatek) ) / 86400); // 24*60*60 = 86400;
  5. ?>

3. co do odsetek to policzylbym liczbe dni w latach przystepnych / 366 * stawka + liczba dni w latach nieprzystepnych / 365 * stawka im wiecej dzielisz tym powstają wieksze błędy przyblizenia ;-)
blackneron
Co do liczby dni to ok ale wysokość odsetek liczy kiepsko.

Chciałbym aby brało pod uwagę podczas liczenia przedział np. dla odsetek ustawowych: 15-10-2005 do 01-12-2007.
Tych przedziałów mogłoby być więcej, tak żeby dla dłuższego okresu brał i obliczał odsetki dla konkretnych przedziałów a potem je sumował.
W teorii proste w praktyce już mniej...
Pilsener
1. Sprawdzasz, do ilu zakresów pasuje wybrany przedział czasu
2. Liczysz liczbę dni dla każdego przedziału
3. Obliczasz odsetki dla każdego przedziału i sumujesz

http://pl.wikipedia.org/wiki/Odsetki_bud%C5%BCetowe - z tego co pamiętam i co tu piszą to odsetki takie liczy się prosto.
pinochet
Ponizszy PSEUDOKOD pokazuje miej wiecej jak to zrobic - mam nadzieje ze to Cie naprowadzi - powinno byc jeszcze uwzglednianie lat przystepnych ;-) pozdro
  1. <?php
  2. $tab = array( array('start' => 0, 'end' => strtotime('15.10.2005'), 'odsetki' => 11,5 / 365 ) );
  3.  
  4. $suma = 0;
  5. forach($tab as $val)
  6. if($pocz >= $val[start]){
  7.    if($koniec > $val[end]){
  8.       $suma += ceil( ($val[end] - $pocz)/ 86400) * $val[odsetki] );
  9.       $pocz = $koniec;
  10.    }else{
  11.        $suma += ceil( ($koniec - $pocz)/ 86400) * $val[odsetki] );
  12.        $pocz = $koniec;
  13.        break; // questionmark.gif nie wiem czy zadziała biggrin.gif
  14.        
  15.    }
  16. }
  17. ?>
blackneron
Przykro mi to powiedzieć ale nie działa. Prawdopodobnie z mojego błędu.


  1. <?php
  2. $tab = array(
  3.            array
  4.            (
  5.             'start' => 0,
  6.             'end' => strtotime('2005-10-15'),
  7.             'odsetki' => 11.5
  8.            )
  9.            );
  10.  
  11.  
  12.  
  13. $suma = 0;
  14. foreach($tab as $val)
  15. if($pocz >= $val[start]){
  16.   if($koniec > $val[end]){
  17.      $suma += ceil( ($val[end] - $pocz)/ 86400) * $val[odsetki] ;      
  18.      $pocz = $koniec;    
  19.   }else{
  20.       $suma += ceil( ($koniec - $pocz)/ 86400) * $val[odsetki] ;
  21.       $pocz = $koniec;
  22.       break;
  23.      
  24.   }
  25.  
  26. }
  27. echo $suma;
  28. ?>
mike
Cytat(blackneron @ 13.10.2008, 13:08:40 ) *
Przykro mi to powiedzieć ale nie działa.
Zastanawiam się kiedy ludzie na tym forum nauczą się zadwać pytania.
Wiesz jakie znaczenie ma "nie działa"? Takie, że teraz co najwyżej można napisać Ci "acha".

Co rozumiesz pod pojęciem "nie działa". Wywala jakiś błąd? Jeśli tak to powiedz o tym. Podaj ten błąd.
Nic nie wywala? Zaznacz to. Pokazuje się biała strona? Skąd mamy to wiedzieć?
A może działa ale nie tak jakbyś chciał?
Masz włączone raportowanie błędów? Może będy są ale ich nie widzisz?

Jedyne co mogę Ci powiedzieć to, że nie potrafisz skorzystać poprawnie z tablic.
Pisze się $val['end'] a nie $val[end].
No i nie widzę zainicjowanej zmiennej $pocz i $koniec.
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.