Merge feature/feat-13: Abgabevertrag phase B — SaleContract+wizard, /einstellungen Zuchtprofil, contract endpoints w/ transactional Abgabe, Kontakt structured fields [god-QA: 40/40+47/47+e2e 56/56]
# Conflicts: # GerbilManager.Tests/GerbilManager.Tests.csproj # GerbilManagerWebAPI/Program.cs
This commit is contained in:
36
GerbilManagerWebAPI/Models/BreederSettings.cs
Normal file
36
GerbilManagerWebAPI/Models/BreederSettings.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace GerbilManagerWebAPI.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Zuchtprofil (Verkäufer-Block der Abgabeverträge) — Einzelzeilen-Entity
|
||||
/// (Singleton, fixe Id, leer geseedet). Die Züchterin pflegt ihre Daten in
|
||||
/// der App unter /einstellungen statt in einer JSON-Datei; FEAT-13 phase B
|
||||
/// ersetzt damit die appsettings-Variante aus phase A.
|
||||
/// </summary>
|
||||
public class BreederSettings
|
||||
{
|
||||
/// <summary>Fixe Id der einzigen Zeile (per HasData geseedet).</summary>
|
||||
public static readonly Guid SingletonId = new("11111111-1111-1111-1111-000000000001");
|
||||
|
||||
[Key]
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public string ZuchtName { get; set; } = "";
|
||||
|
||||
/// <summary>Vor- und Nachname inkl. Anrede, z. B. „Frau Erika Muster“.</summary>
|
||||
public string Name { get; set; } = "";
|
||||
|
||||
/// <summary>Anschrift einzeilig: „Straße Nr, PLZ Ort“.</summary>
|
||||
public string Address { get; set; } = "";
|
||||
|
||||
public string Phone { get; set; } = "";
|
||||
|
||||
public string Email { get; set; } = "";
|
||||
|
||||
public string Homepage { get; set; } = "";
|
||||
|
||||
/// <summary>Ort für die Unterschriftszeile („{Ort}, den {Datum}“).</summary>
|
||||
public string City { get; set; } = "";
|
||||
}
|
||||
}
|
||||
45
GerbilManagerWebAPI/Models/SaleContract.cs
Normal file
45
GerbilManagerWebAPI/Models/SaleContract.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace GerbilManagerWebAPI.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Ein erzeugter Abgabevertrag (FEAT-13). Die .docx liegt wie die Fotos im
|
||||
/// Datei-Root (Contracts:RootPath bzw. contract-storage/), in der DB steht
|
||||
/// nur der Dateiname. Tiere hängen über <see cref="SaleContractAnimal"/>
|
||||
/// (Join-Entity statt uuid[]-Spalte: referenzielle Integrität, „Verträge
|
||||
/// eines Tieres“ bleibt abfragbar, und pro Tier-Zeile ist später Platz für
|
||||
/// Zusatzdaten wie den Einzelpreis).
|
||||
/// </summary>
|
||||
public class SaleContract
|
||||
{
|
||||
[Key]
|
||||
public Guid Id { get; set; }
|
||||
|
||||
/// <summary>Abnehmer (Käufer-Block des Vertrags).</summary>
|
||||
public Guid ContactId { get; set; }
|
||||
public Contact? Contact { get; set; }
|
||||
|
||||
/// <summary>Kaufpreis in Euro (gesamt).</summary>
|
||||
public decimal Price { get; set; }
|
||||
|
||||
public DateOnly HandoverDate { get; set; }
|
||||
|
||||
/// <summary>Datum der Unterschriftszeile (Standard: Übergabedatum).</summary>
|
||||
public DateOnly ContractDate { get; set; }
|
||||
|
||||
/// <summary>Dateiname der erzeugten .docx im Vertrags-Dateiroot.</summary>
|
||||
public required string FileName { get; set; }
|
||||
|
||||
public DateTimeOffset CreatedAt { get; set; }
|
||||
|
||||
public List<SaleContractAnimal> Animals { get; set; } = [];
|
||||
}
|
||||
|
||||
/// <summary>Join-Zeile Vertrag ↔ Tier (zusammengesetzter Schlüssel).</summary>
|
||||
public class SaleContractAnimal
|
||||
{
|
||||
public Guid SaleContractId { get; set; }
|
||||
public Guid GerbilId { get; set; }
|
||||
public Gerbil? Gerbil { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user