Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] ile dni od daty + obliczenie % odsetek za każdy dzień zwłoki
Forum PHP.pl > Forum > Przedszkole
Seiku
Witam, mam problem z dodaniem nowej funkcji do strony.
Sprawa wygląda tak:
Szkoła wystawia uczniowi należność w wysokości 100zł (w bazie jest to zmienna $kwota) za naukę w danej klasie z dniem zapłaty do np 01-03-2013 (w bazie jest to zmienna $termin_platnosci) termin mija a system generuje za każdy dzień zwłoki np 1% (w bazie jest to zmienna $procent w tablicy 'naliczenia_szablon') od sumy należności i wyświetla kwotę odsetek do zapłaty.

mam taki kod tablicy naliczeń:
  1.  
  2. //NALICZENIA
  3. echo '<tr><td align="center" valign="top" nowrap>';
  4.  
  5.  
  6. $zapytanie_naliczenia = "SELECT n.kwota, n.termin_platnosci, ns.nazwa, n.id_naliczenia FROM naliczenia n JOIN naliczenia_szablon ns ON (n.id_naliczenia_szablon=ns.id_naliczenia_szablon) WHERE n.id_uczen='".$_SESSION['id_uczen']."' AND ns.id_rok='".$_SESSION['rok_szkolny']."' ORDER BY n.termin_platnosci";
  7. $wynik_naliczenia = mysql_query($zapytanie_naliczenia, $polaczenie);
  8.  
  9.  
  10. if (mysql_num_rows($wynik_naliczenia)>0) {echo '<table><tr>
  11. <td class="td_head2" >LP</td>
  12. <td class="td_head">Nazwa</td>
  13. <td class="td_head2">Termin<br><span style="font-size: 10px; font-weight: normal;">płatności</span></td>
  14. <td class="td_head2">Kwota<br><span style="font-size: 10px; font-weight: normal;">do zapłaty</span></td>
  15. <td class="td_head2">Należne<br><span style="font-size: 10px; font-weight: normal;">odsetki</span></td>
  16. <td class="td_head2">&nbsp;</td></tr>';}
  17.  
  18. while ($wiersz_naliczenia = mysql_fetch_row($wynik_naliczenia)) {
  19. $licz++;
  20. $naliczenia_razem += $wiersz_naliczenia[0];
  21. if ($class=='td1') {$class='td2';} else {$class='td1';}
  22. if (($suma_wplat < $naliczenia_razem) && (date(Ymd) > (str_replace('-','',$wiersz_naliczenia[1])*1))) {$style=' style="color: red;"';} else {$style='';}
  23.  
  24. echo '<tr>
  25. <td class="'.$class.'" '.$style.'>'.$licz.'</td>
  26. <td class="'.$class.'" '.$style.'>'.wordwrap($wiersz_naliczenia[2], 25, "<br />\n").'</td>
  27. <td class="'.$class.'" '.$style.'>'.$wiersz_naliczenia[1].'</td>
  28. <td class="'.$class.'" '.$style.'>'.number_format($wiersz_naliczenia[0], 2, ',', ' ').' zł</td>
  29. <td class="'.$class.'" '.$style.'>Tu ma być wyświetlana suma odsetek</td>
  30. <td class="'.$class.'">';
  31. if ($suma_wplat >= $naliczenia_razem) {
  32. echo '<img src="img/ok.png" alt="" onMouseover="ddrivetip(\'Płatność uregulowana\',120)" onMouseout="hideddrivetip()">';
  33. $suma_zaplaconych += $wiersz_naliczenia[0];
  34. } else {
  35. echo '<img src="img/delete_ico.png" alt="" onMouseover="ddrivetip(\'Niezapłacone\',120)" onMouseout="hideddrivetip()">';
  36. echo ' <a href="http://'.$_SERVER['SERVER_NAME'].'/spznp/przelew.php?r=p&kwota='.$wiersz_naliczenia[0].'&tytulem='.$wiersz_naliczenia[2].' '.$wiersz_naliczenia[1].'" target="_new" class="bn"><img src="img/raport_ico.png" alt="" onMouseover="ddrivetip(\'Wygeneruj blankiet przelewu / wpłaty\',120)" onMouseout="hideddrivetip()"></a> ';
  37. if ($_SESSION['poziom_uprawnien']=='K') {
  38. if (ID_PRZELEWY24 != '') {echo '<a href="http://sklep.przelewy24.pl/zakup.php?z24_id_sprzedawcy='.ID_PRZELEWY24.'&z24_kwota='.($wiersz_naliczenia[0]*100).'&z24_nazwa='.$wiersz_naliczenia[2].'&z24_return_url=https://www.example.pl/index.php?page=naliczenia_wplaty&tab=tab_czesne&wplacono_p24='.$wiersz_naliczenia[0].'&k24_nazwa='.$wiersz_uczen[0].' '.$wiersz_uczen[1].' (kod: '.$wiersz_uczen[2].')&k24_email='.$wiersz_uczen[4].'&k24_kod='.$wiersz_uczen[5].'&k24_miasto='.$wiersz_uczen[6].'&k24_ulica='.$wiersz_uczen[7].'" class="bn"><img src="img/przelewy24.png" alt="" onMouseover="ddrivetip(\'Płatności elektroniczne. Zapłać za pośrednictwem systemu Przelewy24.pl\',180)" onMouseout="hideddrivetip()"></a>';}
  39. }
  40. $naliczenia_niezaplacone += $wiersz_naliczenia[0];
  41. if (date(Ymd) > (str_replace('-','',$wiersz_naliczenia[1])*1)) {$naliczenia_niezaplacone_uplynal += $wiersz_naliczenia[0];}
  42. }
  43.  
  44. if ($_SESSION['poziom_uprawnien']=='O' || $_SESSION['poziom_uprawnien']=='A') {echo ' <a href="index.php?page=naliczenia_wplaty&act=edit_naliczenia&id='.$wiersz_naliczenia[3].'" style="border: none;" onMouseover="ddrivetip(\'Edytuj naliczenie\',100)" onMouseout="hideddrivetip()"><img src="img/edit_ico.png" alt=""></a> <a href="#" style="border: none;" onMouseover="ddrivetip(\'Usuń naliczenie\',100)" onMouseout="hideddrivetip()" onclick="DefuseNalicz(\''.$wiersz_naliczenia[3].'\');";><img src="img/trash_16.png" alt=""></a>';} echo '</td></tr>';
  45.  
  46. }
  47. if ($naliczenia_razem>0) {echo '<tr><td></td><td></td><td height="30" align="right" valign="bottom">Razem:</td><td align="center" valign="bottom"><strong>'.number_format($naliczenia_razem, 2, ',', ' ').' zł</strong></td></tr>';}
  48. if (mysql_num_rows($wynik_naliczenia)>0) {echo '</table>';} else {echo '<br><br><strong>Nie znaleziono naliczeń</strong><br><br>';}
  49. echo '</td>';
  50.  


Może mi ktoś pomóc jak to zrobić? W kodzie (wiersz 29) jest pole o nazwie: "Tu ma być wyświetlana suma odsetek" i jak nazwa wskazuje będzie się tam suma pojawiała należnych odsetek.

Jeśli podałem za mało informacji proszę o podpowiedź co jeszcze napisać.
TomASS
W wieruszu 6 masz zapytanie:

  1. SELECT n.kwota, n.termin_platnosci, ns.nazwa, n.id_naliczenia FROM naliczenia n JOIN naliczenia_szablon ns ON (n.id_naliczenia_szablon=ns.id_naliczenia_szablon) WHERE n.id_uczen=YYY AND ns.id_rok=XXX ORDER BY n.termin_platnosci


Możesz wyciąnąć ilość dni zwłoki używając MySQLowego DATEDIFF:

  1. SELECT n.kwota, n.termin_platnosci, ns.nazwa, n.id_naliczenia, DATEDIFF(NOW() , n.termin_platnosci) AS iloscDniZwloki FROM naliczenia n JOIN naliczenia_szablon ns ON (n.id_naliczenia_szablon=ns.id_naliczenia_szablon) WHERE n.id_uczen=YYY AND ns.id_rok=XXX ORDER BY n.termin_platnosci


możesz teraz pomnożyć ilość dni przez odestki za każdy dzień zwłoki:
  1. SELECT n.kwota, n.termin_platnosci, ns.nazwa, n.id_naliczenia, (DATEDIFF(NOW() , n.termin_platnosci)*(0.13/365) AS odsetki FROM naliczenia n JOIN naliczenia_szablon ns ON (n.id_naliczenia_szablon=ns.id_naliczenia_szablon) WHERE n.id_uczen=YYY AND ns.id_rok=XXX ORDER BY n.termin_platnosci


i dalej możesz możesz dodać IF w zapytaniu zabezpieczające przed obliczeniem odsetek od niewymagalnych należności:
  1. SELECT n.kwota, n.termin_platnosci, ns.nazwa, n.id_naliczenia, IF((DATEDIFF(NOW() , n.termin_platnosci)*(0.13/365)>0, (DATEDIFF(NOW() , n.termin_platnosci)*(0.13/365)>0, 0) AS odsetkiNalezne FROM naliczenia n JOIN naliczenia_szablon ns ON (n.id_naliczenia_szablon=ns.id_naliczenia_szablon) WHERE n.id_uczen=YYY AND ns.id_rok=XXX ORDER BY n.termin_platnosci


teraz w kodzie w linii 29 daj:
  1. <td class="'.$class.'" '.$style.'>'.number_format($wiersz_naliczenia[4], 2, ',', ' ').'</td>

Seiku
Witam, ponownie troche popracowałem nad moim problemem i pojawiły się nowe komplikacje z którymi nie mogę się uporać póki co.

  1.  
  2. //NALICZENIA
  3. echo '<tr><td align="center" valign="top" nowrap>';
  4.  
  5.  
  6. $zapytanie_naliczenia = "SELECT n.kwota, n.termin_platnosci, ns.nazwa, n.id_naliczenia, ns.procent FROM naliczenia n JOIN naliczenia_szablon ns ON (n.id_naliczenia_szablon=ns.id_naliczenia_szablon) WHERE n.id_uczen='".$_SESSION['id_uczen']."' AND ns.id_rok='".$_SESSION['rok_szkolny']."' ORDER BY n.termin_platnosci";
  7. $wynik_naliczenia = mysql_query($zapytanie_naliczenia, $polaczenie);
  8.  
  9. $zapytanie_odsetki = "SELECT n.kwota, n.termin_platnosci, ns.nazwa, n.id_naliczenia, DATEDIFF(NOW() , n.termin_platnosci) AS iloscDniZwloki FROM naliczenia n JOIN naliczenia_szablon ns ON (n.id_naliczenia_szablon=ns.id_naliczenia_szablon) WHERE n.id_uczen='".$_SESSION['id_uczen']."' AND ns.id_rok='".$_SESSION['rok_szkolny']."' ORDER BY n.termin_platnosci";
  10. $wynik_odsetki = mysql_query($zapytanie_odsetki, $polaczenie);
  11. $wiersz_odsetki = mysql_fetch_row($wynik_odsetki);
  12.  
  13.  
  14. if (mysql_num_rows($wynik_naliczenia)>0) {echo '<table><tr>
  15. <td class="td_head2" >LP</td>
  16. <td class="td_head">Nazwa</td>
  17. <td class="td_head2">Termin<br><span style="font-size: 10px; font-weight: normal;">płatności</span></td>
  18. <td class="td_head2">Kwota<br><span style="font-size: 10px; font-weight: normal;">do zapłaty</span></td>
  19. <td class="td_head2">Stopa procentowa<br><span style="font-size: 10px; font-weight: normal;">za każdy dzień zwłoki</span></td>
  20. <td class="td_head2">Odsetki<br><span style="font-size: 10px; font-weight: normal;">należne</span></td>
  21. <td class="td_head2">Po<br><span style="font-size: 10px; font-weight: normal;">terminie</span></td>
  22. <td class="td_head2">&nbsp;</td></tr>';}
  23.  
  24. while ($wiersz_naliczenia = mysql_fetch_row($wynik_naliczenia)) {
  25. $licz++;
  26. $naliczenia_razem += $wiersz_naliczenia[0];
  27. if ($class=='td1') {$class='td2';} else {$class='td1';}
  28. if (($suma_wplat < $naliczenia_razem) && (date(Ymd) > (str_replace('-','',$wiersz_naliczenia[1])*1))) {$style=' style="color: red;"';} else {$style='';}
  29.  
  30. echo '<tr>
  31. <td class="'.$class.'" '.$style.'>'.$licz.'</td>
  32. <td class="'.$class.'" '.$style.'>'.wordwrap($wiersz_naliczenia[2], 25, "<br />\n").'</td>
  33. <td class="'.$class.'" '.$style.'>'.$wiersz_naliczenia[1].'</td>
  34. <td class="'.$class.'" '.$style.'>'.number_format($wiersz_naliczenia[0], 2, ',', ' ').' zł</td>
  35. <td class="'.$class.'" '.$style.'>'.number_format($wiersz_naliczenia[4], 2, ',', ' ').' %</td>
  36. <td class="'.$class.'" '.$style.'>'.number_format($wiersz_naliczenia[0]*$wiersz_naliczenia[4]/100*$wiersz_odsetki[4], 2, ',', ' ').' zł</td>
  37. <td class="'.$class.'" '.$style.'>'.number_format($wiersz_odsetki[4]).' Dni</td>
  38.  
  39.  
  40. <td class="'.$class.'">';
  41. if ($suma_wplat >= $naliczenia_razem) {
  42. echo '<img src="img/ok.png" alt="" onMouseover="ddrivetip(\'Płatność uregulowana\',120)" onMouseout="hideddrivetip()">';
  43. $suma_zaplaconych += $wiersz_naliczenia[0];
  44. } else {
  45. echo '<img src="img/delete_ico.png" alt="" onMouseover="ddrivetip(\'Niezapłacone\',120)" onMouseout="hideddrivetip()">';
  46. echo ' <a href="http://'.$_SERVER['SERVER_NAME'].'/przelew.php?r=p&kwota='.$wiersz_naliczenia[0].'&tytulem='.$wiersz_naliczenia[2].' '.$wiersz_naliczenia[1].'" target="_new" class="bn"><img src="img/raport_ico.png" alt="" onMouseover="ddrivetip(\'Wygeneruj blankiet przelewu / wpłaty\',120)" onMouseout="hideddrivetip()"></a> ';
  47. if ($_SESSION['poziom_uprawnien']=='K') {
  48. if (ID_PRZELEWY24 != '') {echo '<a href="http://sklep.przelewy24.pl/zakup.php?z24_id_sprzedawcy='.ID_PRZELEWY24.'&z24_kwota='.($wiersz_naliczenia[0]*100).'&z24_nazwa='.$wiersz_naliczenia[2].'&z24_return_url=https://www.example.pl/index.php?page=naliczenia_wplaty&tab=tab_czesne&wplacono_p24='.$wiersz_naliczenia[0].'&k24_nazwa='.$wiersz_uczen[0].' '.$wiersz_uczen[1].' (kod: '.$wiersz_uczen[2].')&k24_email='.$wiersz_uczen[4].'&k24_kod='.$wiersz_uczen[5].'&k24_miasto='.$wiersz_uczen[6].'&k24_ulica='.$wiersz_uczen[7].'" class="bn"><img src="img/przelewy24.png" alt="" onMouseover="ddrivetip(\'Płatności elektroniczne. Zapłać za pośrednictwem systemu Przelewy24.pl\',180)" onMouseout="hideddrivetip()"></a>';}
  49. }
  50. $naliczenia_niezaplacone += $wiersz_naliczenia[0];
  51. if (date(Ymd) > (str_replace('-','',$wiersz_naliczenia[1])*1)) {$naliczenia_niezaplacone_uplynal += $wiersz_naliczenia[0];}
  52. }
  53.  
  54. if ($_SESSION['poziom_uprawnien']=='O' || $_SESSION['poziom_uprawnien']=='A') {echo ' <a href="index.php?page=naliczenia_wplaty&act=edit_naliczenia&id='.$wiersz_naliczenia[3].'" style="border: none;" onMouseover="ddrivetip(\'Edytuj naliczenie\',100)" onMouseout="hideddrivetip()"><img src="img/edit_ico.png" alt=""></a> <a href="#" style="border: none;" onMouseover="ddrivetip(\'Usuń naliczenie\',100)" onMouseout="hideddrivetip()" onclick="DefuseNalicz(\''.$wiersz_naliczenia[3].'\');";><img src="img/trash_16.png" alt=""></a>';} echo '</td></tr>';
  55.  
  56. }
  57. if ($naliczenia_razem>0) {echo '<tr><td></td><td></td><td height="30" align="right" valign="bottom">Razem:</td><td align="center" valign="bottom"><strong>'.number_format($naliczenia_razem, 2, ',', ' ').' zł</strong></td></tr>';}
  58. if (mysql_num_rows($wynik_naliczenia)>0) {echo '</table>';} else {echo '<br><br><strong>Nie znaleziono naliczeń</strong><br><br>';}
  59. echo '</td>';
  60.  
  61.  
  62.  
  63.  
  64.  
  65. //WPŁATY
  66. echo '<td align="center" valign="top">';
  67.  
  68.  
  69.  
  70. $zapytanie_wplaty = "SELECT kwota, data_wplaty, id_wplaty FROM wplaty WHERE id_uczen='".$_SESSION['id_uczen']."' AND data_wplaty>='".$wiersz_rok['data_rozp']."' AND data_wplaty<='".$wiersz_rok['data_zak']."' ORDER BY data_wplaty";
  71. $wynik_wplaty = mysql_query($zapytanie_wplaty, $polaczenie);
  72. $licz=0;
  73. if (mysql_num_rows($wynik_wplaty)>0) {echo '<table width="100%"><tr><td class="td_head">LP</td><td class="td_head">Data</td><td class="td_head">Kwota<br><span style="font-size: 10px; font-weight: normal;">wpłaty</span></td>'; if ($_SESSION['poziom_uprawnien']=='O' || $_SESSION['poziom_uprawnien']=='A') {echo '<td class="td_head"></td>';} echo '</tr>';}
  74.  
  75. while ($wiersz_wplaty = mysql_fetch_row($wynik_wplaty)) {
  76. $licz++;
  77. if ($class=='td1') {$class='td2';} else {$class='td1';}
  78. echo '<tr><td class="'.$class.'">'.$licz.'</td><td class="'.$class.'">'.$wiersz_wplaty[1].'</td><td class="'.$class.'">'.number_format($wiersz_wplaty[0], 2, ',', ' ').' zł</td>'; if ($_SESSION['poziom_uprawnien']=='O' || $_SESSION['poziom_uprawnien']=='A') {echo '<td class="'.$class.'"><a href="index.php?page=naliczenia_wplaty&act=edit&id='.$wiersz_wplaty[2].'" style="border: none;" onMouseover="ddrivetip(\'Edytuj wpłatę\',100)" onMouseout="hideddrivetip()"><img src="img/edit_ico.png" alt=""></a>
  79. &nbsp; <a href="#" style="border: none;" onMouseover="ddrivetip(\'Usuń wpłatę\',100)" onMouseout="hideddrivetip()" onclick="Defuse(\''.$wiersz_wplaty[2].'\');";><img src="img/trash_16.png" alt=""></a></td>';} echo '</tr>';
  80. $wplaty_razem += $wiersz_wplaty[0];
  81. }
  82.  
  83.  
  84. if ($wplaty_razem>0) {echo '<tr><td></td><td height="30" align="right" valign="bottom">Razem:</td><td align="center" valign="bottom"><strong>'.number_format($wplaty_razem, 2, ',', ' ').' zł</strong></td></tr>';}
  85. if (mysql_num_rows($wynik_wplaty)>0) {echo '</table>';} else {echo '<br><br><strong>W zadanym przedziale czasowym,<br>nie odnotowano wpłat ucznia</strong><br><br>';}
  86. echo '</td></tr>';
  87.  
  88.  
  89. if ($wplaty_razem-$naliczenia_razem >= 0) {
  90. $style_saldo = 'style="background: darkgreen; font-size: 13pt; text-align: center; color: #FFFFFF;"';
  91. } else {
  92. $style_saldo = 'style="background: darkred; font-size: 13pt; text-align: center; color: #FFFFFF;"';
  93. }
  94.  
  95. echo '<tr><td align="center" style="border-top: 1px solid #CCCCCC;">Zapłacone: <strong>'.number_format($suma_wplat, 2, ',', ' ').' zł</strong> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Niezapłacone - po terminie: <strong>'; if (($naliczenia_niezaplacone_uplynal+$suma_zaplaconych-$suma_wplat)<0) {echo '0,00 zł</strong>';} else {echo number_format($naliczenia_niezaplacone_uplynal+$suma_zaplaconych-$suma_wplat, 2, ',', ' ').' zł</strong>';
  96.  
  97.  
  98. //Odsetki
  99. echo '<tr><td align="center" style="border-top: 1px solid #CCCCCC;">Odsetki: <strong> zł</strong>';
  100.  
  101.  
  102.  


W wierszu 36 liczy mi poprawnie, ale nie potrafie zrobić funkcji która będzie sprawdzała czy "termin_zaplaty" jest wiekszy niż dzień obecny tak by były liczone tylko dni po terminie zapłaty.
jest również problem w tym samym wierszy:
Gdy jest naliczenie za czesne nr 1 liczy wszytko ok, ale jak już jest naliczenie nr 2 to liczy odsetki biorąc liczbe dni przy mnożeniu ($wiersz_odsetki[4]) z naliczenia nr 1. W praktyce wygląda to tak:

Naliczenie nr 1 termin zapłaty 2013-04-10, dzisiejsza data 2013-04-30 czyli 20 dni po terminie, kwota do zapłaty 200 zł, odsetki za każdy dzień zwłoki 0,50% czyli daje nam 20zł
Naliczenie nr 2 termin zapłaty 2013-04-29, dzisiejsza data 2013-04-30 czyli powinno być 1 dzień po terminie a mi już na tym etapie zaczytuje 20 dni z naliczenia nr 1, kwota do zapłaty 100zł, odsetki 0,05% czyli daje nam 1zł

dla pomocy dodam screena jak to wygląda.


W wierszu 99 mam problem jak zsumować wszystkie należne odsetki, które saą wyliczane w wierszu 36.

Za pomoc w rozwiązaniu problemu z tym głupim skryptem stawiam dobrego browara smile.gif
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.