🧪 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.
💡 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);
💡 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;
🧪 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Ăą :
0représente la valeur numérique de l’énumérationSorteTransactions000001est le numéro du client2026-03-15 09:45:00est la date de la transaction200est 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Ăą :
000001représente le numéro du clientTremblayreprésente le nom du clientabc123représente le mot de passe0représente la valeur numérique de l’énumérationRoles1représente la valeur numérique de l’énumérationSorteComptes5000repré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 Ă
ClientCourantet retournertrue; - 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.