a scoring model

This commit is contained in:
Paul Schneider 2026-05-24 19:35:35 +01:00
commit 8a46341755
17 changed files with 832 additions and 3 deletions

View file

@ -0,0 +1,32 @@
// Yavsc.ViewModels.Kyc/DeclarationInputModel.cs
namespace Yavsc.ViewModels.Kyc
{
using System.ComponentModel.DataAnnotations;
using Yavsc.Models.Kyc;
public class DeclarationInputModel
{
/// <summary>
/// Email du sujet — transformé en token immédiatement, jamais persisté.
/// Obligatoire si ExternalToken absent.
/// </summary>
[EmailAddress]
public string SubjectEmail { get; set; }
/// <summary>
/// Token fourni par un tiers de confiance.
/// Prioritaire sur SubjectEmail si présent.
/// </summary>
public string ExternalToken { get; set; }
[Required, MinLength(10), MaxLength(2000)]
public string Content { get; set; }
[Required]
public DeclarationSentiment Sentiment { get; set; }
// Validation croisée : l'un ou l'autre obligatoire
public bool IsValid => !string.IsNullOrEmpty(SubjectEmail)
|| !string.IsNullOrEmpty(ExternalToken);
}
}

View file

@ -0,0 +1,17 @@
// Yavsc.ViewModels.Kyc/ModerationDecisionModel.cs
namespace Yavsc.ViewModels.Kyc
{
using System.ComponentModel.DataAnnotations;
public class ModerationDecisionModel
{
[Required]
public long DeclarationId { get; set; }
/// <summary>
/// Entre -10 et +10. Ignoré pour Reject.
/// </summary>
[Range(-10, 10)]
public int ScoreDelta { get; set; }
}
}

View file

@ -0,0 +1,40 @@
// Yavsc.ViewModels.Kyc/ModerationQueueItem.cs
namespace Yavsc.ViewModels.Kyc
{
using System.Collections.Generic;
using Yavsc.Models.Kyc;
/// <summary>
/// Ce que le modérateur voit dans sa queue.
/// Toujours pseudonymisé — jamais d'identité réelle.
/// </summary>
public class ModerationQueueItem
{
public long DeclarationId { get; set; }
/// <summary>
/// Les 8 premiers caractères du TokenHash + "…"
/// Suffisant pour distinguer les sujets en queue,
/// insuffisant pour identifier quoi que ce soit.
/// </summary>
public string SubjectTokenHash { get; set; }
public string Content { get; set; }
public DeclarationSentiment Sentiment { get; set; }
public ModerationStatus Status { get; set; }
/// <summary>
/// Descriptions des patterns regex qui ont matché.
/// Pas les excerpts — le modérateur voit le texte complet de toute façon.
/// </summary>
public List<string> FlagDescriptions { get; set; } = new();
/// <summary>
/// True si au moins un pattern Blocking a matché —
/// permet un affichage prioritaire dans l'UI.
/// </summary>
public bool HasBlockingFlag { get; set; }
}
}

View file

@ -0,0 +1,13 @@
// Yavsc.ViewModels.Kyc/ScoreQueryModel.cs
namespace Yavsc.ViewModels.Kyc
{
using System.ComponentModel.DataAnnotations;
public class ScoreQueryModel
{
[EmailAddress]
public string SubjectEmail { get; set; }
public string ExternalToken { get; set; }
}
}

View file

@ -0,0 +1,16 @@
// Yavsc.ViewModels.Kyc/TrustScoreView.cs
namespace Yavsc.ViewModels.Kyc
{
/// <summary>
/// Ce que le CONSULTANT voit. Jamais d'identité, jamais de détail de déclaration.
/// </summary>
public class TrustScoreView
{
public int Score { get; set; } // ex: 0100
public string Category { get; set; } // "Fiable" / "Prudence" / "Risque"
public int DeclarationCount { get; set; } // combien de déclarations agrégées
public DateTime LastUpdated { get; set; }
}
}