using MaBibli.Shared.Textes; namespace MaBibli.Shared.Entites; /// /// Un livre du catalogue. La bibliothèque est commune à tous les utilisateurs. /// public class Livre { public int Id { get; set; } /// ISBN tel que saisi ou scanné (EAN-13 le plus souvent). Peut être absent. public string? Isbn { get; set; } public string Titre { get; set; } = string.Empty; /// /// Titre en minuscules et sans accents, recalculé à chaque écriture. /// /// /// SQLite ne sait pas comparer sans tenir compte des accents : sans cette colonne, /// « Bete » ne trouverait pas « La Bête humaine ». /// public string TitreNormalise { get; set; } = string.Empty; public string? Editeur { get; set; } public Format Format { get; set; } /// /// Roman, bande dessinée… Indépendant du format : une BD numérique existe. /// /// /// Par défaut , qui ne veut pas dire « roman » : voir /// l'énumération. L'interface n'affiche donc une étiquette que lorsque le type a été /// choisi, comme elle n'affiche le format que pour les ebooks. /// public TypeDocument TypeDocument { get; set; } /// /// Nombre de pages, facultatif. /// /// /// ⚠️ null et non 0 : aucun livre déjà catalogué ne porte cette information, /// et « 0 page » se lirait comme une donnée alors que c'est une absence. Même famille de /// piège que , dont le défaut ne prétend rien. /// /// Il peut être proposé par la BnF (dc:format : « 1 vol. (349 p.) »), mais il reste /// modifiable et n'est jamais imposé. Rien n'est déduit pour un ebook, dont la /// pagination dépend de la police. /// /// public int? NombrePages { get; set; } /// URL de la couverture (OpenLibrary), pas de fichier stocké localement. public string? CoverUrl { get; set; } /// URL de la notice bibliographique qui a servi à préremplir la fiche. public string? UrlNotice { get; set; } public DateTime DateAjout { get; set; } /// /// YNH_USER de la personne qui a saisi le livre. /// Traçabilité uniquement : ne JAMAIS filtrer les lectures sur ce champ. /// 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. /// public string? AjoutePar { get; set; } /// Auteurs du livre, ordonnés par . public List Auteurs { get; set; } = []; /// /// Thèmes du livre. Ils décrivent l'œuvre et sont donc communs au foyer, contrairement aux /// statuts de lecture et aux envies. /// public List Themes { get; set; } = []; /// /// Statuts de lecture, un par personne et seulement pour celles qui en ont posé un. /// /// /// ⚠️ Il n'y a volontairement aucune propriété Statut sur cette classe : elle /// serait commune à tout le foyer, exactement le défaut que cette table corrige. /// public List Statuts { get; set; } = []; /// Historique complet des prêts de ce livre (pas seulement le prêt en cours). public List Prets { get; set; } = []; public void RecalculerFormes() { Titre = Titre.Trim(); TitreNormalise = NormalisationTexte.Normaliser(Titre); } }