Merge branch 'worktree-agent-a0e6f31173772c798'

# Conflicts:
#	GerbilManagerWebAPI/ApplicationContext.cs
#	GerbilManagerWebAPI/Program.cs
#	gerbil-manager-web/e2e/mock-data.ts
#	gerbil-manager-web/src/strings/de.ts
This commit is contained in:
2026-06-22 23:01:14 +02:00
17 changed files with 2723 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; }
}
}