Steuerkram/tests/41_AfaAnteiligTest.php
2026-05-24 12:56:21 +02:00

116 lines
6.1 KiB
PHP

<?php
declare(strict_types=1);
use Steuerkram\Models\AssetDepreciation;
class AfaAnteiligTest extends TestCase
{
protected string $testName = 'Test 41: AfA anteiliges erstes/letztes Jahr';
public function run(): void
{
// ── April-Kauf (Monat 4): 9 Monate erstes Jahr, 3 Monate letztes Jahr ──
$rows = AssetDepreciation::calculate([
'anschaffungskosten' => 1200.00,
'zugaenge' => 0,
'abgaenge' => 0,
'nutzungsdauer' => 3,
'cent_im_ersten_jahr'=> false,
'anschaffungsdatum' => '2024-04-01',
]);
$this->assertEquals(4, count($rows), 'April-Kauf 3 Jahre: 4 Zeilen (inkl. anteiliges letztes Jahr)');
$this->assertEquals(300.00, $rows[0]['abschreibungsbetrag'], 'April: erstes Jahr 9/12 = 300,00');
$this->assertEquals(400.00, $rows[1]['abschreibungsbetrag'], 'April: Jahr 2 voll = 400,00');
$this->assertEquals(400.00, $rows[2]['abschreibungsbetrag'], 'April: Jahr 3 voll = 400,00');
$this->assertEquals(100.00, $rows[3]['abschreibungsbetrag'], 'April: letztes Jahr 3/12 = 100,00');
$this->assertEquals(0.00, $rows[3]['restwert'], 'April: Restwert am Ende = 0');
$sumAfa = array_sum(array_column($rows, 'abschreibungsbetrag'));
$this->assertEquals(1200.00, round($sumAfa, 2), 'April: Summe = Basis');
// ── Oktober-Kauf (Monat 10): 3 Monate erstes Jahr, 9 Monate letztes Jahr ──
$rows = AssetDepreciation::calculate([
'anschaffungskosten' => 1200.00,
'zugaenge' => 0,
'abgaenge' => 0,
'nutzungsdauer' => 2,
'cent_im_ersten_jahr'=> false,
'anschaffungsdatum' => '2023-10-15',
]);
$this->assertEquals(3, count($rows), 'Oktober-Kauf 2 Jahre: 3 Zeilen');
$this->assertEquals(150.00, $rows[0]['abschreibungsbetrag'], 'Oktober: erstes Jahr 3/12 = 150,00');
$this->assertEquals(600.00, $rows[1]['abschreibungsbetrag'], 'Oktober: Jahr 2 voll = 600,00');
$this->assertEquals(450.00, $rows[2]['abschreibungsbetrag'], 'Oktober: letztes Jahr 9/12 = 450,00');
$this->assertEquals(0.00, $rows[2]['restwert'], 'Oktober: Restwert = 0');
// ── Januar-Kauf (Monat 1): 12 Monate = kein extra letztes Jahr ──
$rows = AssetDepreciation::calculate([
'anschaffungskosten' => 1200.00,
'zugaenge' => 0,
'abgaenge' => 0,
'nutzungsdauer' => 3,
'cent_im_ersten_jahr'=> false,
'anschaffungsdatum' => '2024-01-10',
]);
$this->assertEquals(3, count($rows), 'Januar-Kauf: weiterhin exakt nutzungsdauer Zeilen');
$sumAfa = array_sum(array_column($rows, 'abschreibungsbetrag'));
$this->assertEquals(1200.00, round($sumAfa, 2), 'Januar: Summe = Basis');
// ── April-Kauf mit Cent-Option ───────────────────────────────────────────
// basis=1001.40, nutzungsdauer=3, April
// regelJahr=floor(333.8)=333, centRest=1001.40-999=2.40
// erstesJahr = round(333*9/12,2) + 2.40 = 249.75 + 2.40 = 252.15
// Jahr 2+3: 333 (volle Euro)
// letztes Jahr: 1001.40 - 252.15 - 333 - 333 = 83.25
$rows = AssetDepreciation::calculate([
'anschaffungskosten' => 1001.40,
'zugaenge' => 0,
'abgaenge' => 0,
'nutzungsdauer' => 3,
'cent_im_ersten_jahr'=> true,
'anschaffungsdatum' => '2024-04-01',
]);
$this->assertEquals(4, count($rows), 'April Cent-Option 3 Jahre: 4 Zeilen');
$this->assertEquals(252.15, $rows[0]['abschreibungsbetrag'], 'April Cent: erstes Jahr 249,75 + 2,40 Cent = 252,15');
$this->assertEquals(333.00, $rows[1]['abschreibungsbetrag'], 'April Cent: Jahr 2 voll = 333,00 (volle Euro)');
$this->assertEquals(333.00, $rows[2]['abschreibungsbetrag'], 'April Cent: Jahr 3 voll = 333,00 (volle Euro)');
$this->assertEquals(83.25, $rows[3]['abschreibungsbetrag'], 'April Cent: letztes Jahr 3/12 von 333 = 83,25');
$sumAfa = array_sum(array_column($rows, 'abschreibungsbetrag'));
$this->assertEquals(1001.40, round($sumAfa, 2), 'April Cent: Summe = Basis');
// ── Dezember-Kauf (Monat 12): 1 Monat erstes Jahr, 11 Monate letztes Jahr ──
$rows = AssetDepreciation::calculate([
'anschaffungskosten' => 1200.00,
'zugaenge' => 0,
'abgaenge' => 0,
'nutzungsdauer' => 3,
'cent_im_ersten_jahr'=> false,
'anschaffungsdatum' => '2024-12-01',
]);
$this->assertEquals(4, count($rows), 'Dezember-Kauf 3 Jahre: 4 Zeilen');
$this->assertEquals(round(400 * 1 / 12, 2), $rows[0]['abschreibungsbetrag'], 'Dezember: erstes Jahr 1/12');
$this->assertEquals(0.00, $rows[3]['restwert'], 'Dezember: Restwert am Ende = 0');
$sumAfa = array_sum(array_column($rows, 'abschreibungsbetrag'));
$this->assertEquals(1200.00, round($sumAfa, 2), 'Dezember: Summe = Basis');
// ── Startjahr des letzten Jahres korrekt ────────────────────────────────
$rows = AssetDepreciation::calculate([
'anschaffungskosten' => 600.00,
'zugaenge' => 0,
'abgaenge' => 0,
'nutzungsdauer' => 2,
'cent_im_ersten_jahr'=> false,
'anschaffungsdatum' => '2023-07-01',
]);
// Juli = 6 Monate erstes Jahr, 6 Monate letztes Jahr → 3 Zeilen
$this->assertEquals(3, count($rows), 'Juli-Kauf 2 Jahre: 3 Zeilen');
$this->assertEquals(2023, $rows[0]['jahr'], 'Startjahr erste Zeile = 2023');
$this->assertEquals(2024, $rows[1]['jahr'], 'Startjahr zweite Zeile = 2024');
$this->assertEquals(2025, $rows[2]['jahr'], 'Startjahr letzte Zeile = 2025');
}
}