TP Banque, gestion des aggios

Version pdf

Auteur : Xavier Coelembier

On se propose d'utiliser la classe Compte (cf. TP Comptes) afin de gérer également les mouvements bancaires.

Pour commencer, vous aller récupérer la classe Compte (légèrement modifiée). Une classe AppBanque est présente également, elle servira à tester les différentes classes.

Nouvelles règles de gestion

1) Construction du diagramme de Classes.

- La banque regroupe les différents comptes.

Travail à faire

Question 1.1 Proposer un diagramme de classes dans lequel figurent les deux classes, Compte et Banque. Vous ferez figurer les attributs de la classe Compte (à partir de l'analyse du fichier), les relations, les valeurs de multiplicité ainsi qu'une proposition de navigabilité.

Solution

- Un mouvement bancaire est une opération concernant un compte. Un mouvement a une date de réalisation, un montant (en crédit ou en débit) et est d'un certain type. Un compte n'est réellement modifié par un mouvement que le jour correspondant à la date de valeur du mouvement. Ainsi par exemple, un dépot de chèque peut être fait le 2 novembre 2004, mais le compte ne sera crédité que le 6 novembre, soit 4 jours plus tard. Si le compte est débiteur (solde inférieur à 0), le titulaire doit payer des aggios sur le montant du débit pendant la durée du solde débiteur et à un taux fixé par la banque. La durée des soldes débiteurs dépend des dates de valeurs des mouvements.

- Un type de mouvement caractérise une opération, et détermine ainsi la date de valeur de ce mouvement. Nous prendrons en compte qu'un nombre limité de mouvements :

Type Code Délais en nb de jours pour la mise en valeur Commentaire
Prélèvement pre 0  
Chèque débité ch 0  
Chèque déposé dch 4  
Dépot d'espèce des 0  
Virement vir 0 En débit ou en crédit
Retrait distributeur dab -1  
Intérêt des aggios int 0 Sont toujours débités
Retrait en guichet ret -1  

Travail à faire.

Question 1.2 Compléter le diagramme de classe en faisant figurer les nouvelles classes (avec les attributs) et leurs relations.

Solution

L'objectifs de la nouvelle application est de gérer les mouvements et de calculer les éventuels aggios.

On vous fournit le diagramme de classe dans lequel figurent toutes les classes.

Diagramme de classes.

Travail à faire

Question 1.3 A qui sert la classe Ecran? Quel est son intérêt ? Quelles relations a-t-elle avec les autres classes ?

Réponse

Question 1.4 La classe Paramètre ne contient qu'une seule méthode statique GetTaux() -le taux ext fixé à 0.0021-. Ecrire le code de cette classe ainsi qu'un appel à sa méthode dans une classe extérieure, fonction Main par exemple.

Réponse

Remarque : dans le diagramme de classes on peut voir une association entre la classe Banque et la classe Type ; ce choix de conception est nécessaire pour la suite du TP.

2) Etude du code des classes

On vous fournit un extrait de la classe Banque :

class Banque{

         public Banque() {
                   mesComptes= new ArrayList();
                   mesTypes = new ArrayList();
          }

          public void AjouteType(string libel , int nbJour) {
                   Type t = new Type(libel, nbJour);
                   AjouteType(t);
           }

           public void AjouteType(Type unType) {
                     mesTypes.Add(unType);
            }

// les attributs classe Banque
private ArrayList mesComptes;
private ArrayList mesTypes;
}

Travail à faire

Question 2.1 Quels sont les attributs de la classe ? Quels rôles jouent ils ?

Reponse

Question 2.2 En utilisant l'aide MSDN (touche F1 sur ArrayList), indiquer en quelques phrases les services rendus par cette classe. Quels sont ses avantages comparés avec la classe tableau?

Reponse

 

Question 2.3 Que font les méthodes AjouteType ?

Réponse

 

3) Codage des classes

Intégrer le code qui crée la banque et lui ajoute des types.

using System;
using System.Collections;
class AppBanques {
            static void Main() {

                 // *********A àjouter*****************
                     Banque b = new Banque();
                     b.AjouteType("ch",0);
                     b.AjouteType("pre",0);
                     b.AjouteType("dab",-1);
                     b.AjouteType("ret",-1);
                     b.AjouteType("vir",0);
                     b.AjouteType("dch",4);
                     b.AjouteType("des",0);
                     b.AjouteType("int",0);

               // **********Fin ajout*****************
            }

}

Travail à faire

Question 3.1 Ecrire la classe Type ; elle proposera un constructeur à deux arguments et

deux accesseurs sur ses attributs privés. Compiler.

Question 3.2 Ecrire la méthode publique AjouteCompte(…) de la classe Banque qui permet de créer un Compte et de l'ajouter à la collection mesComptes de la classe Banque. Tester en écrivant :
                DateTime d1 = Convert.ToDateTime( "02/01/2004");
                b.AjouteCompte(12345,"toto",0,-5000,d1);

Question 3.3 Gestion de l'affichage. Ecrire la classe Ecran qui contiendra une méthode statique surchargée :

  • Affiche( Compte unCompte); // affiche les infos d'un compte

                 Tester dans le Main avec :

                 Compte c = new Compte(123, "Bison",100,-1000,d1);

                 Ecran.Affiche(c);

Vous devez obtenir :

  • Affiche (Banque uneBanque, int nbComptes); // affiche nb premiers comptes : pour cela un accesseur GetCompte(int indiceCompte) est nécessaire dans la classe Banque)

                Tester dans le Main avec :

                d1 = Convert.ToDateTime( "06/04/2004");
                b.AjouteCompte(45657, "titi",0,-1000,d1);
                d1 = Convert.ToDateTime( "02/02/2004");
                b.AjouteCompte(32345,"dupond",0,-1500,d1);
                d1 = Convert.ToDateTime( "03/03/2004");
                b.AjouteCompte(11633, "durand",0,-500,d1);
                d1 = Convert.ToDateTime( "05/04/2004");
                b.AjouteCompte(2568,"dubois",0,-500,d1);
                d1 = Convert.ToDateTime( "06/06/2004");
                b.AjouteCompte(8978, "duval",0,-2000,d1);
                d1 = Convert.ToDateTime("01/09/2004");
                b.AjouteCompte(1245, "dutronc",0,-500,d1);
                Ecran.Affiche(b,6);

Vous devez obtenir :

Question 3.4 Ecrire une méthode publique RendCompte(…) de la classe Banque qui retourne un Compte en fonction de son numéro. La Fonction retourne null si le compte n'est pas trouvé. Tester en écrivant :

              Ecran.Affiche(b.RendCompte(1245));

Vous devez obtenir :

4) Les méthodes des classes Mouvement et Banque

La classe Mouvement se présente ainsi :

class Mouvement : IComparable {
            public int CompareTo(object obj) {
                           if (obj == null)
                                      return 1;
                            if (obj.GetType() != this.GetType())
                                  throw new ArgumentException("Comparaison invalide");
                            Mouvement mvt1 = (Mouvement)obj;
                            int result = this.GetValeur().CompareTo(mvt1.GetValeur());
                            return result;
              }
            // les attributs classe Mouvement
            private float Montant;
            private float SoldeAvant;
            private DateTime DateMvt;
            private Type monType;
}

Remarque : ne vous attardez pas sur ce qui est encore un peu obscur !! regardez seulement pour l'instant les attributs.

Travail à faire

Question 4.1 Ecrire un constructeur à 4 arguments ainsi que les accesseurs. Créer un Mouvement, compiler.

Question 4.2 Ecrire la méthode Affiche(Mouvement) de la classe Ecran. Vous écrirez au préalable un accesseur GetType(int indiceType) dans la classe Banque.

Tester avec :

d1 = Convert.ToDateTime("02/11/2004");
Mouvement m = new Mouvement(100,1000,b.GetType(1), d1);

Ecran.Affiche(m);

Question 4.3 Surchargez (écrire une nouvelle méthode de même nom) la méthode GetType(string libType) de la classe Banque permettant de récupérer le type connaissant son libellé. Tester après avoir écrit une nouvelle méthode Affiche de la classe Ecran permettant d'afficher les informations d'un objet de la classe Type.

Tester avec :

Ecran.Affiche(b.GetType("vir"));

C'est la classe Banque qui déclenchera les mouvements grâce à la méthode EffectuerMvt :

public void EffectuerMvt(int num,DateTime dMvt,float montant,String TMvt) {
           Type t1 = this.GetType(TMvt);
           Compte c1 = this.RendCompte(num);
            if (c1!=null)
                    if (montant < 0)
                            c1.Debiter(montant,t1,dMvt);
                     else
                             c1.Crediter(montant,t1,dMvt);
}

Travail à faire

Question 4.4 Après avoir intégré la méthode EffectuerMvt dans le code, écrire les méthodes Crediter et Debiter de la classe Compte.

Tester avec :

        d1 = Convert.ToDateTime("01/09/2004");
        b.EffectuerMvt(12345,d1,1000,"des");
        b.EffectuerMvt(12345,d1,-3000,"ch");
        d1 = Convert.ToDateTime("02/09/2004");
         b.EffectuerMvt(12345,d1,1000,"dch");
         d1 = Convert.ToDateTime("04/09/2004");
         b.EffectuerMvt(12345,d1,3000,"vir");
         d1 = Convert.ToDateTime("05/09/2004");
         b.EffectuerMvt(12345,d1,-1000,"dab");
         d1 = Convert.ToDateTime("10/09/2004");
          b.EffectuerMvt(12345,d1,-5000,"dab");
          d1 = Convert.ToDateTime("02/01/2004");
          b.EffectuerMvt(12345,d1,1000,"dch");
         d1 = Convert.ToDateTime("27/10/2004");
         b.EffectuerMvt(12345,d1,-1500,"dab");
         Ecran.Affiche(b.RendCompte(12345));

Ceci doit produire :

Méthode GetValeur de la classe Mouvement

Question 4.5 Ecrire la méthode GetDateValeur() : DateTime de la classe Mouvement qui va permettre de calculer la date de valeur d'un mouvement. Elle s'obtient en ajoutant le nombre de jour à la date du mouvement.

Ce nombre est présent dans l'occurrence de la classe Type rattachée au mouvement.
Si ce nombre est positif et la date obtenue est un dimanche alors la date de valeur est le lundi suivant.
Si ce nombre est négatif et la date obtenue est un dimanche alors la date de valeur est le vendredi précédent.
Si ce nombre est négatif et la date obtenue est un samedi alors la date de valeur est le vendredi précédent.

Remarque : vous regarderez dans MSDN la classe DateTime

Modifier la méthode Affiche (unMvt Mouvement) de la classe écran pour afficher cette date de valeur.
Tester en écrivant :

Ecran.Affiche(b.RendCompte(12345));

Vous devez obtenir :

5) le calcul des aggios.

Méthode CalculAgios (DtDébut, DtFin : DateTime) : réel de la classe Compte.

Un calcul d'agios s'effectue pour une période donnée (date début date de fin), il consiste à recalculer le solde du compte en date de valeur et si le solde est négatif calculer pendant combien de jours voici ses principales phases :

  • a) extraction des mouvements dont la date de mouvement est >= à la date de début et <= à la date de fin (utiliser une collection pour recevoir les mouvements extraits)
  • b) trier les mouvements extraits sur la date de valeur (Cf. méthodes de la collection)
  • c) calcul du solde de début de période :
    - Solde avant du premier mouvement de la période (si il y a des mouvements extraits)
    - Si aucun mouvement pour la période : solde avant du premier mouvement supérieur à la date de fin, si il n'y a pas de mouvement supérieur à la date de Fin prendre le solde du compte.
  • d) si le solde à une date de valeur est débiteur (inférieur à zéro) calculez les agios :
    nbJ = nombre de jours entre la date de valeur du solde débiteur et la date de valeur du mouvement suivant ,
    agios = solde * nbJ * Taux.
  • e) cumulez les agios sur la période.

Question 5.1 Ecrire une méthode CalculAgios(…) de la classe banque qui :
          Calcule les agios pour le compte passé en paramètre
          Génère le mouvement et le débit des agios sur le compte avec le type de mouvement " int "

Testez avec :
      DateTime debutA = Convert.ToDateTime("01/09/2004");
      DateTime finA = Convert.ToDateTime("30/09/2004");
      b.CalculAgios(12345,debutA,finA,"int");
     Ecran.Affiche(b.RendCompte(12345));

Vous devez obtenir :

Question 5.2 Ecrire une méthode CalculAgios(…) de la classe Banque pour calculer les agios de tous les comptes

Testez avec :
          d1 = Convert.ToDateTime("01/09/2004");
          b.EffectuerMvt(45657,d1,2000,"des");
          b.EffectuerMvt(32345,d1,1500,"des");
          b.EffectuerMvt(11633,d1,1200,"des");
          d1 = Convert.ToDateTime("01/09/2004");
          b.EffectuerMvt(8978,d1,750,"des");
          b.EffectuerMvt(8978,d1,-1750,"ret");
          DateTime debutA = Convert.ToDateTime("01/09/2004");
          DateTime finA = Convert.ToDateTime("30/09/2004");
          b.CalculAgios(debutA,finA,"int");

          int nbCompte = b.getNbComptes(); // il faut écrire cette nouvelle méthode qui renvoie le nombre de comptes dans la collection          

Ecran.Affiche(b,nbCompte);

Vous devez obtenir :