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

2
.gitignore vendored
View file

@ -361,3 +361,5 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/docs/tools
/docs/phpdoc.dist.xml

View file

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

View file

@ -5,15 +5,30 @@ using System;
namespace MediaTekDocuments.controller
{
/// <summary>
/// Contrôleur pour la fenêtre d'authentification
/// </summary>
class FrmAuthController
{
/// <summary>
/// Objet d'accès aux données
/// </summary>
private readonly Access access;
/// <summary>
/// Constructeur : récupère l'instance unique d'accès aux données
/// </summary>
public FrmAuthController()
{
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)
{
return access.GetConnection(login, pwd);

View file

@ -98,46 +98,90 @@ namespace MediaTekDocuments.controller
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)
{
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)
{
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()
{
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)
{
return access.CreerCommande(commande);
}
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Identifiant de commande formaté</returns>
public string 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)
{
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)
{
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)
{
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)
{
return access.SupprimerAbonnement(abonnement.Id);

View file

@ -34,7 +34,8 @@ namespace MediaTekDocuments.dal
private const string POST = "POST";
/// <summary>
/// méthode HTTP pour update
///
/// </summary>
private const string PUT = "PUT";
/// <summary>
/// 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()
{
if (instance == null)
@ -266,6 +271,11 @@ namespace MediaTekDocuments.dal
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)
{
@ -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()
{
IEnumerable<Categorie> lesSuivis = TraitementRecup<Categorie>(GET, "suivi", null);
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)
{
String jsonExemplaire = JsonConvert.SerializeObject(commande, new CustomDateTimeConverter());
@ -303,6 +322,10 @@ namespace MediaTekDocuments.dal
return false;
}
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Prochain ID de commande au format string</returns>
public string GetNextCommandeId()
{
List<dynamic> result = TraitementRecup<dynamic>(GET, "maxcommande", null);
@ -321,6 +344,13 @@ namespace MediaTekDocuments.dal
}
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)
{
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)
{
string jsonIdRevue = convertToJson("id", idRevue);
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)
{
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)
{
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)
{
Dictionary<string, string> loginInfo = new Dictionary<string, string>

View file

@ -43,7 +43,7 @@ namespace MediaTekDocuments.manager
/// </summary>
/// <param name="uriApi">adresse de l'api</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)
{
if(instance == null)

View file

@ -1,15 +1,41 @@
using System;
using System;
namespace MediaTekDocuments.model
{
/// <summary>
/// Classe métier Abonnement (contient les informations sur un abonnement à une revue)
/// </summary>
public class Abonnement
{
/// <summary>
/// Obtient ou définit l'identifiant de l'abonnement
/// </summary>
public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de l'abonnement
/// </summary>
public double Montant { get; set; }
/// <summary>
/// Obtient ou définit la date de fin de l'abonnement
/// </summary>
public DateTime DateFinAbonnement { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de la revue associée
/// </summary>
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)
{
this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary>
public class Categorie
{
/// <summary>
/// Obtient l'identifiant de la catégorie
/// </summary>
public string Id { get; }
/// <summary>
/// Obtient le libellé de la catégorie
/// </summary>
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)
{
this.Id = id;
@ -18,7 +29,7 @@ namespace MediaTekDocuments.model
/// <summary>
/// Récupération du libellé pour l'affichage dans les combos
/// </summary>
/// <returns>Libelle</returns>
/// <returns>Le libellé de la catégorie</returns>
public override string ToString()
{
return this.Libelle;

View file

@ -1,17 +1,51 @@
using System;
using System;
namespace MediaTekDocuments.model
{
/// <summary>
/// Classe métier CommandeDocument (contient les informations sur une commande de livres ou de DVD)
/// </summary>
public class CommandeDocument
{
/// <summary>
/// Obtient ou définit l'identifiant de la commande
/// </summary>
public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de la commande
/// </summary>
public double Montant { get; set; }
/// <summary>
/// Obtient ou définit le nombre d'exemplaires commandés
/// </summary>
public int NbExemplaire { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du livre ou DVD associé
/// </summary>
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; }
/// <summary>
/// Obtient ou définit le libellé de l'état de suivi
/// </summary>
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)
{
this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,16 +6,55 @@ namespace MediaTekDocuments.model
/// </summary>
public class Document
{
/// <summary>
/// Obtient l'identifiant du document
/// </summary>
public string Id { get; }
/// <summary>
/// Obtient le titre du document
/// </summary>
public string Titre { get; }
/// <summary>
/// Obtient l'URL de l'image du document
/// </summary>
public string Image { get; }
/// <summary>
/// Obtient l'identifiant du genre du document
/// </summary>
public string IdGenre { get; }
/// <summary>
/// Obtient le libellé du genre du document
/// </summary>
public string Genre { get; }
/// <summary>
/// Obtient l'identifiant du public du document
/// </summary>
public string IdPublic { get; }
/// <summary>
/// Obtient le libellé du public du document
/// </summary>
public string Public { get; }
/// <summary>
/// Obtient l'identifiant du rayon du document
/// </summary>
public string IdRayon { get; }
/// <summary>
/// Obtient le libellé du rayon du document
/// </summary>
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)
{
Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary>
public class Dvd : LivreDvd
{
/// <summary>
/// Obtient la durée du DVD
/// </summary>
public int Duree { get; }
/// <summary>
/// Obtient le réalisateur du DVD
/// </summary>
public string Realisateur { get; }
/// <summary>
/// Obtient le synopsis du DVD
/// </summary>
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,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary>
public class Etat
{
/// <summary>
/// Obtient ou définit l'identifiant de l'état
/// </summary>
public string Id { get; set; }
/// <summary>
/// Obtient ou définit le libellé de l'état
/// </summary>
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)
{
this.Id = id;

View file

@ -1,4 +1,4 @@
using System;
using System;
namespace MediaTekDocuments.model
{
@ -7,12 +7,35 @@ namespace MediaTekDocuments.model
/// </summary>
public class Exemplaire
{
/// <summary>
/// Obtient ou définit le numéro de l'exemplaire
/// </summary>
public int Numero { get; set; }
/// <summary>
/// Obtient ou définit l'URL de la photo de l'exemplaire
/// </summary>
public string Photo { get; set; }
/// <summary>
/// Obtient ou définit la date d'achat de l'exemplaire
/// </summary>
public DateTime DateAchat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de l'état de l'exemplaire
/// </summary>
public string IdEtat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du document associé
/// </summary>
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)
{
this.Numero = numero;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary>
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)
{
}

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary>
public class Livre : LivreDvd
{
/// <summary>
/// Obtient l'ISBN du livre
/// </summary>
public string Isbn { get; }
/// <summary>
/// Obtient l'auteur du livre
/// </summary>
public string Auteur { get; }
/// <summary>
/// Obtient la collection du livre
/// </summary>
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,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,18 @@ namespace MediaTekDocuments.model
/// </summary>
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,
string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary>
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)
{
}

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary>
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)
{
}

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model
{
/// <summary>
@ -6,9 +6,29 @@ namespace MediaTekDocuments.model
/// </summary>
public class Revue : Document
{
/// <summary>
/// Obtient ou définit la périodicité de la revue
/// </summary>
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; }
/// <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,
string idPublic, string lePublic, string idRayon, string rayon,
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; }
/// <summary>
/// Obtient ou définit l'identifiant de connexion de l'utilisateur
/// </summary>
public string Identifiant { get; set; }
/// <summary>
/// Obtient ou définit le nom de l'utilisateur
/// </summary>
public string Nom { get; set; }
/// <summary>
/// Obtient ou définit le prénom de l'utilisateur
/// </summary>
public string Prenom { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du service de l'utilisateur
/// </summary>
public int IdService { get; set; }
/// <summary>
/// Obtient ou définit le libellé du service de l'utilisateur
/// </summary>
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)
{
this.Id = id;

View file

@ -10,23 +10,49 @@ using System.IO;
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
{
/// <summary>
/// Instance du contrôleur pour la gestion de l'authentification.
/// </summary>
private readonly FrmAuthController controller;
/// <summary>
/// Obtient l'utilisateur authentifié.
/// </summary>
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()
{
InitializeComponent();
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)
{
// Méthode laissée vide intentionnellement.
// 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)
{
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" />
</ItemGroup>
<ItemGroup>
<Compile Include="documentTest.cs" />
<Compile Include="UnitTest1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</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>