Aller au contenu principal

🧪 TP2 – Guichet bancaire


🎯 Objectifs​

  • Utilisation des collections d’objets
  • Utilisation des fichiers CSV
  • DĂ©finition des classes
  • DĂ©finition des relations entre les classes
  • Gestion des exceptions
  • Gestion des contrĂ´les WinForms

Télécharger la solution contenant le projet de départ.​

Disponible ici 👉 TP2


Télécharger la démonstration des tests unitaires.​

Disponible ici 👉 Comment utiliser les tests unitaires


Mise en contexte​

Une banque souhaite développer une application simple simulant le fonctionnement d’un guichet bancaire. Cette application permettra de gérer les clients de la banque ainsi que les transactions effectuées sur leurs comptes.

Chaque client possède un compte bancaire avec un solde et peut effectuer différentes opérations telles que déposer de l’argent ou retirer un montant. Toutes les opérations effectuées par les clients doivent être enregistrées sous forme de transactions afin de conserver un historique des activités.

Les informations du système sont conservées dans deux fichiers CSV :

  • un fichier contenant la liste des clients de la banque ;
  • un fichier contenant l’historique des transactions.

Au démarrage de l’application, ces fichiers doivent être lus afin de charger les données en mémoire. L’application permet ensuite à un client de se connecter au système, d’effectuer des opérations sur son compte et de consulter ses informations.

Afin de structurer l’application, plusieurs classes seront utilisées :

  • Client : reprĂ©sente un client de la banque et son compte.
  • Transaction : reprĂ©sente une opĂ©ration effectuĂ©e sur un compte.
  • ServiceGuichet : gère les clients, les transactions et les opĂ©rations du système.

L’objectif de ce travail est de modéliser ces différentes composantes à l’aide de classes C#, en appliquant les principes de la programmation orientée objet, notamment l’encapsulation, la validation des données et la gestion de collections d’objets.

À la fin du travail, le système devra être capable de :

  • charger les clients et les transactions Ă  partir de fichiers CSV ;
  • associer les transactions aux bons clients ;
  • permettre la connexion d’un client ou un administrateur;
  • gĂ©rer les opĂ©rations de dĂ©pĂ´t et de retrait ;
  • sauvegarder les donnĂ©es dans les fichiers CSV.
  • permettre Ă  l'administrateur de visualiser la liste des clients ainsi que la liste des transactions.

Travail demandé​

  • ImplĂ©menter les classes demandĂ©es. Utiliser le correcteur fourni afin de valider le bon fonctionnement de chaque classe.
    • Classe Transaction (15 points)
    • Classe Client (15 points)
    • Classe ServiceGuichet (35 points)
  • ComplĂ©ter les formulaires fournis.
    • Formulaire principal (15 points)
    • Formulaire FrmClients (10 points)
    • Formulaure FrmTransactions (10 points)

💡 Une démonstration est disponible pour vous permettre d’observer le fonctionnement attendu de l’application et de valider votre travail.


astuce

💡 Aide – Dates et heure (DateTime)​

Dans ce TP, vous devez manipuler des dates même si cette notion n’a pas encore été vue en détail.

🔹 Obtenir la date et l’heure actuelles​

Pour obtenir la date et l’heure du moment :

DateTime maintenant = DateTime.Now;

Console.WriteLine(maintenant);

👉 Cela retourne la date et l’heure actuelles du système.


🔹 Exemple avec affichage formaté​

Vous pouvez afficher la date dans un format précis :

DateTime maintenant = DateTime.Now;

string texte = maintenant.ToString("yyyy-MM-dd HH:mm:ss");

Console.WriteLine(texte);

👉 Exemple de résultat :

2026-03-24 14:35:10

🔹 Convertir un texte en DateTime​

Pour obtenir la date a partir d'un texte :

string dateEnTexte = "2026-03-24 14:35:10";
DateTime date = DateTime.Parse(dateEnTexte);

astuce

💡 Aide – Transtypage (cast) d'un enum​

Dans certains cas, lorsqu’on sauvegarde des données dans un fichier CSV, on enregistre la valeur entière associée à un enum.

Lors de la lecture du fichier, il est nécessaire de reconvertir cette valeur entière en enum à l’aide d’un transtypage (cast).


🔹 Conversion d’un enum en entier​

Pour obtenir la valeur numérique d’un enum, vous devez faire un cast ou transtypage.

Exemple :​

Roles role = Roles.Administrateur;

int valeur = (int)role;

Console.WriteLine(valeur);

👉 Résultat : affiche la valeur entière associée à l’énumération.


🔹 Conversion d’un entier vers un enum​

Si vous avez un entier (ex : provenant d’un fichier), vous pouvez le convertir en enum :

int valeur = 1;

Roles role = (Roles)valeur;

danger

🧪 Directives pour utiliser les tests unitaires​

  • Des tests unitaires sont fournis pour vous aider Ă  valider votre travail. Ils ne sont pas exhaustifs et ne remplacent pas vos propres tests, qui sont nĂ©cessaires pour assurer la validitĂ© de votre code.
  • Chaque classe possède son propre fichier de tests.
  • Avant d’utiliser un fichier de tests, vous devez implĂ©menter la classe demandĂ©e.
  • DĂ©commentez ensuite la première ligne du fichier de tests correspondant afin d’activer les tests.
  • ExĂ©cutez les tests et observez les rĂ©sultats dans la fenĂŞtre Explorateur de tests.

⚠️ Si un test apparaît en rouge, cela signifie qu’il a échoué.

Les lignes à décommenter pour activer les tests se trouvent au début du chaque fichier de tests dans le projet (ModelsTests).

#define TestClasseTransaction
#define TestClasseClient
#define TestClasseServiceGuichet

🎬 Démonstration : Comment utiliser les tests unitaires​


Diagrammes​


Classe Transaction​

La classe Transaction représente une opération effectuée par un client dans le système du guichet. Une transaction correspond par exemple à un dépôt ou à un retrait d’argent.

Chaque transaction contient des informations sur le type d’opération, le client concerné, la date de l’opération et le montant.


Attributs​

La classe doit contenir les attributs privés suivants :

  • m_sorteTransaction : type de la transaction (Ă©numĂ©ration SorteTransactions).
  • m_date : date et heure de la transaction.
  • m_numClient : numĂ©ro du client associĂ© Ă  la transaction.
  • m_montant : montant de la transaction.

Ces attributs doivent être accessibles uniquement en lecture à l’aide de propriétés publiques.


Propriétés​

NumClient : string​

Représente le numéro du client qui contient exactement 6 chiffres.

Validations à faire​
  • Si la valeur reçue est null, vous devez lever une exception :.
ArgumentNullException
  • Si le numĂ©ro n'est pas valide, vous devez lever une exception :`.
ArgumentException

Montant : int​

Représente le montant de la transaction.

Validations à faire​
  • Si la valeur est infĂ©rieure ou Ă©gal Ă  0, vous devez lever une exception :.
ArgumentOutOfRangeException

Constructeur​

Implémenter le constructeur suivant :

public Transaction(SorteTransactions pSorte, string pNumClient, DateTime pDate, int pMontant)

Ce constructeur initialise une nouvelle transaction Ă  partir des informations fournies.


Méthodes​

ToCsv()​

Implémenter la méthode suivante :

public string ToCsv()

Cette méthode retourne une chaîne de caractères représentant la transaction au format CSV.

Le format attendu est :

SorteTransaction,NumClient,Date,Montant

La date doit être formatée comme suit :

yyyy-MM-dd HH:mm:ss

Exemple de résultat​

0,00001,2026-03-15 09:45:00,200

oĂą :

  • 0 reprĂ©sente la valeur numĂ©rique de l’énumĂ©ration SorteTransactions
  • 000001 est le numĂ©ro du client
  • 2026-03-15 09:45:00 est la date de la transaction
  • 200 est le montant de la transaction

Classe Client​

La classe Client représente un client inscrit dans le système du guichet bancaire. Chaque client possède un numéro unique, un nom, un mot de passe, un rôle dans le système ainsi qu’un type de compte bancaire.

Le client possède également un solde représentant l’argent disponible dans son compte et une liste de transactions correspondant aux opérations effectuées.


Attributs​

La classe doit contenir les attributs privés suivants :

  • m_numClient : numĂ©ro unique identifiant le client.
  • m_nom : nom du client.
  • m_motDePasse : mot de passe du client.
  • m_role : rĂ´le du client dans le système (Ă©numĂ©ration Roles).
  • m_sorteCompte : type de compte du client (Ă©numĂ©ration SorteComptes).
  • m_solde : montant actuellement disponible dans le compte.

Ces attributs doivent être accessibles uniquement en lecture à l’aide de propriétés publiques.


Constante​

La classe doit contenir la constante suivante :

  • MAX_SOLDE : reprĂ©sente le solde maximal qu’un client peut possĂ©der dans son compte.

La valeur maximale autorisée est :

1000000

Validations dans certaines propriétés​

NumClient : string​

Représente le numéro du client qui contient exactement 6 chiffres.

Validations à faire​
  • Si la valeur reçue est null, vous devez lever une exception :.
ArgumentNullException
  • Si le numĂ©ro n'est pas valide, vous devez lever une exception :`.
ArgumentException

Nom : string​

Représente le nom du client qui contient au moins 3 caractères.

Validations à faire​
  • Si la valeur reçue est null, vous devez lever une exception :.
ArgumentNullException
  • Si le nom contient moins de 3 caractères, vous devez lever une exception :.
ArgumentOutOfRangeException

Solde : int​

Représente le solde actuel du client.

Validations à faire​
  • Si la valeur reçue est infĂ©rieure Ă  0, vous devez lever une exception :.
InvalidOperationException
  • Si la valeur reçue est supĂ©rieure Ă  MAX_SOLDE, vous devez lever une exception :.
InvalidOperationException

Propriété calculée​

Implémenter la propriété calculée suivante :

public bool IsAdmin

Cette propriété retourne true si le rôle du client est Administrateur, sinon elle retourne false.


Constructeurs​

Constructeur 1​

Implémenter le constructeur suivant :

public Client(string pNumClient, string pNom, string pMotDePasse,
Roles pRole, SorteComptes pSorte, int pSolde)

Ce constructeur permet de créer un client à partir des informations fournies.


Constructeur 2​

Implémenter le constructeur suivant :

public Client(string pChaineLue)

Ce constructeur permet de créer un client à partir d’une ligne provenant d’un fichier CSV.

Le format attendu de la ligne est :

NumClient,Nom,MotDePasse,Role,SorteCompte,Solde
Exemple​
000001,Tremblay,abc123,0,1,5000

oĂą :

  • 000001 reprĂ©sente le numĂ©ro du client
  • Tremblay reprĂ©sente le nom du client
  • abc123 reprĂ©sente le mot de passe
  • 0 reprĂ©sente la valeur numĂ©rique de l’énumĂ©ration Roles
  • 1 reprĂ©sente la valeur numĂ©rique de l’énumĂ©ration SorteComptes
  • 5000 reprĂ©sente le solde du client

Méthodes​

Deposer()​

Implémenter la méthode suivante :

public void Deposer(int pMontant)

Cette méthode permet d’ajouter un montant au solde du client.

Validation​
  • Si le montant est infĂ©rieur ou Ă©gal Ă  0, lever une exception ArgumentOutOfRangeException.
  • Si l’ajout du montant dĂ©passe MAX_SOLDE, lever une exception InvalidOperationException.

Retirer()​

Implémenter la méthode suivante :

public void Retirer(int pMontant)

Cette méthode permet de retirer un montant du compte du client.

Validation​
  • Si le montant est infĂ©rieur ou Ă©gal Ă  0, vous devez lever une exception ArgumentOutOfRangeException.
  • Si le montant est supĂ©rieur au solde actuel, vous devez lever une exception InvalidOperationException.

PeutRetirer()​

Implémenter la méthode suivante :

public bool PeutRetirer(int pMontant)

Cette méthode retourne true si le client peut retirer ce montant.

Sinon elle retourne false.


AjouterTransaction()​

Implémenter la méthode suivante :

public void AjouterTransaction(Transaction pTransaction)

Cette méthode ajoute une transaction à la liste des transactions du client.

Validation​
  • Si la transaction est null, lever une exception ArgumentNullException.
  • Si la transaction appartient Ă  un autre client, lever une exception InvalidOperationException.
  • Si la transaction est dĂ©jĂ  prĂ©sente dans la liste, lever une exception InvalidOperationException.

ToCsv()​

Implémenter la méthode suivante :

public string ToCsv()

Cette méthode retourne une chaîne représentant le client au format CSV.

Le format attendu est :

NumClient,Nom,MotDePasse,Role,SorteCompte,Solde
Exemple de résultat​
000001,Tremblay,abc123,0,1,5000

Classe ServiceGuichet​

La classe ServiceGuichet représente le service principal du système de guichet bancaire. Elle permet de gérer les clients, les transactions, la connexion d’un utilisateur ainsi que le chargement et la sauvegarde des données dans des fichiers CSV.

Cette classe agit comme une couche de service entre les fichiers de données et l’application.


Attributs​

La classe doit contenir les attributs privés suivants :

  • m_cheminFichierClients : chemin du fichier CSV contenant les clients.
  • m_cheminFichierTransactions : chemin du fichier CSV contenant les transactions.
  • m_clients : liste des clients du système (List<Client>).
  • m_transactions : liste des transactions du système (List<Transaction>).

Ces attributs doivent être accessibles uniquement en lecture à l’aide de propriétés publiques.

La classe contient aussi l’attribut suivant :

  • ClientCourant : rĂ©fĂ©rence vers le client actuellement connectĂ©.

Constructeur​

Implémenter le constructeur suivant :

ServiceGuichet(string pCheminFichierClients, string pCheminFichierTransactions)

Ce constructeur initialise le service de guichet Ă  partir des chemins des deux fichiers CSV.

Validation​

  • Si le fichier des clients n’existe pas, le constructeur doit lever une exception ArgumentException.
  • Si le fichier des transactions n’existe pas, le constructeur doit lever une exception ArgumentException.

Le constructeur doit également :

  • mĂ©moriser les deux chemins de fichiers ;
  • initialiser la liste des clients ;
  • initialiser la liste des transactions.

Méthodes​

ChargerClients()​

Implémenter la méthode suivante :

public int ChargerClients()

Cette méthode lit le fichier CSV des clients et ajoute chaque client valide à la liste Clients.

Pour chaque ligne du fichier :

  • la mĂ©thode doit tenter de crĂ©er un objet Client Ă  partir de la ligne ;
  • si la ligne est invalide, elle ne doit pas interrompre le chargement ;
  • le nombre de lignes erronĂ©es doit ĂŞtre comptabilisĂ©.

La méthode retourne le nombre de lignes erronées rencontrées lors du chargement.


ChargerTransactions()​

Implémenter la méthode suivante :

public int ChargerTransactions()

Cette méthode lit le fichier CSV des transactions et ajoute chaque transaction valide au système.

Pour chaque ligne du fichier :

  • la mĂ©thode doit extraire les informations nĂ©cessaires ;
  • la mĂ©thode doit crĂ©er la transaction en appelant CreerTransaction(...) ;
  • si la ligne est invalide, elle ne doit pas interrompre le chargement ;
  • le nombre de lignes erronĂ©es doit ĂŞtre comptabilisĂ©.

La méthode retourne le nombre de lignes erronées rencontrées lors du chargement.


CreerTransaction()​

Implémenter la méthode suivante :

public void CreerTransaction(SorteTransactions pSorte, string pNumClient, DateTime pDate, int pMontant)

Cette méthode crée une nouvelle transaction et l’associe au bon client.

Traitement attendu :

  • rechercher le client correspondant au numĂ©ro fourni ;
  • si aucun client n’est trouvĂ©, lever une exception ArgumentException ;
  • crĂ©er la transaction ;
  • ajouter la transaction Ă  la liste du client ;
  • ajouter la transaction Ă  la liste gĂ©nĂ©rale des transactions.

Sauvegarde()​

Implémenter la méthode suivante :

public bool Sauvegarde()

Cette méthode sauvegarde l’ensemble des données du système dans les fichiers CSV :

  • les transactions dans le fichier des transactions (voir mĂ©thode SauvegarderTransactions()) ;
  • les clients dans le fichier des clients (voir mĂ©thode SauvegarderClients()).

La méthode retourne true lorsque la sauvegarde est effectuée.


SauvegarderTransactions()​

Implémenter la méthode suivante :

public void SauvegarderTransactions(string pFichier)

Cette méthode écrit toutes les transactions dans un fichier texte au format CSV.

Chaque transaction doit être enregistrée sur une ligne à l’aide de la méthode ToCsv() de la classe Transaction.


SauvegarderClients()​

Implémenter la méthode suivante :

public void SauvegarderClients(string pFichier)

Cette méthode écrit tous les clients dans un fichier texte au format CSV.

Chaque client doit être enregistré sur une ligne à l’aide de la méthode ToCsv() de la classe Client.


Connexion()​

Implémenter la méthode suivante :

public bool Connexion(string numClient, string motDePasse)

Cette méthode permet de connecter un client au système.

Traitement attendu :

  • rechercher le client Ă  l’aide de son numĂ©ro ;
  • si le client n’existe pas, retourner false ;
  • si le mot de passe correspond, affecter ce client Ă  ClientCourant et retourner true ;
  • sinon, retourner false.

Deconnexion()​

Implémenter la méthode suivante :

public bool Deconnexion()

Cette méthode permet de déconnecter le client courant.

Traitement attendu :

  • remettre ClientCourant Ă  null ;
  • retourner true.

TrouverClient()​

Implémenter la méthode suivante :

public Client TrouverClient(string pNumClient)

Cette méthode recherche un client à partir de son numéro.

  • Si un client correspondant est trouvĂ©, la mĂ©thode retourne cet objet Client.
  • Sinon, elle retourne null.

Chargement des données​

Le système utilise deux fichiers CSV :

Fichier des clients​

Chaque ligne contient un client au format suivant :

NumClient,Nom,MotDePasse,Role,SorteCompte,Solde

Exemple​

000001,Tremblay,abc123,0,1,5000

Fichier des transactions​

Chaque ligne contient une transaction au format suivant :

SorteTransaction,NumClient,Date,Montant

Exemple​

0,000001,2026-03-15 09:45:00,200

Rôle de la classe​

La classe ServiceGuichet centralise les principales opérations du système :

  • chargement des clients ;
  • chargement des transactions ;
  • recherche d’un client ;
  • crĂ©ation d’une transaction ;
  • connexion et dĂ©connexion ;
  • sauvegarde des donnĂ©es.

Elle sert donc de point d’accès principal pour manipuler les données du guichet.


Formulaires à compléter​

Compléter les formulaires fournis en reliant correctement les contrôles à la logique des classes implémentées, afin d’assurer le bon fonctionnement de l’application.