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>
41 lines
1.3 KiB
C#
41 lines
1.3 KiB
C#
namespace GerbilManagerWebAPI.Dtos
|
|
{
|
|
// FEAT-13: Abgabeverträge + Zuchtprofil (eigene Datei, hält ApiDtos.cs konfliktfrei).
|
|
|
|
public record SaleContractDto(
|
|
Guid Id,
|
|
Guid ContactId,
|
|
decimal Price,
|
|
DateOnly HandoverDate,
|
|
DateOnly ContractDate,
|
|
string FileName,
|
|
DateTimeOffset CreatedAt,
|
|
IReadOnlyList<Guid> GerbilIds,
|
|
// Download-URL der .docx ("/contracts/{id}/file").
|
|
string Url,
|
|
// True, wenn die .docx im Vertrags-Dateiroot existiert. Importierte
|
|
// Verträge haben KEINE Datei (Word-Download 404) -> Frontend blendet den
|
|
// Word-Button aus; das PDF wird ohnehin aus den Daten neu erzeugt.
|
|
bool HasFile);
|
|
|
|
public record SaleContractInput(
|
|
Guid ContactId,
|
|
List<Guid> GerbilIds,
|
|
decimal Price,
|
|
DateOnly HandoverDate,
|
|
DateOnly? ContractDate,
|
|
// Optionales Tierfoto je Tier (GerbilId -> GerbilPhoto-Id) fürs Vertragsbild.
|
|
Dictionary<Guid, Guid>? AnimalPhotos = null);
|
|
|
|
/// <summary>Zuchtprofil — Antwort UND Request-Body von /settings/breeder-profile.</summary>
|
|
public record BreederProfileDto(
|
|
string ZuchtName,
|
|
string Name,
|
|
string Address,
|
|
string Phone,
|
|
string Email,
|
|
string Homepage,
|
|
string City,
|
|
string NameSuffix);
|
|
}
|