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
2) Les retenues.
Le salarié verse différentes cotisations qui vont être déduites sur salaire brut, elles sont calculées à partir du salaire brut.
B) L'application
1) La classe Bulletin.
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.
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.
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
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
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 :
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.
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).