- 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>
99 lines
3.9 KiB
PHP
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());
|
|
}
|
|
}
|