Cataloguer les revues : une fiche, ses numéros à l'intérieur
Clôt la décision du premier lot, qui écartait les périodiques faute de modèle. Douze numéros d'un magazine ne font plus douze fiches identiques. Table à part, pour la troisième fois et pour le même motif que la liste d'envies et les séries : logée dans Livres, une revue entrerait dans le catalogue, ses compteurs, les doublons et les bibliographies, et il faudrait écrire « et qui n'est pas une revue » à chaque lecture. Un numéro est recensé, rien de plus — ni prêt ni statut, tous deux liés à Livre par clé étrangère. Réversible. « Créer ou retrouver » et non « créer » : scanner le numéro suivant du même magazine retombe forcément sur la même revue. L'unicité de l'ISSN est un index partiel, sans quoi les revues sans ISSN se bloqueraient entre elles. Le flux 977 mène désormais à la fiche de la revue, et ne pré-remplit plus le formulaire d'un livre. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -86,6 +86,20 @@
|
||||
@if (_messagePeriodique is not null)
|
||||
{
|
||||
<p class="message-avertissement" role="status">@_messagePeriodique</p>
|
||||
|
||||
@* Une revue a désormais sa place : sa fiche, où l'on ajoute le numéro qu'on vient de
|
||||
scanner. Avant, ce code retombait sur la saisie manuelle d'un LIVRE — ce qu'un magazine
|
||||
n'est pas. *@
|
||||
@if (_periodique is not null)
|
||||
{
|
||||
<div class="actions-formulaire">
|
||||
<button type="button" class="bouton bouton-principal"
|
||||
disabled="@(_enregistrement || !Reseau.EnLigne)" title="@MotifBlocage"
|
||||
@onclick="OuvrirLaRevueAsync">
|
||||
@(_enregistrement ? "Ouverture…" : "Ouvrir la fiche de cette revue")
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
@foreach (var avertissement in _avertissements)
|
||||
@@ -183,6 +197,7 @@
|
||||
private bool _focusAFaire = true;
|
||||
|
||||
private string? _messagePeriodique;
|
||||
private PeriodiqueDetecte? _periodique;
|
||||
private bool _chargement;
|
||||
private bool _enregistrement;
|
||||
private string? _erreur;
|
||||
@@ -232,6 +247,7 @@
|
||||
{
|
||||
_erreur = null;
|
||||
_messagePeriodique = null;
|
||||
_periodique = null;
|
||||
_avertissements = [];
|
||||
_etape = Etape.Scan;
|
||||
}
|
||||
@@ -258,6 +274,7 @@
|
||||
_chargement = true;
|
||||
_erreur = null;
|
||||
_messagePeriodique = null;
|
||||
_periodique = null;
|
||||
_avertissements = [];
|
||||
_etape = Etape.Recherche;
|
||||
|
||||
@@ -314,33 +331,69 @@
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dit ce qu'est le code scanné, puis bascule sur la saisie manuelle.
|
||||
/// Dit ce qu'est le code scanné, et propose la fiche de revue correspondante.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// MaBibli ne gère pas les périodiques : ni numéro, ni date de parution. Le titre est
|
||||
/// pré-rempli, mais <b>pas l'ISBN</b> — le code-barres d'une revue n'en est pas un, et le
|
||||
/// ranger dans <c>Livre.Isbn</c> ferait échouer tout lookup ultérieur sur cette fiche.
|
||||
/// ⚠️ <b>Ne remplit surtout pas le formulaire d'un livre</b>, ce qu'il faisait tant que les
|
||||
/// revues n'avaient pas de modèle : un magazine n'est pas un livre, et ranger un code
|
||||
/// <c>977</c> dans <c>Livre.Isbn</c> ferait échouer tout lookup ultérieur sur la fiche.
|
||||
/// <para>
|
||||
/// Le <b>numéro</b> se saisit ensuite à la main : les deux chiffres de parution du
|
||||
/// code-barres ne sont pas un numéro fiable, et l'add-on EAN-2 qui le porterait vraiment
|
||||
/// n'a pas pu être vérifié sur un magazine réel.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
private void DecrireLeMagazine(PeriodiqueDetecte revue)
|
||||
{
|
||||
var nom = revue.Titre is null ? "un magazine" : $"le magazine « {revue.Titre} »";
|
||||
|
||||
_periodique = revue;
|
||||
_messagePeriodique =
|
||||
$"Ce code-barres désigne {nom} (ISSN {revue.Issn}), pas un livre : "
|
||||
+ "il commence par 977, réservé aux publications en série. "
|
||||
+ "MaBibli ne gère pas les revues — vous pouvez tout de même créer une fiche à la main, "
|
||||
+ "sans ISBN.";
|
||||
|
||||
_saisie = new EnregistrementLivre
|
||||
{
|
||||
Titre = revue.Titre ?? string.Empty,
|
||||
Editeur = revue.Editeur,
|
||||
Format = Format.Physique,
|
||||
Statut = Statut.ALire,
|
||||
};
|
||||
+ "Ouvrez sa fiche pour y ajouter le numéro que vous venez de scanner.";
|
||||
|
||||
_erreur = null;
|
||||
_etape = Etape.Formulaire;
|
||||
RevenirALaSaisie();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ouvre la fiche de la revue scannée, en la créant si elle n'existe pas encore.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Le serveur fait « créer ou retrouver » : scanner le numéro suivant du même magazine
|
||||
/// retombe sur la même fiche, ce qui est exactement le geste attendu.
|
||||
/// <para>
|
||||
/// Sans titre connu de la BnF, on n'invente rien : l'ISSN sert de nom provisoire, que
|
||||
/// l'utilisateur corrigera sur la fiche.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
private async Task OuvrirLaRevueAsync()
|
||||
{
|
||||
if (_periodique is not { } revue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_enregistrement = true;
|
||||
_erreur = null;
|
||||
|
||||
var resultat = await Api.CreerRevueAsync(new EnregistrementRevue
|
||||
{
|
||||
Titre = revue.Titre ?? $"Revue ISSN {revue.Issn}",
|
||||
Issn = revue.Issn,
|
||||
Editeur = revue.Editeur,
|
||||
});
|
||||
|
||||
_enregistrement = false;
|
||||
|
||||
if (!resultat.EstOk)
|
||||
{
|
||||
_erreur = resultat.Erreur;
|
||||
return;
|
||||
}
|
||||
|
||||
Navigation.NavigateTo($"revues/{resultat.Valeur!.Id}");
|
||||
}
|
||||
|
||||
/// <summary>Ramène l'écran à la saisie, champ ISBN de nouveau actif pour la douchette.</summary>
|
||||
@@ -371,6 +424,7 @@
|
||||
{
|
||||
_erreur = null;
|
||||
_messagePeriodique = null;
|
||||
_periodique = null;
|
||||
_erreurFormulaire = null;
|
||||
_doublons = null;
|
||||
_candidats = [];
|
||||
|
||||
Reference in New Issue
Block a user