TP bulletins de salaires

L'entreprise Camaurel, spécialisée dans les installations électriques chez les particuliers et les petites entreprises, souhaite développer un logiciel de gestion des bulletins de salaires de ses salariés non cadres. Tous les salariés sont à temps plein.

L'application de concernera que les parties salariales des éléments du salaire, à l'exclusion dons des charges patronales.

En phase de test, le logiciel sera développé en C#, en mode console.

A) Les éléments du salaire.
1) Le salaire brut

Le salarié verse différentes cotisations qui vont être déduites sur salaire brut, elles sont calculées à partir du salaire brut.

Elle représente un bulletin de salaire mensuel d'un salarié. Dans un premier temps, nous ne tiendons compte que du salaire de base (sans les HS).

Cette classe contiendra deux attributs : le numéro du mois (de 1 à 12 ) et le salaire horaire de base. Cette classe aura les responsabilités suivantes :

Travail à faire.
Faire le diagramme de cette classe en faisant appaître les attributs et signatures des méthodes.

Solution

2) La classe Parametre

De nombreux paramètres sont utilisés, pouvant évoluer dans le temps (les différents taux, les maxima...) ; nous allons créer une classe Parametre qui va retourner chacun de ces éléments. Cette classe ne contiendra que des méthodes statiques. On dit d'une telle classe qu'elle est utilitaire.

Travail à faire.
Faire le diagramme de cette classe en faisant appaître les signatures des méthodes.

Solution

3) Code de la classe Parametre

Nous allons commencer par écrire le code de la classe Parametre.

Travail à faire.
Créer un projet console en C# avec Visual Studio ; nommez-le tpSalaire. Changer le nom de la classe créée : Appsalaire. Ajouter une classe Parametre.
Ecrire le code de cette classe. Chaque méthode retourne simplement une valeur, la valeur actuelle indiquée dans l'énoncé.

4) Code partiel de la classe Bulletin

Travail à faire.
Ecrire la déclaration de la classe Bulletin (conforme au diagramme de classe). Les fonctions retourneront une valeurs nulles (dans un pemier temps)
Ajouter deux constructeurs ; un par défaut et l'autre avec deux arguments afin de valoriser les deux champs. Ecrire également deux accesseurs sur les champs privés. Créer deux instances de Bulletin. Générer la solution.

          4.a La classe Ecran

Afin de tester cette classe, on va utiliser une classe Ecran qui ne contiendra qu'une seule méthode statique (pour le moment) :

public static void Afficher(Bulletin b)         // affiche les éléments du salaire : salaire de base, montant HS, salaire brut, retenues,..., salaire net

          4.b Les méthodes de la classe Bulletin

Les calculs des retenues dépendent du salaire brut : salaire mensuel de base + Heures sup. Dans un premier temps, les heures sup seront fixées en dur dans le code afin de tester le salaire brut, les montants des retenues et le salaire net.

Modifier le code de la méthode nbHS() :

public double nbHS()
{
         return 25;
}

Travail à faire
Ecrire dans l'ordre les méthodes suivantes :
- salaireBase() : les employés sont a plein temps et effectue la durée mensuelle légale du travail
- montantHS() : calculés à partir des heures supplémentaires effectuées
- salaireBrut()
- retenuesSS(), retenueCSG(), retenueChomage()
- retenueRetraite() : tenir compte des plafonds
-salaireNet()

Tester avec :

static void Main(string[] args)
{
       Bulletin b = new Bulletin(1, 15);
       Ecran.afficher(b);
}

Ce qui produit la sortie suivante :

et avec :

static void Main(string[] args)
{
       Bulletin b = new Bulletin(1, 25);
       Ecran.afficher(b);
}

Ce qui produit la sortie suivante :

5) Gestion des horaires

Les bulletins de salaire dépendent des heures travaillées, c'est à dire de relevés hebdomadaires qui permettront ainsi de déterminer les heures supplémentaires.
A chaque bulletin correspond plusieurs relevés (4 ou 5 selon les mois). Les heures supplémentaires sont calculées à partir du maximum légal mensuel ; ainsi chaque heure qui dépasse ce maximum légal mensuel est considérée comme une heure supplémentaire.

               5.1 La classe ReleveHebdo

Cette classe contiendra deux champs : le numéro d'ordre (pour le mois) et le nombre d'heures travaillées.
Ses responsabilités sont très limitées : fournir uniquement ses informations.

Travail à faire.
Dessiner le diagramme de la classe ReleveHebdo

Solution

           5.2 Code de la classe ReleveHebdo

La classe possède un seul constructeur, à deux arguments, ainsi que deux accesseurs.
Travail à faire.
Ecrire le code de la la classe ReleveHebdo

          5.3 Retour sur la classe Bulletin

Les relevés sont associés à un Bulletin.
Travail à faire.
Dessiner le diagramme des classes Bulletin et ReleveHebdo

Solution

L'association sera réalisée grâce à une ArrayList dans la classe Bulletin :
- Ajouter le namespace : using System.Collections;
- Ajouter la déclaration et la construction du nouveau champs : private ArrayList mesReleves = new ArrayList();

La classe Bulletin a la responsabilité de construire et d'ajouter les relevés :

Travail à faire.
Ajouter une nouvelle méthode publique :
                 void ajoutReleve( int numero, Double nbHeures)
dans la classe Bulletin ; écrire son code.

La méthode nbHS de la classe Bulletin peut maintenant être écrite ; elle cumule les heures des relevés et détermine ainsi le nombre d'heures supplémentaires.
Utiliser la clause foreach pour parcourir l'ArrayList.

Travail à faire
Ecrire la méthode nbHS ; tester avec :

Bulletin b = new Bulletin(1, 15);
b.ajouterReleve(1, 42);
b.ajouterReleve(2, 40);
b.ajouterReleve(3, 35);
b.ajouterReleve(4, 42);
Ecran.afficher(b); 

qui affiche :

Ainsi que :

Bulletin b = new Bulletin(1, 15);
b.ajouterReleve(1, 35);
b.ajouterReleve(2, 35);
b.ajouterReleve(3, 35);
b.ajouterReleve(4, 35);
Ecran.afficher(b);

qui affiche

6) Une classe Salarie.

Cette classe permettra de rassembler les bulletins d'un salarié pour une année. Cette classe n'aura qu'un seul champ : le nom du salarié.

Ajouter cette classe dans le diagramme de classe :

Solution

Travail à faire
Ecrire le code de cette classe :
- Un constructeur à un argument
- Une ArrayList pour enregistrer les bulletins : mesBulletins
- Une méthode void ajouterBulletin( Bulletin b) qui l'ajoute dans mesBulletins.

Une méthode de la classe permet de cumuler les salaires nets :
                                  public float salaireAnnuel()

Travail à faire
Ecrire le code de cette méthode. Pour tester cette méthode, ajouter une méthode statique dans la classe écran (afficher(Salarie s) )qui affiche le nom du salairié et son salaire net. Ecrire l' accesseur nécessaire.

Tester avec :

Bulletin b1 = new Bulletin(1, 16);
b1.ajouterReleve(1, 35);
b1.ajouterReleve(2, 39);
b1.ajouterReleve(3, 35);
b1.ajouterReleve(4, 41);
Bulletin b2 = new Bulletin(2, 16);
b2.ajouterReleve(1, 39);
b2.ajouterReleve(2, 38);
b2.ajouterReleve(3, 43);
b2.ajouterReleve(4, 41);
Bulletin b3 = new Bulletin(3, 16);
b3.ajouterReleve(1, 39);
b3.ajouterReleve(2, 38);
b3.ajouterReleve(3, 43);
b3.ajouterReleve(4, 41);
Bulletin b4 = new Bulletin(4, 17);
b4.ajouterReleve(1, 35);
b4.ajouterReleve(2, 40);
b4.ajouterReleve(3, 35);
b4.ajouterReleve(4, 38);
Salarie s = new Salarie("toto");
s.ajouterBulletin(b1);
s.ajouterBulletin(b2);
s.ajouterBulletin(b3);
s.ajouterBulletin(b4);
Ecran.afficher(s);

Ce qui doit donner :

Travail à faire
La classe Salarie ne propose qu'une seule méthode ; imaginer d'autres services qu'elle pourrait rendre. Ajouter les méthodes en conséquence.

7) La persistance des informations. Une classe de persistance
Actuellement les données sont conservées en mémoire ; il n'y a pas de sauvegarde des informations sur un support de masse.
nous allons utliser un mécanisme qui va nous permettre de sauvegarder les instances des classes créées : la sérialisation.

Lire à ce propos.

Nous allons créer une classe PersisteSalarie qui permettra d'écrire les appels suivants :

...suite du code fourni plus haut et qui valorise un salarie
s.ajouterBulletin(b4);
Ecran.afficher(s);
PersisteSalarie.sauve(s, "salarie.sr");
Salarie s1 = PersisteSalarie.charge("salarie.sr");
Ecran.afficher(s1);

Remarque : le salarie s est lu à partir de la mémoire, le salarie s1 est désérialisé.

Travail à faire
Créer la classe PersisteSalarie qui ne contiendra que deux méthodes statiques (utiliser la sérialisation binaire).