feat(warteliste): Nachfrage/Warteliste für Interessenten

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 22:43:18 +02:00
parent 5e14124322
commit d25d2ee152
17 changed files with 2724 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
using System.ComponentModel.DataAnnotations;
namespace GerbilManagerWebAPI.Models
{
/// <summary>
/// WAITLIST (RennmausPro nachfrage_tb): a prospective buyer's standing request for a
/// future animal with wish criteria (colour, gender). Decoupled from the rest of the
/// model on purpose — ContactId is a plain nullable Guid column (NOT an enforced
/// foreign key), so the import re-ingest wipe (IngestResolvedService) can delete and
/// recreate contacts without deleting or breaking waiting-list rows. The captured
/// ContactName keeps the entry human-readable even when no contact exists yet (or the
/// referenced contact is gone). Same survives-the-wipe pattern as Feedback.
/// </summary>
public class WaitingListEntry
{
[Key]
public Guid Id { get; set; }
/// <summary>Loose reference (no FK) to the interested contact, if one exists.</summary>
public Guid? ContactId { get; set; }
/// <summary>Free-text name of the interested party (used when no contact is linked).</summary>
public string? ContactName { get; set; }
/// <summary>Wished-for colour variety (free text / catalog name), if any.</summary>
public string? WishColor { get; set; }
/// <summary>Wished-for gender: "male" | "female" | null (no preference).</summary>
public string? WishGender { get; set; }
/// <summary>When the request was made.</summary>
public DateTime? RequestedAt { get; set; }
/// <summary>Workflow status: "offen" | "erfuellt" | "storniert".</summary>
public required string Status { get; set; }
/// <summary>Optional free-text note.</summary>
public string? Note { get; set; }
/// <summary>Server-side creation time.</summary>
public DateTimeOffset CreatedAt { get; set; }
}
}