class_mcZinsmethoden.inc.php 7.37 KB
<?php
/** 
 * @copyright (c) 2014, netz.coop eG
 */

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;
	}
}

?>