Die ~1095 geparsten Verträge werden jetzt als echte SaleContract-Records erzeugt, sodass die Verträge-Seite gefüllt ist (statt 0). enrich_from_contracts() liefert zusätzlich eine saleContracts-Liste (deterministische Id aus Dateiname, Käufer- ContactId, Preis, Abgabe-/Vertragsdatum, FileName, gematchte Tier-Ids); main() schreibt sie als Top-Level-Key in resolved_import.json. IngestResolvedService legt SaleContract + SaleContractAnimal an (FK-sicher nach Kontakten/Tieren, unbekannte Links übersprungen) — Tabelle wird wie gehabt gewischt und aus dem Payload neu befüllt (idempotent). Ergebnis: 1033 Verträge (611 mit ≥1 Tier, alle datiert; 54 Dateinamen-Dubletten zusammengefasst, 7 datumlose + 1 ohne Käufer übersprungen). Kein Schema-Change (datumlose übersprungen statt Spalten nullable → keine Migration). DOCX-Download: importierte Verträge haben keine Word-Datei im contract-storage → DTO.HasFile=false, Frontend blendet den Word-Button aus (Hinweis „Keine Word- Datei"), PDF wird weiterhin generiert. Download-Endpoint liefert sauber 404 statt 500 bei fehlender Datei. Tests: dotnet 213, vitest 129, playwright 16 (neuer vertraege.spec.ts), Python grün. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
1.4 KiB
TypeScript
34 lines
1.4 KiB
TypeScript
/**
|
|
* FEAT-Contracts: Verträge-Liste (/vertraege) zeigt importierte Abgabeverträge.
|
|
*
|
|
* Der Mock-Seed enthält EINEN importierten Vertrag (hasFile:false). Wir prüfen,
|
|
* dass er gerendert wird (Abnehmer, Preis, Datum, Tieranzahl) und dass der
|
|
* Word-Download-Button für ihn ausgeblendet ist (kein .docx), während der
|
|
* PDF-Button (aus den Daten neu erzeugt) sichtbar bleibt.
|
|
*/
|
|
import { de, expect, gotoSection, skipUnlessMock, test } from './fixtures'
|
|
|
|
const t = de.pages.vertraege
|
|
|
|
test.describe('Verträge-Liste', () => {
|
|
test('importierter Vertrag wird gelistet; Word-Button ausgeblendet, PDF bleibt', async ({
|
|
page,
|
|
}) => {
|
|
skipUnlessMock()
|
|
await gotoSection(page, de.nav.contracts)
|
|
await expect(page.getByRole('heading', { name: t.title, exact: true })).toBeVisible()
|
|
|
|
const card = page.locator('.vertrag-card').filter({ hasText: 'Zoohandlung Meier' })
|
|
await expect(card).toBeVisible()
|
|
// Tieranzahl + Preis + Übergabedatum erscheinen in der Meta-Zeile.
|
|
await expect(card).toContainText(t.animalsCount(1))
|
|
await expect(card).toContainText('30,00 €')
|
|
await expect(card).toContainText('29.09.2023')
|
|
|
|
// PDF-Button vorhanden, Word-Button NICHT (importiert, keine Datei).
|
|
await expect(card.getByRole('link', { name: t.downloadPdf })).toBeVisible()
|
|
await expect(card.getByRole('link', { name: t.download, exact: true })).toHaveCount(0)
|
|
await expect(card.getByText(t.noWordFileShort)).toBeVisible()
|
|
})
|
|
})
|