Files
BauIN/tests/Feature/Datenmodell/BeziehungenTest.php
T
ChristophandClaude Opus 5.5 6aac8b0a16 Datenmodell Kern: Projekt, PFA, Vertrag, LV, Nachtrag, Dokument
- Mandant, Auftragnehmer, Projekt mit Suchreihenfolge, Abschnitt (PFA), Vertrag,
  Leistungsverzeichnis, Nachtrag (MKA nur als Bezug), Nachtragsposition, Dokument
- Projektmitglieder mit Projektrolle, Freigaben für vertrauliche Dokumente
- Mandant, Land und Projekt werden vom übergeordneten Datensatz übernommen;
  Fehlzuordnungen über Mandanten oder Projekte hinweg werden abgewiesen
- Feste Morph-Map, Factories, Demodaten (Musterbahn, PFA 1–4, N14/N16/N21), Tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 08:34:24 +02:00

99 lines
3.9 KiB
PHP

<?php
namespace Tests\Feature\Datenmodell;
use App\Enums\DokumentKategorie;
use App\Enums\NachtragStatus;
use App\Enums\Projektrolle;
use App\Models\Abschnitt;
use App\Models\Auftragnehmer;
use App\Models\Dokument;
use App\Models\Nachtrag;
use App\Models\Nachtragsposition;
use App\Models\Projekt;
use App\Models\User;
use App\Models\Vertrag;
use Illuminate\Database\QueryException;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class BeziehungenTest extends TestCase
{
use RefreshDatabase;
public function test_auftragnehmer_kann_in_mehreren_abschnitten_vertraege_haben(): void
{
$projekt = Projekt::factory()->create();
$auftragnehmer = Auftragnehmer::factory()->create(['mandant_id' => $projekt->mandant_id]);
[$pfa3, $pfa4] = Abschnitt::factory()->count(2)->create(['projekt_id' => $projekt->id]);
Vertrag::factory()->create(['abschnitt_id' => $pfa3->id, 'auftragnehmer_id' => $auftragnehmer->id]);
Vertrag::factory()->create(['abschnitt_id' => $pfa4->id, 'auftragnehmer_id' => $auftragnehmer->id]);
$this->assertEqualsCanonicalizing(
[$pfa3->id, $pfa4->id],
$auftragnehmer->vertraege()->pluck('abschnitt_id')->all(),
);
$this->assertSame(2, $projekt->vertraege()->count());
}
public function test_nachtrag_hat_mka_bezug_status_und_positionen_in_reihenfolge(): void
{
$nachtrag = Nachtrag::factory()->create(['mka_bezug' => ['MKA 131', 'MKA 133']]);
Nachtragsposition::factory()->create(['nachtrag_id' => $nachtrag->id, 'oz' => 'N1.0020', 'sortierung' => 2]);
Nachtragsposition::factory()->create(['nachtrag_id' => $nachtrag->id, 'oz' => 'N1.0010', 'sortierung' => 1]);
$nachtrag = $nachtrag->fresh();
$this->assertNotNull($nachtrag);
$this->assertSame(['MKA 131', 'MKA 133'], $nachtrag->mka_bezug);
$this->assertSame(NachtragStatus::Eingegangen, $nachtrag->status);
$this->assertSame(['N1.0010', 'N1.0020'], $nachtrag->positionen->pluck('oz')->all());
}
public function test_nachtragsnummer_ist_je_vertrag_eindeutig(): void
{
$vertrag = Vertrag::factory()->create();
Nachtrag::factory()->create(['vertrag_id' => $vertrag->id, 'nummer' => 'N14']);
$this->expectException(QueryException::class);
Nachtrag::factory()->create(['vertrag_id' => $vertrag->id, 'nummer' => 'N14']);
}
public function test_projektmitglieder_haben_eine_rolle(): void
{
$projekt = Projekt::factory()->create();
$leiterin = User::factory()->create();
$leser = User::factory()->create();
$aussenstehend = User::factory()->create();
$projekt->mitglieder()->attach($leiterin, ['rolle' => Projektrolle::Projektleiter->value]);
$projekt->mitglieder()->attach($leser, ['rolle' => Projektrolle::Leser->value]);
$this->assertSame(Projektrolle::Projektleiter, $projekt->rolleVon($leiterin));
$this->assertSame(Projektrolle::Leser, $projekt->rolleVon($leser));
$this->assertNull($projekt->rolleVon($aussenstehend));
$this->assertTrue($leiterin->projekte()->whereKey($projekt->id)->exists());
}
public function test_vertrauliches_dokument_hat_benannte_freigaben(): void
{
$nachtrag = Nachtrag::factory()->create();
$dokument = Dokument::factory()->zu($nachtrag, DokumentKategorie::Anlage)->vertraulich()->create();
$berechtigt = User::factory()->create();
$dokument->freigaben()->attach($berechtigt);
$this->assertTrue($dokument->vertraulich);
$this->assertSame([$berechtigt->id], $dokument->freigaben()->pluck('users.id')->all());
$this->assertSame(1, $nachtrag->dokumente()->count());
}
public function test_archiviertes_projekt_wird_erkannt(): void
{
$this->assertTrue(Projekt::factory()->archiviert()->create()->istArchiviert());
$this->assertFalse(Projekt::factory()->create()->istArchiviert());
}
}