Format disait physique ou numérique, jamais roman ou BD. Trois valeurs seulement : une valeur s'ajoute sans migration, la renommer une fois posée sur des centaines de fiches, non. Le défaut est « non précisé », pas « roman » : les fiches existantes n'ont pas été saisies avec cette question en tête, et un AddColumn suffit justement parce que la valeur par défaut ne prétend rien. L'interface n'affiche donc que ce qui a été choisi, comme pour le format. Filtre ajouté aux DEUX implémentations, serveur et hors-ligne, avec quatre jeux de critères de plus dans le test qui les confronte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
74 lines
2.8 KiB
C#
74 lines
2.8 KiB
C#
using MaBibli.Shared.Textes;
|
|
|
|
namespace MaBibli.Shared.Entites;
|
|
|
|
/// <summary>
|
|
/// Un livre du catalogue. La bibliothèque est <b>commune</b> à tous les utilisateurs.
|
|
/// </summary>
|
|
public class Livre
|
|
{
|
|
public int Id { get; set; }
|
|
|
|
/// <summary>ISBN tel que saisi ou scanné (EAN-13 le plus souvent). Peut être absent.</summary>
|
|
public string? Isbn { get; set; }
|
|
|
|
public string Titre { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Titre en minuscules et sans accents, recalculé à chaque écriture.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// SQLite ne sait pas comparer sans tenir compte des accents : sans cette colonne,
|
|
/// « Bete » ne trouverait pas « La Bête humaine ».
|
|
/// </remarks>
|
|
public string TitreNormalise { get; set; } = string.Empty;
|
|
|
|
public string? Editeur { get; set; }
|
|
|
|
public Format Format { get; set; }
|
|
|
|
/// <summary>
|
|
/// Roman, bande dessinée… <b>Indépendant du format</b> : une BD numérique existe.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Par défaut <see cref="TypeDocument.NonPrecise"/>, qui ne veut pas dire « roman » : voir
|
|
/// l'énumération. L'interface n'affiche donc une étiquette que lorsque le type a été
|
|
/// <b>choisi</b>, comme elle n'affiche le format que pour les ebooks.
|
|
/// </remarks>
|
|
public TypeDocument TypeDocument { get; set; }
|
|
|
|
/// <summary>URL de la couverture (OpenLibrary), pas de fichier stocké localement.</summary>
|
|
public string? CoverUrl { get; set; }
|
|
|
|
public DateTime DateAjout { get; set; }
|
|
|
|
/// <summary>
|
|
/// <c>YNH_USER</c> de la personne qui a saisi le livre.
|
|
/// <b>Traçabilité uniquement : ne JAMAIS filtrer les lectures sur ce champ.</b>
|
|
/// La bibliothèque est commune ; ce champ existe pour savoir qui a ajouté quoi,
|
|
/// et pour permettre un cloisonnement ultérieur sans migration de schéma.
|
|
/// </summary>
|
|
public string? AjoutePar { get; set; }
|
|
|
|
/// <summary>Auteurs du livre, ordonnés par <see cref="LivreAuteur.Position"/>.</summary>
|
|
public List<LivreAuteur> Auteurs { get; set; } = [];
|
|
|
|
/// <summary>
|
|
/// Statuts de lecture, <b>un par personne</b> et seulement pour celles qui en ont posé un.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// ⚠️ Il n'y a volontairement <b>aucune</b> propriété <c>Statut</c> sur cette classe : elle
|
|
/// serait commune à tout le foyer, exactement le défaut que cette table corrige.
|
|
/// </remarks>
|
|
public List<StatutLecture> Statuts { get; set; } = [];
|
|
|
|
/// <summary>Historique complet des prêts de ce livre (pas seulement le prêt en cours).</summary>
|
|
public List<Pret> Prets { get; set; } = [];
|
|
|
|
public void RecalculerFormes()
|
|
{
|
|
Titre = Titre.Trim();
|
|
TitreNormalise = NormalisationTexte.Normaliser(Titre);
|
|
}
|
|
}
|