/** * AMORLINC * * Returns the depreciation for each accounting period. * This function is provided for the French accounting system. If an asset is purchased in * the middle of the accounting period, the prorated depreciation is taken into account. * * Excel Function: * AMORLINC(cost,purchased,firstPeriod,salvage,period,rate[,basis]) * * @access public * @category Financial Functions * @param float cost The cost of the asset. * @param mixed purchased Date of the purchase of the asset. * @param mixed firstPeriod Date of the end of the first period. * @param mixed salvage The salvage value at the end of the life of the asset. * @param float period The period. * @param float rate Rate of depreciation. * @param integer basis The type of day count to use. * 0 or omitted US (NASD) 30/360 * 1 Actual/actual * 2 Actual/360 * 3 Actual/365 * 4 European 30/360 * @return float */ public static function AMORLINC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis = 0) { $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); $purchased = PHPExcel_Calculation_Functions::flattenSingleValue($purchased); $firstPeriod = PHPExcel_Calculation_Functions::flattenSingleValue($firstPeriod); $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); $basis = is_null($basis) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); $fOneRate = $cost * $rate; $fCostDelta = $cost - $salvage; // Note, quirky variation for leap years on the YEARFRAC for this function $purchasedYear = PHPExcel_Calculation_DateTime::YEAR($purchased); $yearFrac = PHPExcel_Calculation_DateTime::YEARFRAC($purchased, $firstPeriod, $basis); if ($basis == 1 && $yearFrac < 1 && PHPExcel_Calculation_DateTime::_isLeapYear($purchasedYear)) { $yearFrac *= 365 / 366; } $f0Rate = $yearFrac * $rate * $cost; $nNumOfFullPeriods = intval(($cost - $salvage - $f0Rate) / $fOneRate); if ($period == 0) { return $f0Rate; } elseif ($period <= $nNumOfFullPeriods) { return $fOneRate; } elseif ($period == $nNumOfFullPeriods + 1) { return $fCostDelta - $fOneRate * $nNumOfFullPeriods - $f0Rate; } else { return 0.0; } }
/** * _daysPerYear * * Returns the number of days in a specified year, as defined by the "basis" value * * @param integer $year The year against which we're testing * @param integer $basis The type of day count: * 0 or omitted US (NASD) 360 * 1 Actual (365 or 366 in a leap year) * 2 360 * 3 365 * 4 European 360 * * @return integer */ private static function _daysPerYear($year, $basis = 0) { switch ($basis) { case 0: case 2: case 4: $daysPerYear = 360; break; case 3: $daysPerYear = 365; break; case 1: $daysPerYear = PHPExcel_Calculation_DateTime::_isLeapYear($year) ? 366 : 365; break; default: return PHPExcel_Calculation_Functions::NaN(); } return $daysPerYear; }