4. TP 1 : Gestion basique d'une fiche de paie
4.1. Introduction
Pour appliquer ce qui a été vu précédemment, nous proposons maintenant un travail consistant à écrire un client Android pour tablette, permettant de simuler des calculs de feuille de salaire des employés d'une association.
L'application aura une architecture client / serveur :

- le serveur [1] est founi ;
- il faut construire le client Android [2].
4.2. La base de données
4.2.1. Définition
Les données statiques utiles pour construire la fiche de paie seront placées dans une base de données que nous désignerons par la suite dbpam. Cette base de données a les tables suivantes :
Structure :
clé primaire | |
n° de version – augmente à chaque modification de la ligne | |
numéro de sécurité sociale de l'employé - unique | |
nom de l'employé | |
son prénom | |
son adresse | |
sa ville | |
son code postal | |
clé étrangère sur le champ [ID] de la table [INDEMNITES] |
Son contenu pourrait être le suivant :

Structure :
clé primaire | |
n° de version – augmente à chaque modification de la ligne | |
pourcentage : contribution sociale généralisée + contribution au remboursement de la dette sociale | |
pourcentage : contribution sociale généralisée déductible | |
pourcentage : sécurité sociale, veuvage, vieillesse | |
pourcentage : retraite complémentaire + assurance chômage |
Son contenu pourrait être le suivant :

Les taux des cotisations sociales sont indépendants du salarié. La table précédente n'a qu'une ligne.
clé primaire | |
n° de version – augmente à chaque modification de la ligne | |
indice de traitement - unique | |
prix net en euro d’une heure de garde | |
indemnité d’entretien en euro par jour de garde | |
indemnité de repas en euro par jour de garde | |
indemnité de congés payés. C'est un pourcentage à appliquer au salaire de base. |
Son contenu pourrait être le suivant :

On notera que les indemnités peuvent varier d'une assistante maternelle à une autre. Elles sont en effet associées à une assistante maternelle précise via l'indice de traitement de celle-ci. Ainsi Mme Marie Jouveinal qui a un indice de traitement de 2 (table EMPLOYES) a un salaire horaire de 2,1 euro (table INDEMNITES).
4.2.2. Génération
Le script [dbpam_hibernate.sql] de génération de la base de données est fourni :
![]() |
Créez la base de données [dbpam_hibernate] (c'est le nom de la BD que le serveur web / jSON exploite) et faites en sorte que le login root sans mot de passe puisse y accéder. Vous pouvez procéder ainsi :
Lancez MySQL puis [PhpMyAdmin] :
![]() | ![]() |
- [1-2] : importez le script [dbpam_hibernate.sql] puis exécutez-le ;
4.2.3. Modélisation Java de la base de données
Les éléments des tables [EMPLOYES], [INDEMNITES] et [COTISATIONS] sont modélisés par les classes suivantes :
package pam.entities;
import java.io.Serializable;
public class Employe implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private int version;
private String SS;
private String nom;
private String prenom;
private String adresse;
private String ville;
private String codePostal;
private int idIndemnite;
private Indemnite indemnite;
public Employe() {
}
public Employe(String SS, String nom, String prenom, String adresse, String ville, String codePostal, Indemnite indemnite) {
...
}
// getters et setters
....
}
- lignes 8-15 : ces champs correspondent aux colonnes de la table [EMPLOYES] ;
- ligne 16 : le champ [indemniteId] correspond à la colonne [INDEMNITE_ID] qui est la clé étrangère de la table [EMPLOYES] ;
- ligne 17 : l'indemnité de l'employé. Ce champ n'est pas toujours renseigné :
- il ne l'est pas lorsqu'on demande l'URL [/employes],
- il l'est lorsqu'on demande l'URL [/salaire] ;
package pam.entities;
import java.io.Serializable;
public class Indemnite implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private int version;
private int indice;
private double baseHeure;
private double entretienJour;
private double repasJour;
private double indemnitesCp;
public Indemnite() {
}
public Indemnite(int indice, double baseHeure, double entretienJour, double repasJour, double indemnitesCP) {
...
}
// getters et setters
....
}
- lignes 8-14 : les champs correspondent aux colonnes de la table [INDEMNITES] ;
package pam.entities;
import java.io.Serializable;
public class Cotisation implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private int version;
private double csgrds;
private double csgd;
private double secu;
private double retraite;
public Cotisation() {
}
public Cotisation(double csgrds, double csgd, double secu, double retraite) {
...
}
// getters et setters
...
}
- lignes 8-13 : les champs correspondent aux colonnes de la table [COTISATIONS] ;
4.3. Installation du serveur web / jSON
![]() |
4.3.1. Installation
Le binaire Java du serveur web / jSON vous est fourni :
![]() |
Pour lancer le serveur web / jSON, procédez de la façon suivante :
- lancez le SGBD MySQL ;
- assurez-vous que la BD [dbpam_hibernate] existe ;
- ouvrez une fenêtre DOS ;
- placez vous dans le dossier du jar ;
- tapez la commande :
Cela suppose que le binaire [java.exe] est dans le PATH de votre machine. Si ce n'est pas le cas, tapez le chemin complet de [java.exe], par exemple :
Des logs s'affichent :
- ligne 16 : l'URL [/salaire/{SS}/{ht}/{jt}] est découverte ;
- ligne 17 : l'URL [/employes] est découverte ;
4.3.2. Les URL du service web/jSON
![]() |
Le service web / jSON est implémenté par Spring MVC et expose deux URL :
@RequestMapping(value = "/employes", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public EmployesResponse getEmployes() {
...
@RequestMapping(value = "/salaire/{SS}/{ht}/{jt}", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public FeuilleSalaireResponse getFeuilleSalaire(@PathVariable("SS") String SS, @PathVariable("ht") double ht, @PathVariable("jt") int jt) {
Le service web accepte les deux URL suivantes :
- ligne 1 : /employes : pour avoir la liste des employés ;
- ligne 4 : /salaire/SS/ht/jt : pour avoir la feuille de salaire de l'employé de n° [SS] ayant travaillé [ht] heures pendant [jt] jours ;
Voici des copies d'écran montrant cela.
On demande les employés :

On coupe la base, on relance le serveur et on demande les employés :

On demande un salaire :

On demande le salaire d'une personne inexistante :

4.3.3. Les réponses jSON du service web/jSON
![]() |
![]() |
Les URL du service web / jSON envoient des réponses de type [Response<T>] :
package client.android.dao.service;
import java.util.List;
public class Response<T> {
// ----------------- propriétés
// statut de l'opération
private int status;
// les éventuels messages d'status
private List<String> messages;
// le corps de la réponse
private T body;
// constructeurs
public Response() {
}
public Response(int status, List<String> messages, T body) {
this.status = status;
this.messages = messages;
this.body = body;
}
// getters et setters
...
}
- l'URL [/employes] renvoie un type Response<List<Employe>> ;
- l'URL [/salaire] renvoie un type Response<FeuilleSalaire> ;
La classe [FeuilleSalaire] est la suivante :
package pam.entities;
import java.io.Serializable;
public class FeuilleSalaire implements Serializable {
private static final long serialVersionUID = 1L;
// champs privés
private Employe employe;
private Cotisation cotisation;
private ElementsSalaire elementsSalaire;
// constructeurs
public FeuilleSalaire() {
}
public FeuilleSalaire(Employe employe, Cotisation cotisation, ElementsSalaire elementsSalaire) {
...
}
// getters et setters
...
}
- ligne 9 : la classe [Employe] a été présentée paragraphe 4.2.3;
- ligne 10 : la classe [Cotisation] a été présentée paragraphe 4.2.3 ;
La classe [ElementsSalaire] (ligne 11) est la suivante :
package pam.entities;
import java.io.Serializable;
public class ElementsSalaire implements Serializable {
private static final long serialVersionUID = 1L;
// champs privés
private double salaireBase;
private double cotisationsSociales;
private double indemnitesEntretien;
private double indemnitesRepas;
private double salaireNet;
// constructeurs
public ElementsSalaire() {
}
public ElementsSalaire(double salaireBase, double cotisationsSociales, double indemnitesEntretien, double indemnitesRepas, double salaireNet) {
...
}
// getters et setters
...
}
4.4. Tests du client Android
![]() |
Le binaire exécutable du client Android terminé vous est donné :
![]() |
Avec la souris déposez le binaire [pam-client.apk] ci-dessus sur un émulateur de tablette [GenyMotion]. Il va alors être enregistré puis exécuté. Lancez également le serveur web / jSON si ce n'est déjà fait. Le client Android a pour objet de récupérer les informations renvoyées par le serveur web / jSON et de les mettre en forme. Les différentes vues du client Android sont les suivantes :
Il faut tout d'abord se connecter au service web / jSON :

- en [1], on donne l'URL du service web / jSON. Avec l'émulateur, mettez l'une des adresses IP du PC (mais pas 127.0.0.1). Avec une tablette, mettez l'adresse wifi de la machine du serveur web / jSON et inhibez le pare-feu du poste serveur s'il en a un car il risque de bloquer les appels entrants ;
- en [2], on se connecte ;
On arrive alors à la page de simulation :

- en [3], on choisit un employé ;
- en [4], on indique un nombre d'heures ;
- en [5], on indique un nombre de jours ;
- en [6], on demande la simulation ;
La page de simulation obtenue est la suivante :

- en [7], la simulation obtenue ;
- en [8], on l'enregistre ;

- en [9], la liste des simulations ;
- en [10], on retire une simulation ;

- en [11], il n'y a plus de simulations ;
- en [12], on retourne au formulaire de simulation ;

- en [13], on retrouve le formulaire ;
- en [14], on revient vers la page de configuration;

- en [15], on retrouve le formulaire de connexion initial.
4.5. Travail à faire
Le squelette du client Android présenté précédemment vous est donné. Il a été construit à partir du projet [client-android-skel] décrit au paragraphe 2.
![]() |
Le projet est exécutable et a déjà les vues nécessaires. Il y a simplement du code à rajouter pour que l'application fasse ce qu'elle a à faire. La procédure à suivre est la suivante :
- exécutez la version complète pour appréhender le travail à faire ;
- exécutez la version allégée et étudiez le code de celle-ci. Il respecte les méthodes de conception utilisées dans les pages précédentes ;
- ajoutez le code manquant ;










