Compare commits

..

4 commits

Author SHA1 Message Date
4e08081115 Documentation technique 2026-03-31 12:37:47 +02:00
bf03d509b0 Commentaires de code 2026-03-30 19:05:49 +02:00
6d175107ff Création des tests unitaires (à améliorer si j'ai le temps) 2026-03-30 16:34:52 +02:00
winkaeter
d3c26085e3
Merge pull request #9 from winkaeter/5-assurer-la-sécurité-la-qualité-et-intégrer-des-logs
5 assurer la sécurité la qualité et intégrer des logs
2026-03-30 15:31:56 +02:00
25 changed files with 1051 additions and 140 deletions

4
.gitignore vendored
View file

@ -360,4 +360,6 @@ MigrationBackup/
.ionide/ .ionide/
# Fody - auto-generated XML schema # Fody - auto-generated XML schema
FodyWeavers.xsd FodyWeavers.xsd
/docs/tools
/docs/phpdoc.dist.xml

View file

@ -24,6 +24,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\MediaTekDocuments.xml</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>

View file

@ -5,15 +5,30 @@ using System;
namespace MediaTekDocuments.controller namespace MediaTekDocuments.controller
{ {
/// <summary>
/// Contrôleur pour la fenêtre d'authentification
/// </summary>
class FrmAuthController class FrmAuthController
{ {
/// <summary>
/// Objet d'accès aux données
/// </summary>
private readonly Access access; private readonly Access access;
/// <summary>
/// Constructeur : récupère l'instance unique d'accès aux données
/// </summary>
public FrmAuthController() public FrmAuthController()
{ {
access = Access.GetInstance(); access = Access.GetInstance();
} }
/// <summary>
/// Vérifie les identifiants de connexion
/// </summary>
/// <param name="login">Identifiant de l'utilisateur</param>
/// <param name="pwd">Mot de passe de l'utilisateur</param>
/// <returns>Objet Utilisateur si connexion réussie, null sinon</returns>
public Utilisateur GetConnection(string login, string pwd) public Utilisateur GetConnection(string login, string pwd)
{ {
return access.GetConnection(login, pwd); return access.GetConnection(login, pwd);

View file

@ -98,46 +98,90 @@ namespace MediaTekDocuments.controller
return access.CreerExemplaire(exemplaire); return access.CreerExemplaire(exemplaire);
} }
/// <summary>
/// Récupère les commandes d'un document
/// </summary>
/// <param name="idDocument">Identifiant du document</param>
/// <returns>Liste des commandes du document</returns>
public List<CommandeDocument> GetCommandesDocument(string idDocument) public List<CommandeDocument> GetCommandesDocument(string idDocument)
{ {
return Access.GetInstance().GetCommandesDocument(idDocument); return Access.GetInstance().GetCommandesDocument(idDocument);
} }
/// <summary>
/// Supprime une commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerCommandeDocument(CommandeDocument commande) public bool SupprimerCommandeDocument(CommandeDocument commande)
{ {
return Access.GetInstance().DeleteCommande(commande.Id); return Access.GetInstance().DeleteCommande(commande.Id);
} }
/// <summary>
/// Récupère la liste des suivis
/// </summary>
/// <returns>Liste d'objets Categorie (suivi)</returns>
public List<Categorie> GetAllSuivis() public List<Categorie> GetAllSuivis()
{ {
return Access.GetInstance().GetAllSuivis(); return Access.GetInstance().GetAllSuivis();
} }
/// <summary>
/// Crée une nouvelle commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool createCommande(CommandeDocument commande) public bool createCommande(CommandeDocument commande)
{ {
return access.CreerCommande(commande); return access.CreerCommande(commande);
} }
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Identifiant de commande formaté</returns>
public string GetNextCommandeId() public string GetNextCommandeId()
{ {
return access.GetNextCommandeId(); return access.GetNextCommandeId();
} }
/// <summary>
/// Met à jour l'état de suivi d'une commande
/// </summary>
/// <param name="idCommande">Identifiant de la commande</param>
/// <param name="idSuivi">Identifiant du nouvel état de suivi</param>
/// <returns>True si la mise à jour a pu se faire</returns>
public bool UpdateSuiviCommande(string idCommande, string idSuivi) public bool UpdateSuiviCommande(string idCommande, string idSuivi)
{ {
return access.UpdateSuiviCommande(idCommande, idSuivi); return access.UpdateSuiviCommande(idCommande, idSuivi);
} }
/// <summary>
/// Récupère les abonnements d'une revue
/// </summary>
/// <param name="idRevue">Identifiant de la revue</param>
/// <returns>Liste des abonnements de la revue</returns>
public List<Abonnement> GetAbonnements(string idRevue) public List<Abonnement> GetAbonnements(string idRevue)
{ {
return access.GetAbonnements(idRevue); return access.GetAbonnements(idRevue);
} }
/// <summary>
/// Crée un nouvel abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerAbonnement(Abonnement abonnement) public bool CreerAbonnement(Abonnement abonnement)
{ {
return access.CreerAbonnement(abonnement); return access.CreerAbonnement(abonnement);
} }
/// <summary>
/// Supprime un abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerAbonnement(Abonnement abonnement) public bool SupprimerAbonnement(Abonnement abonnement)
{ {
return access.SupprimerAbonnement(abonnement.Id); return access.SupprimerAbonnement(abonnement.Id);

View file

@ -34,7 +34,8 @@ namespace MediaTekDocuments.dal
private const string POST = "POST"; private const string POST = "POST";
/// <summary> /// <summary>
/// méthode HTTP pour update /// méthode HTTP pour update
/// /// </summary>
private const string PUT = "PUT";
/// <summary> /// <summary>
/// méthode HTTP pour delete /// méthode HTTP pour delete
@ -68,6 +69,10 @@ namespace MediaTekDocuments.dal
} }
} }
/// <summary>
/// Création et retour de l'instance unique de la classe
/// </summary>
/// <returns>instance unique de la classe</returns>
public static Access GetInstance() public static Access GetInstance()
{ {
if (instance == null) if (instance == null)
@ -266,6 +271,11 @@ namespace MediaTekDocuments.dal
return lesCommandes; return lesCommandes;
} }
/// <summary>
/// Supprime une commande
/// </summary>
/// <param name="idCommande">ID de la commande à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool DeleteCommande(string idCommande) public bool DeleteCommande(string idCommande)
{ {
@ -282,12 +292,21 @@ namespace MediaTekDocuments.dal
} }
} }
/// <summary>
/// Récupère la liste des suivis
/// </summary>
/// <returns>Liste des suivis</returns>
public List<Categorie> GetAllSuivis() public List<Categorie> GetAllSuivis()
{ {
IEnumerable<Categorie> lesSuivis = TraitementRecup<Categorie>(GET, "suivi", null); IEnumerable<Categorie> lesSuivis = TraitementRecup<Categorie>(GET, "suivi", null);
return new List<Categorie>(lesSuivis); return new List<Categorie>(lesSuivis);
} }
/// <summary>
/// Crée une commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerCommande(CommandeDocument commande) public bool CreerCommande(CommandeDocument commande)
{ {
String jsonExemplaire = JsonConvert.SerializeObject(commande, new CustomDateTimeConverter()); String jsonExemplaire = JsonConvert.SerializeObject(commande, new CustomDateTimeConverter());
@ -303,6 +322,10 @@ namespace MediaTekDocuments.dal
return false; return false;
} }
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Prochain ID de commande au format string</returns>
public string GetNextCommandeId() public string GetNextCommandeId()
{ {
List<dynamic> result = TraitementRecup<dynamic>(GET, "maxcommande", null); List<dynamic> result = TraitementRecup<dynamic>(GET, "maxcommande", null);
@ -321,6 +344,13 @@ namespace MediaTekDocuments.dal
} }
return "0001"; return "0001";
} }
/// <summary>
/// Met à jour le suivi d'une commande
/// </summary>
/// <param name="idCommande">ID de la commande</param>
/// <param name="idSuivi">Nouvel ID de suivi</param>
/// <returns>True si la mise à jour a pu se faire</returns>
public bool UpdateSuiviCommande(string idCommande, string idSuivi) public bool UpdateSuiviCommande(string idCommande, string idSuivi)
{ {
String jsonSuivi = convertToJson("idSuivi", idSuivi); String jsonSuivi = convertToJson("idSuivi", idSuivi);
@ -337,12 +367,22 @@ namespace MediaTekDocuments.dal
} }
} }
/// <summary>
/// Récupère les abonnements d'une revue
/// </summary>
/// <param name="idRevue">ID de la revue</param>
/// <returns>Liste des abonnements</returns>
public List<Abonnement> GetAbonnements(string idRevue) public List<Abonnement> GetAbonnements(string idRevue)
{ {
string jsonIdRevue = convertToJson("id", idRevue); string jsonIdRevue = convertToJson("id", idRevue);
return TraitementRecup<Abonnement>(GET, "commanderevue/" + jsonIdRevue, null); return TraitementRecup<Abonnement>(GET, "commanderevue/" + jsonIdRevue, null);
} }
/// <summary>
/// Crée un abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerAbonnement(Abonnement abonnement) public bool CreerAbonnement(Abonnement abonnement)
{ {
string jsonAbonnement = JsonConvert.SerializeObject(abonnement, new CustomDateTimeConverter()); string jsonAbonnement = JsonConvert.SerializeObject(abonnement, new CustomDateTimeConverter());
@ -359,6 +399,11 @@ namespace MediaTekDocuments.dal
} }
} }
/// <summary>
/// Supprime un abonnement
/// </summary>
/// <param name="idAbonnement">ID de l'abonnement à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerAbonnement(string idAbonnement) public bool SupprimerAbonnement(string idAbonnement)
{ {
string jsonId = convertToJson("id", idAbonnement); string jsonId = convertToJson("id", idAbonnement);
@ -373,6 +418,12 @@ namespace MediaTekDocuments.dal
} }
} }
/// <summary>
/// Tente de connecter un utilisateur
/// </summary>
/// <param name="login">Login de l'utilisateur</param>
/// <param name="pwd">Mot de passe de l'utilisateur</param>
/// <returns>Objet Utilisateur si connecté, null sinon</returns>
public Utilisateur GetConnection(string login, string pwd) public Utilisateur GetConnection(string login, string pwd)
{ {
Dictionary<string, string> loginInfo = new Dictionary<string, string> Dictionary<string, string> loginInfo = new Dictionary<string, string>

View file

@ -43,7 +43,7 @@ namespace MediaTekDocuments.manager
/// </summary> /// </summary>
/// <param name="uriApi">adresse de l'api</param> /// <param name="uriApi">adresse de l'api</param>
/// <param name="authenticationString">chaîne d'authentificatio (login:pwd)</param> /// <param name="authenticationString">chaîne d'authentificatio (login:pwd)</param>
/// <returns></returns> /// <returns>Instance unique de la classe ApiRest</returns>
public static ApiRest GetInstance(String uriApi, String authenticationString) public static ApiRest GetInstance(String uriApi, String authenticationString)
{ {
if(instance == null) if(instance == null)

View file

@ -1,15 +1,41 @@
using System; using System;
namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary>
/// Classe métier Abonnement (contient les informations sur un abonnement à une revue)
/// </summary>
public class Abonnement public class Abonnement
{ {
/// <summary>
/// Obtient ou définit l'identifiant de l'abonnement
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; } public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de l'abonnement
/// </summary>
public double Montant { get; set; } public double Montant { get; set; }
/// <summary>
/// Obtient ou définit la date de fin de l'abonnement
/// </summary>
public DateTime DateFinAbonnement { get; set; } public DateTime DateFinAbonnement { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de la revue associée
/// </summary>
public string IdRevue { get; set; } public string IdRevue { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Abonnement"/>
/// </summary>
/// <param name="id">Identifiant de l'abonnement</param>
/// <param name="dateCommande">Date de la commande</param>
/// <param name="montant">Montant de l'abonnement</param>
/// <param name="dateFinAbonnement">Date de fin de l'abonnement</param>
/// <param name="idRevue">Identifiant de la revue associée</param>
public Abonnement(string id, DateTime dateCommande, double montant, DateTime dateFinAbonnement, string idRevue) public Abonnement(string id, DateTime dateCommande, double montant, DateTime dateFinAbonnement, string idRevue)
{ {
this.Id = id; this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Categorie public class Categorie
{ {
/// <summary>
/// Obtient l'identifiant de la catégorie
/// </summary>
public string Id { get; } public string Id { get; }
/// <summary>
/// Obtient le libellé de la catégorie
/// </summary>
public string Libelle { get; } public string Libelle { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Categorie"/>
/// </summary>
/// <param name="id">Identifiant de la catégorie</param>
/// <param name="libelle">Libellé de la catégorie</param>
public Categorie(string id, string libelle) public Categorie(string id, string libelle)
{ {
this.Id = id; this.Id = id;
@ -18,7 +29,7 @@ namespace MediaTekDocuments.model
/// <summary> /// <summary>
/// Récupération du libellé pour l'affichage dans les combos /// Récupération du libellé pour l'affichage dans les combos
/// </summary> /// </summary>
/// <returns>Libelle</returns> /// <returns>Le libellé de la catégorie</returns>
public override string ToString() public override string ToString()
{ {
return this.Libelle; return this.Libelle;

View file

@ -1,17 +1,51 @@
using System; using System;
namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary>
/// Classe métier CommandeDocument (contient les informations sur une commande de livres ou de DVD)
/// </summary>
public class CommandeDocument public class CommandeDocument
{ {
/// <summary>
/// Obtient ou définit l'identifiant de la commande
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; } public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de la commande
/// </summary>
public double Montant { get; set; } public double Montant { get; set; }
/// <summary>
/// Obtient ou définit le nombre d'exemplaires commandés
/// </summary>
public int NbExemplaire { get; set; } public int NbExemplaire { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du livre ou DVD associé
/// </summary>
public string IdLivreDvd { get; set; } public string IdLivreDvd { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de l'état de suivi de la commande
/// </summary>
public int IdSuivi { get; set; } public int IdSuivi { get; set; }
/// <summary>
/// Obtient ou définit le libellé de l'état de suivi
/// </summary>
public string LibelleSuivi { get; set; } public string LibelleSuivi { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="CommandeDocument"/>
/// </summary>
/// <param name="id">Identifiant de la commande</param>
/// <param name="dateCommande">Date de la commande</param>
/// <param name="montant">Montant de la commande</param>
/// <param name="nbExemplaire">Nombre d'exemplaires</param>
/// <param name="idLivreDvd">Identifiant du document (livre ou dvd)</param>
/// <param name="idSuivi">Identifiant du suivi</param>
/// <param name="libelleSuivi">Libellé du suivi</param>
public CommandeDocument(string id, DateTime dateCommande, double montant, int nbExemplaire, string idLivreDvd, int idSuivi, string libelleSuivi) public CommandeDocument(string id, DateTime dateCommande, double montant, int nbExemplaire, string idLivreDvd, int idSuivi, string libelleSuivi)
{ {
this.Id = id; this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,16 +6,55 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Document public class Document
{ {
/// <summary>
/// Obtient l'identifiant du document
/// </summary>
public string Id { get; } public string Id { get; }
/// <summary>
/// Obtient le titre du document
/// </summary>
public string Titre { get; } public string Titre { get; }
/// <summary>
/// Obtient l'URL de l'image du document
/// </summary>
public string Image { get; } public string Image { get; }
/// <summary>
/// Obtient l'identifiant du genre du document
/// </summary>
public string IdGenre { get; } public string IdGenre { get; }
/// <summary>
/// Obtient le libellé du genre du document
/// </summary>
public string Genre { get; } public string Genre { get; }
/// <summary>
/// Obtient l'identifiant du public du document
/// </summary>
public string IdPublic { get; } public string IdPublic { get; }
/// <summary>
/// Obtient le libellé du public du document
/// </summary>
public string Public { get; } public string Public { get; }
/// <summary>
/// Obtient l'identifiant du rayon du document
/// </summary>
public string IdRayon { get; } public string IdRayon { get; }
/// <summary>
/// Obtient le libellé du rayon du document
/// </summary>
public string Rayon { get; } public string Rayon { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Document"/>
/// </summary>
/// <param name="id">Identifiant du document</param>
/// <param name="titre">Titre du document</param>
/// <param name="image">URL de l'image du document</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Document(string id, string titre, string image, string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon) public Document(string id, string titre, string image, string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
{ {
Id = id; Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Dvd : LivreDvd public class Dvd : LivreDvd
{ {
/// <summary>
/// Obtient la durée du DVD
/// </summary>
public int Duree { get; } public int Duree { get; }
/// <summary>
/// Obtient le réalisateur du DVD
/// </summary>
public string Realisateur { get; } public string Realisateur { get; }
/// <summary>
/// Obtient le synopsis du DVD
/// </summary>
public string Synopsis { get; } public string Synopsis { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Dvd"/>
/// </summary>
/// <param name="id">Identifiant du DVD</param>
/// <param name="titre">Titre du DVD</param>
/// <param name="image">URL de l'image du DVD</param>
/// <param name="duree">Durée du DVD</param>
/// <param name="realisateur">Réalisateur du DVD</param>
/// <param name="synopsis">Synopsis du DVD</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Dvd(string id, string titre, string image, int duree, string realisateur, string synopsis, public Dvd(string id, string titre, string image, int duree, string realisateur, string synopsis,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon) string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon) : base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Etat public class Etat
{ {
/// <summary>
/// Obtient ou définit l'identifiant de l'état
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit le libellé de l'état
/// </summary>
public string Libelle { get; set; } public string Libelle { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Etat"/>
/// </summary>
/// <param name="id">Identifiant de l'état</param>
/// <param name="libelle">Libellé de l'état</param>
public Etat(string id, string libelle) public Etat(string id, string libelle)
{ {
this.Id = id; this.Id = id;

View file

@ -1,4 +1,4 @@
using System; using System;
namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
@ -7,12 +7,35 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Exemplaire public class Exemplaire
{ {
/// <summary>
/// Obtient ou définit le numéro de l'exemplaire
/// </summary>
public int Numero { get; set; } public int Numero { get; set; }
/// <summary>
/// Obtient ou définit l'URL de la photo de l'exemplaire
/// </summary>
public string Photo { get; set; } public string Photo { get; set; }
/// <summary>
/// Obtient ou définit la date d'achat de l'exemplaire
/// </summary>
public DateTime DateAchat { get; set; } public DateTime DateAchat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de l'état de l'exemplaire
/// </summary>
public string IdEtat { get; set; } public string IdEtat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du document associé
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Exemplaire"/>
/// </summary>
/// <param name="numero">Numéro de l'exemplaire</param>
/// <param name="dateAchat">Date d'achat</param>
/// <param name="photo">URL de la photo</param>
/// <param name="idEtat">Identifiant de l'état</param>
/// <param name="idDocument">Identifiant du document</param>
public Exemplaire(int numero, DateTime dateAchat, string photo, string idEtat, string idDocument) public Exemplaire(int numero, DateTime dateAchat, string photo, string idEtat, string idDocument)
{ {
this.Numero = numero; this.Numero = numero;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Genre : Categorie public class Genre : Categorie
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Genre"/>
/// </summary>
/// <param name="id">Identifiant du genre</param>
/// <param name="libelle">Libellé du genre</param>
public Genre(string id, string libelle) : base(id, libelle) public Genre(string id, string libelle) : base(id, libelle)
{ {
} }

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Livre : LivreDvd public class Livre : LivreDvd
{ {
/// <summary>
/// Obtient l'ISBN du livre
/// </summary>
public string Isbn { get; } public string Isbn { get; }
/// <summary>
/// Obtient l'auteur du livre
/// </summary>
public string Auteur { get; } public string Auteur { get; }
/// <summary>
/// Obtient la collection du livre
/// </summary>
public string Collection { get; } public string Collection { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Livre"/>
/// </summary>
/// <param name="id">Identifiant du livre</param>
/// <param name="titre">Titre du livre</param>
/// <param name="image">URL de l'image du livre</param>
/// <param name="isbn">ISBN du livre</param>
/// <param name="auteur">Auteur du livre</param>
/// <param name="collection">Collection du livre</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Livre(string id, string titre, string image, string isbn, string auteur, string collection, public Livre(string id, string titre, string image, string isbn, string auteur, string collection,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon) string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon) : base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,18 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public abstract class LivreDvd : Document public abstract class LivreDvd : Document
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="LivreDvd"/>
/// </summary>
/// <param name="id">Identifiant du document</param>
/// <param name="titre">Titre du document</param>
/// <param name="image">URL de l'image du document</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
protected LivreDvd(string id, string titre, string image, string idGenre, string genre, protected LivreDvd(string id, string titre, string image, string idGenre, string genre,
string idPublic, string lePublic, string idRayon, string rayon) string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon) : base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Public : Categorie public class Public : Categorie
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Public"/>
/// </summary>
/// <param name="id">Identifiant du public</param>
/// <param name="libelle">Libellé du public</param>
public Public(string id, string libelle) : base(id, libelle) public Public(string id, string libelle) : base(id, libelle)
{ {
} }

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Rayon : Categorie public class Rayon : Categorie
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Rayon"/>
/// </summary>
/// <param name="id">Identifiant du rayon</param>
/// <param name="libelle">Libellé du rayon</param>
public Rayon(string id, string libelle) : base(id, libelle) public Rayon(string id, string libelle) : base(id, libelle)
{ {
} }

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,9 +6,29 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Revue : Document public class Revue : Document
{ {
/// <summary>
/// Obtient ou définit la périodicité de la revue
/// </summary>
public string Periodicite { get; set; } public string Periodicite { get; set; }
/// <summary>
/// Obtient ou définit le délai de mise à disposition de la revue
/// </summary>
public int DelaiMiseADispo { get; set; } public int DelaiMiseADispo { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Revue"/>
/// </summary>
/// <param name="id">Identifiant de la revue</param>
/// <param name="titre">Titre de la revue</param>
/// <param name="image">URL de l'image de la revue</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
/// <param name="periodicite">Périodicité</param>
/// <param name="delaiMiseADispo">Délai de mise à disposition</param>
public Revue(string id, string titre, string image, string idGenre, string genre, public Revue(string id, string titre, string image, string idGenre, string genre,
string idPublic, string lePublic, string idRayon, string rayon, string idPublic, string lePublic, string idRayon, string rayon,
string periodicite, int delaiMiseADispo) string periodicite, int delaiMiseADispo)

View file

@ -1,12 +1,42 @@
public class Utilisateur /// <summary>
/// Classe métier Utilisateur (représente un utilisateur de l'application)
/// </summary>
public class Utilisateur
{ {
/// <summary>
/// Obtient ou définit l'identifiant technique de l'utilisateur
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de connexion de l'utilisateur
/// </summary>
public string Identifiant { get; set; } public string Identifiant { get; set; }
/// <summary>
/// Obtient ou définit le nom de l'utilisateur
/// </summary>
public string Nom { get; set; } public string Nom { get; set; }
/// <summary>
/// Obtient ou définit le prénom de l'utilisateur
/// </summary>
public string Prenom { get; set; } public string Prenom { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du service de l'utilisateur
/// </summary>
public int IdService { get; set; } public int IdService { get; set; }
/// <summary>
/// Obtient ou définit le libellé du service de l'utilisateur
/// </summary>
public string LibelleService { get; set; } public string LibelleService { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Utilisateur"/>
/// </summary>
/// <param name="id">Identifiant technique</param>
/// <param name="identifiant">Identifiant de connexion</param>
/// <param name="nom">Nom</param>
/// <param name="prenom">Prénom</param>
/// <param name="idService">Identifiant du service</param>
/// <param name="libelleService">Libellé du service</param>
public Utilisateur(string id, string identifiant, string nom, string prenom, int idService, string libelleService) public Utilisateur(string id, string identifiant, string nom, string prenom, int idService, string libelleService)
{ {
this.Id = id; this.Id = id;

View file

@ -10,23 +10,49 @@ using System.IO;
namespace MediaTekDocuments.view namespace MediaTekDocuments.view
{ {
/// <summary>
/// Fenêtre d'authentification de l'application.
/// Permet à l'utilisateur de se connecter en saisissant ses identifiants.
/// </summary>
public partial class FrmAuth : Form public partial class FrmAuth : Form
{ {
/// <summary>
/// Instance du contrôleur pour la gestion de l'authentification.
/// </summary>
private readonly FrmAuthController controller; private readonly FrmAuthController controller;
/// <summary>
/// Obtient l'utilisateur authentifié.
/// </summary>
public Utilisateur user { get; private set; } public Utilisateur user { get; private set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="FrmAuth"/>.
/// Configure le contrôleur d'authentification.
/// </summary>
public FrmAuth() public FrmAuth()
{ {
InitializeComponent(); InitializeComponent();
this.controller = new FrmAuthController(); this.controller = new FrmAuthController();
} }
/// <summary>
/// Gère l'événement de chargement du formulaire.
/// </summary>
/// <param name="sender">La source de l'événement.</param>
/// <param name="e">Les données de l'événement.</param>
private void FrmAuth_Load(object sender, EventArgs e) private void FrmAuth_Load(object sender, EventArgs e)
{ {
// Méthode laissée vide intentionnellement. // Méthode laissée vide intentionnellement.
// Aucun traitement spécifique n'est requis au chargement du formulaire d'authentification. // Aucun traitement spécifique n'est requis au chargement du formulaire d'authentification.
} }
/// <summary>
/// Gère le clic sur le bouton de connexion.
/// Vérifie les identifiants et le service de l'utilisateur pour autoriser l'accès.
/// </summary>
/// <param name="sender">La source de l'événement.</param>
/// <param name="e">Les données de l'événement.</param>
private void btnLogin_Click(object sender, EventArgs e) private void btnLogin_Click(object sender, EventArgs e)
{ {
string identifiant = txtIdentifiant.Text; string identifiant = txtIdentifiant.Text;

File diff suppressed because it is too large Load diff

View file

@ -50,6 +50,7 @@
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="documentTest.cs" />
<Compile Include="UnitTest1.cs" /> <Compile Include="UnitTest1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>

View file

@ -0,0 +1,104 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MediaTekDocuments.model;
using System;
namespace Mediatek.Tests
{
[TestClass]
public class ModelTests
{
[TestMethod]
public void TestLivre_Initialization()
{
// Données de test
string id = "001";
string titre = "Le Seigneur des Anneaux";
string image = "image.jpg";
string isbn = "123456";
string auteur = "J.R.R. Tolkien";
string collection = "Pocket";
string idGenre = "G01";
string genre = "Fantastique";
string idPublic = "P01";
string lePublic = "Adulte";
string idRayon = "R01";
string rayon = "Rayon 1";
// Instanciation
Livre livre = new Livre(id, titre, image, isbn, auteur, collection, idGenre, genre, idPublic, lePublic, idRayon, rayon);
// Assertions
Assert.AreEqual(id, livre.Id);
Assert.AreEqual(titre, livre.Titre);
Assert.AreEqual(auteur, livre.Auteur);
Assert.AreEqual(isbn, livre.Isbn);
Assert.AreEqual(genre, livre.Genre);
}
[TestMethod]
public void TestRevue_Initialization()
{
Revue revue = new Revue("003", "Science et Vie", "img.jpg", "G03", "Science", "P01", "Adulte", "R03", "Rayon 3", "Mensuel", 15);
Assert.AreEqual("003", revue.Id);
Assert.AreEqual("Science et Vie", revue.Titre);
Assert.AreEqual("Mensuel", revue.Periodicite);
Assert.AreEqual(15, revue.DelaiMiseADispo);
}
}
[TestClass]
public class CommandeModelTests
{
[TestMethod]
public void TestAbonnement_Initialization()
{
string id = "A001";
DateTime dateCommande = new DateTime(2023, 10, 01, 0, 0, 0, DateTimeKind.Local);
double montant = 50.5;
DateTime dateFin = new DateTime(2024, 10, 01, 0, 0, 0, DateTimeKind.Local);
string idRevue = "R001";
Abonnement abo = new Abonnement(id, dateCommande, montant, dateFin, idRevue);
Assert.AreEqual(id, abo.Id);
Assert.AreEqual(montant, abo.Montant);
Assert.AreEqual(dateFin, abo.DateFinAbonnement);
Assert.AreEqual(idRevue, abo.IdRevue);
}
[TestMethod]
public void TestCommandeDocument_Initialization()
{
CommandeDocument cmd = new CommandeDocument("C001", DateTime.Now, 25.0, 5, "L001", 1, "En cours");
Assert.AreEqual(5, cmd.NbExemplaire);
Assert.AreEqual("L001", cmd.IdLivreDvd);
Assert.AreEqual("En cours", cmd.LibelleSuivi);
}
}
[TestClass]
public class SystemModelTests
{
[TestMethod]
public void TestUtilisateur_Initialization()
{
Utilisateur user = new Utilisateur("1", "jdupont", "dupont", "Jean", 2, "Prêts");
Assert.AreEqual("jdupont", user.Identifiant);
Assert.AreEqual("Jean", user.Prenom);
Assert.AreEqual("Prêts", user.LibelleService);
}
[TestMethod]
public void TestEtat_Initialization()
{
Etat etat = new Etat("00001", "Neuf");
Assert.AreEqual("00001", etat.Id);
Assert.AreEqual("Neuf", etat.Libelle);
}
}
}

157
docs/index.html Normal file
View file

@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documentation Technique - MediaTekDocuments</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; margin: 0; display: flex; }
nav { width: 300px; background: #f4f4f4; border-right: 1px solid #ddd; height: 100vh; overflow-y: auto; position: fixed; padding: 20px; }
main { margin-left: 340px; padding: 40px; max-width: 1000px; }
h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }
h2 { color: #2980b9; margin-top: 40px; border-bottom: 1px solid #eee; }
h3 { color: #16a085; background: #f9f9f9; padding: 5px 10px; border-left: 4px solid #16a085; }
.namespace { font-weight: bold; color: #7f8c8d; text-transform: uppercase; font-size: 0.9em; }
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
th, td { text-align: left; padding: 12px; border: 1px solid #ddd; }
th { background: #f2f2f2; }
code { background: #f8f8f8; padding: 2px 5px; border-radius: 3px; font-family: Consolas, Monaco, 'Andale Mono', monospace; }
.summary { font-style: italic; color: #555; margin-bottom: 15px; }
ul { list-style-type: none; padding: 0; }
nav ul li { margin-bottom: 8px; }
nav a { text-decoration: none; color: #34495e; font-size: 0.95em; }
nav a:hover { color: #3498db; }
</style>
</head>
<body>
<nav>
<h3>Sommaire</h3>
<ul>
<li><strong>Contrôleurs</strong>
<ul>
<li><a href="#FrmAuthController">FrmAuthController</a></li>
<li><a href="#FrmMediatekController">FrmMediatekController</a></li>
</ul>
</li>
<li><strong>Data Access</strong>
<ul>
<li><a href="#Access">Access (DAL)</a></li>
<li><a href="#ApiRest">ApiRest (Manager)</a></li>
</ul>
</li>
<li><strong>Modèles</strong>
<ul>
<li><a href="#Livre">Livre</a></li>
<li><a href="#Dvd">Dvd</a></li>
<li><a href="#Revue">Revue</a></li>
<li><a href="#Abonnement">Abonnement</a></li>
<li><a href="#CommandeDocument">CommandeDocument</a></li>
</ul>
</li>
</ul>
</nav>
<main>
<h1>Documentation Technique MediaTekDocuments</h1>
<p>Cette documentation détaille les classes, méthodes et structures de données de l'application de gestion MediaTekDocuments.</p>
<section id="controllers">
<h2>Espace de noms : MediaTekDocuments.controller</h2>
<h3 id="FrmAuthController">Classe FrmAuthController</h3>
<p class="summary">Contrôleur gérant l'authentification des utilisateurs.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr>
<td><code>GetConnection(login, pwd)</code></td>
<td>Vérifie les identifiants. Retourne un objet <code>Utilisateur</code> ou <code>null</code>.</td>
</tr>
</table>
<h3 id="FrmMediatekController">Classe FrmMediatekController</h3>
<p class="summary">Contrôleur principal servant d'interface entre la vue et la couche d'accès aux données.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr><td><code>GetAllLivres() / GetAllDvd() / GetAllRevues()</code></td><td>Récupère l'intégralité des documents par type.</td></tr>
<tr><td><code>GetExemplairesRevue(idDocument)</code></td><td>Récupère la liste des exemplaires pour une revue donnée.</td></tr>
<tr><td><code>GetCommandesDocument(idDocument)</code></td><td>Récupère les commandes (Livres/DVD) associées à un document.</td></tr>
<tr><td><code>UpdateSuiviCommande(idCommande, idSuivi)</code></td><td>Met à jour l'état d'avancement d'une commande.</td></tr>
<tr><td><code>CreerAbonnement(abonnement)</code></td><td>Enregistre un nouvel abonnement en base de données.</td></tr>
</table>
</section>
<section id="dal">
<h2>Espace de noms : MediaTekDocuments.dal & manager</h2>
<h3 id="Access">Classe Access</h3>
<p class="summary">Implémentation du pattern Singleton pour l'accès centralisé aux données via l'API.</p>
<table>
<tr><th>Membre</th><th>Description</th></tr>
<tr><td><code>GetInstance()</code></td><td>Retourne l'instance unique de la classe Access.</td></tr>
<tr><td><code>convertToJson(nom, valeur)</code></td><td>Sérialise un couple clé/valeur pour les envois à l'API.</td></tr>
<tr><td><code>GetNextCommandeId()</code></td><td>Récupère le futur identifiant de commande disponible.</td></tr>
</table>
<h3 id="ApiRest">Classe ApiRest</h3>
<p class="summary">Gère les appels HTTP bas niveau vers l'API Rest.</p>
<ul>
<li><strong>RecupDistant(methode, message, parametres) :</strong> Point d'entrée unique pour GET, POST, PUT, DELETE.</li>
</ul>
</section>
<section id="models">
<h2>Espace de noms : MediaTekDocuments.model</h2>
<p>Les classes modèles représentent les entités métier du domaine.</p>
<h3 id="Livre">Classe Livre (hérite de LivreDvd)</h3>
<table>
<tr><th>Propriété</th><th>Type</th><th>Description</th></tr>
<tr><td><code>Isbn</code></td><td>string</td><td>Code ISBN unique du livre.</td></tr>
<tr><td><code>Auteur</code></td><td>string</td><td>Nom de l'auteur.</td></tr>
<tr><td><code>Collection</code></td><td>string</td><td>Collection éditoriale.</td></tr>
</table>
<h3 id="Dvd">Classe Dvd (hérite de LivreDvd)</h3>
<table>
<tr><th>Propriété</th><th>Type</th><th>Description</th></tr>
<tr><td><code>Duree</code></td><td>int</td><td>Durée en minutes.</td></tr>
<tr><td><code>Realisateur</code></td><td>string</td><td>Nom du réalisateur.</td></tr>
<tr><td><code>Synopsis</code></td><td>string</td><td>Résumé du film.</td></tr>
</table>
<h3 id="Abonnement">Classe Abonnement</h3>
<p class="summary">Gère les informations liées aux contrats de revues.</p>
<ul>
<li><code>DateFinAbonnement</code> : Détermine la période de validité du contrat.</li>
<li><code>Montant</code> : Coût de l'abonnement.</li>
</ul>
<h3 id="CommandeDocument">Classe CommandeDocument</h3>
<p class="summary">Représente l'achat d'un exemplaire de livre ou de DVD.</p>
<ul>
<li><code>NbExemplaire</code> : Quantité commandée.</li>
<li><code>IdSuivi / LibelleSuivi</code> : État actuel (en cours, reçu, etc.).</li>
</ul>
</section>
<section id="views">
<h2>Espace de noms : MediaTekDocuments.view</h2>
<h3 id="FrmMediatek">Classe FrmMediatek</h3>
<p class="summary">Interface principale de l'application. Elle contient la logique de filtrage et d'affichage.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr><td><code>AlerteAbonnementsExpirants()</code></td><td>Vérifie au démarrage les abonnements finissant sous 30 jours.</td></tr>
<tr><td><code>PeutSupprimerAbonnement()</code></td><td>Contrôle métier : interdit la suppression si des exemplaires ont été reçus.</td></tr>
<tr><td><code>RemplirComboCategorie()</code></td><td>Méthode générique pour peupler les listes déroulantes (Genre, Public, Rayon).</td></tr>
</table>
</section>
<hr>
<footer>
<p>Généré le : 30 mars 2026 - Documentation technique MediaTekDocuments</p>
</footer>
</main>
</body>
</html>