<?php class mcZinsmethoden { public static function rechneZinsen($evon, $ezdatum, $ebis, $emzins, $ezbetrag, $__ZINSBERECHNUNG='deutsch') { // global $__ZINSBERECHNUNG; if($__ZINSBERECHNUNG == 'taggenau') { $result = self::rechneZinsenTaggenau($evon, $ezdatum, $ebis, $emzins, $ezbetrag); } else if($__ZINSBERECHNUNG == 'deutsch') { $result = self::rechneZinsenDeutsch($evon, $ezdatum, $ebis, $emzins, $ezbetrag); } else if($__ZINSBERECHNUNG == 'old') { include ("../includes/zinsenrechnen.inc.php"); $result = array('zinsbetrag' => $zinsbetrag, 'zinstage'=> $zinstage); } return $result; } private static function rechneTageDeutschMaxYear($start_month, $start_day, $stop_month, $stop_day, $year) { $start_month = (int) $start_month; $start_day = (int) $start_day; $stop_month = (int) $stop_month; $stop_day = (int) $stop_day; if($start_month==1 && $start_day==1 && $stop_month==12 && $stop_day==31) { $zinstage = self::$JahrTage_deutsch; } else { $monatstage = self::$Monatstage; $zinstage = 0; $schalt = $year % 4; if ($schalt == 0) { $schalt = true; $monatstage[2] = 29; } else { $schalt = false; } for($month=$start_month; $month<=$stop_month; $month++) { if($start_month == $stop_month) { $zinstage = $stop_day - $start_day; } else if($month == $start_month) { if($start_day == 1) { $zinstage = 30; } else if($month == 2) { $zinstage = 30 - $start_day; } else { $zinstage = $monatstage[$month] - $start_day; } D::ulli($zinstage . ' 1## '.$month. ' ########### '.$monatstage[$month]); } else if($month == $stop_month) { if($stop_day == 31) { $zinstage = $zinstage + 30; } else { $zinstage = $zinstage + ($stop_day); } D::ulli($zinstage . ' 2## '.$month); } else { $zinstage = $zinstage + self::$MonatTage_deutsch; D::ulli($zinstage . ' 3## '.$month); } } } D::li("$start_month, $start_day ==> $stop_month, $stop_day, $year ==== $zinstage" ); return $zinstage; } private static $JahrTage_deutsch = 360; private static $MonatTage_deutsch = 30; /** * Deutsche kaufmännische Zinsrechnung 30/360 * Zinstage: Monat zu 30 Zinstagen * (fällt Beginn oder Ende der Zinszahlungsfrist auden 31. eines * Monats, wird dieser wie der 30. behandelt; * endet Verzinsung Wert 28.02. (29.02.), werden Zinsen bis einschl. * 28.02. (29.02.) gerechnet; * läuft Verzinsung über ultimo Februar hinaus, wird Februar mit 30 * Tagen gerechnet.) * Jahr zu 360 Zinstagen * Anwendnung: Sparkonten * Kunden-Festgeldkonten * Kontokorrentkonten * Ratenkredite * langfristige Darlehen * * @param yyyy-mm-dd $evon * @param yyyy-mm-dd $ezdatum * @param yyyy-mm-dd $ebis * @param int $emzins * @param €€.cc $ezbetrag * @return array('zinsbetrag' => $zinsbetrag, 'zinstage'=> $zinstage); */ public static function rechneZinsenDeutsch($evon, $ezdatum, $ebis, $emzins, $ezbetrag) { $jahrtage = self::$JahrTage_deutsch; if ($evon < $ezdatum) { $zinsdat1 = $ezdatum; } else { $zinsdat1=$evon; } $zinsdat2 = $ebis; $zinsdat1tt = substr($zinsdat1, 8, 2); $zinsdat1mm = substr($zinsdat1, 5, 2); $zinsdat1jj = substr($zinsdat1, 0, 4); $zinsdat2tt = substr($zinsdat2, 8, 2); $zinsdat2mm = substr($zinsdat2, 5, 2); $zinsdat2jj = substr($zinsdat2, 0, 4); if($zinsdat1jj+1 < $zinsdat2jj) { $fullyear = $zinsdat2jj - ($zinsdat1jj+1); $zinstage = $fullyear * self::$JahrTage_deutsch; // D::ulli('$fullyear = '.$fullyear. ' $zinstage = '.$zinstage); $zinstage = $zinstage + self::rechneTageDeutschMaxYear($zinsdat1mm, $zinsdat1tt, 12, 31, $zinsdat1jj); // D::ulli($zinstage. " = + self::rechneTageDeutschMaxYear($zinsdat1mm, $zinsdat1tt, 12, 31, $zinsdat1jj)"); $zinstage = $zinstage + self::rechneTageDeutschMaxYear(1, 1, $zinsdat2mm, $zinsdat2tt, $zinsdat2jj); // D::ulli($zinstage. " = + self::rechneTageDeutschMaxYear(1, 1, $zinsdat2mm, $zinsdat2tt, $zinsdat2jj);"); } else if($zinsdat1jj+1 == $zinsdat2jj) { $zinstage = self::rechneTageDeutschMaxYear($zinsdat1mm, $zinsdat1tt, 12, 31, $zinsdat1jj); // D::ulli($zinstage. " = self::rechneTageDeutschMaxYear($zinsdat1mm, $zinsdat1tt, 12, 31, $zinsdat1jj)"); $zinstage = $zinstage + self::rechneTageDeutschMaxYear(1, 1, $zinsdat2mm, $zinsdat2tt, $zinsdat2jj); // D::ulli($zinstage. " = + self::rechneTageDeutschMaxYear(1, 1, $zinsdat2mm, $zinsdat2tt, $zinsdat2jj);"); } else if($zinsdat1jj == $zinsdat2jj) { $zinstage = self::rechneTageDeutschMaxYear($zinsdat1mm, $zinsdat1tt, $zinsdat2mm, $zinsdat2tt, $zinsdat2jj); } $zinsbetrag = self::rechneZins($emzins, $ezbetrag, $jahrtage, $zinstage); return array('zinsbetrag' => $zinsbetrag, 'zinstage'=> $zinstage); } private static $Monatstage = array( 0 => '', 1 => 31, 2 => 28, 3 => 31, 4 => 30, 5 => 31, 6 => 30, 7 => 31, 8 => 31, 9 => 30, 10 => 31, 11 => 30, 12 => 31 ); /** * Taggenaue Zinsrechnung ("englische Zinsrechnung") act/act * Zinstage kalendermäßig * Jahr zu 365 bzw. 366 Zinstagen (lt.Kalender) * Anwendung: Bundesanleihen mit festem Zins * Bundesobligationen * Bundesschatzanweisungen * Finanzierungsschätze * Bundesschatzbriefe * Börsennotierte Anleihen * deutsche bürgerliche Zinsrechnung * @todo fnc berechnet nur Zinsen für ein Jahr * * * @param yyyy-mm-dd $evon * @param yyyy-mm-dd $ezdatum * @param yyyy-mm-dd $ebis * @param <type> $emzins * @param <type> $ezbetrag * @return array('zinsbetrag' => $zinsbetrag, 'zinstage'=> $zinstage); */ public static function rechneZinsenTaggenau($evon, $ezdatum, $ebis, $emzins, $ezbetrag) { $monatstage[0] = ""; $monatstage[1] = 31; $monatstage[2] = 28; $monatstage[3] = 31; $monatstage[4] = 30; $monatstage[5] = 31; $monatstage[6] = 30; $monatstage[7] = 31; $monatstage[8] = 31; $monatstage[9] = 30; $monatstage[10] = 31; $monatstage[11] = 30; $monatstage[12] = 31; $anzmon = 13; $zinstage = 0; $zinsbetrag = 0; if ($evon < $ezdatum) $zinsdat1 = $ezdatum; else $zinsdat1=$evon; $zinsdat2 = $ebis; $zinsdat1tt = substr($zinsdat1, 8, 2); $zinsdat1mm = substr($zinsdat1, 5, 2); $zinsdat1jj = substr($zinsdat1, 0, 4); $zinsdat2tt = substr($zinsdat2, 8, 2); $zinsdat2mm = substr($zinsdat2, 5, 2); $zinsdat2jj = substr($zinsdat2, 0, 4); $zinstage = 0; $schalt = $zinsdat1jj % 4; if ($schalt == 0) { $jahrtage = 366; $monatstage[2] = 29; } else { $jahrtage = 365; $monatstage[2] = 28; } $j = 0 + $zinsdat1mm; $monatanfang = $monatstage[$j] - $zinsdat1tt + 1; $j = 0 + $zinsdat2mm; $monatende = $zinsdat2tt; if ($zinsdat1mm == $zinsdat2mm) $monatende = 0; $anfang = $zinsdat1mm + 1; $ende = $zinsdat2mm; for ($j = $anfang; $j < $ende; $j++) { $mmtag = $monatstage[$j]; $zinstage = $zinstage + $mmtag; } $zinstage = $zinstage + $monatanfang + $monatende; $zinsbetrag = self::rechneZins($emzins, $ezbetrag, $jahrtage, $zinstage); return array('zinsbetrag' => $zinsbetrag, 'zinstage'=> $zinstage); } private static function rechneZins($emzins, $ezbetrag, $jahrtage, $zinstage) { $zinsbetrag = 0; if ($emzins != 0) { $tagbetrag = ($ezbetrag / $jahrtage) * $zinstage; $rechbetrag = ($tagbetrag * $emzins) / 100; $zinsbetrag = round($rechbetrag, 2); } return $zinsbetrag; } } ?>