Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts, scan de code-barres, consultation hors-ligne. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
98 lines
3.8 KiB
C#
98 lines
3.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>
|
|
/// Nombre de pages, <b>facultatif</b>.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// ⚠️ <c>null</c> et non <c>0</c> : 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 <see cref="TypeDocument.NonPrecise"/>, dont le défaut ne prétend rien.
|
|
/// <para>
|
|
/// Il peut être proposé par la BnF (<c>dc:format</c> : « 1 vol. (349 p.) »), mais il reste
|
|
/// <b>modifiable</b> et n'est jamais imposé. Rien n'est déduit pour un ebook, dont la
|
|
/// pagination dépend de la police.
|
|
/// </para>
|
|
/// </remarks>
|
|
public int? NombrePages { get; set; }
|
|
|
|
/// <summary>URL de la couverture (OpenLibrary), pas de fichier stocké localement.</summary>
|
|
public string? CoverUrl { get; set; }
|
|
|
|
/// <summary>URL de la notice bibliographique qui a servi à préremplir la fiche.</summary>
|
|
public string? UrlNotice { 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>
|
|
/// Thèmes du livre. Ils décrivent l'œuvre et sont donc communs au foyer, contrairement aux
|
|
/// statuts de lecture et aux envies.
|
|
/// </summary>
|
|
public List<LivreTheme> Themes { 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);
|
|
}
|
|
}
|