4. TP 1: Basisbeheer van een loonstrook
4.1. Introduction
Om het eerder geleerde in de praktijk te brengen, stellen we nu een opdracht voor waarbij je een Android-client voor tablets moet schrijven waarmee de loonberekeningen van de medewerkers van een vereniging kunnen worden gesimuleerd.
De applicatie krijgt een client-serverarchitectuur:

- de server [1] wordt meegeleverd;
- de Android-client [2] moet worden gebouwd.
4.2. De database
4.2.1. Definitie
De statische gegevens die nodig zijn voor het opstellen van de loonstrook worden opgeslagen in een database die we hierna de dbpam- e noemen. Deze database bevat de volgende tabellen:
Structuur:
primaire sleutel | |
versienummer – loopt op bij elke wijziging van de rij | |
sofinummer van de werknemer – uniek | |
naam van de werknemer | |
zijn voornaam | |
zijn adres | |
zijn woonplaats | |
zijn postcode | |
vreemde sleutel in het veld [ID] van de tabel [INDEMNITES] |
De inhoud zou als volgt kunnen zijn:

Structuur:
primaire sleutel | |
versienummer – loopt op bij elke wijziging van de regel | |
percentage: algemene sociale bijdrage + bijdrage aan de aflossing van de sociale schuld | |
percentage: aftrekbare algemene sociale bijdrage | |
percentage: sociale zekerheid, weduwschap, ouderdom | |
percentage: aanvullend pensioen + werkloosheidsverzekering |
De inhoud zou als volgt kunnen zijn:
![]()
De sociale premiepercentages zijn onafhankelijk van de werknemer. De bovenstaande tabel bevat slechts één rij.
primaire sleutel | |
versienummer – loopt op bij elke wijziging van de regel | |
verwerkingsindex – uniek | |
nettoprijs in euro's voor een uur wachtdienst | |
vergoeding voor levensonderhoud in euro per dag dienst | |
maaltijdvergoeding in euro per dag dienst | |
vergoeding voor betaald verlof. Dit is een percentage dat op het basisloon moet worden toegepast. |
De inhoud zou als volgt kunnen zijn:

Er zij op gewezen dat de vergoedingen van kinderoppas tot kinderoppas kunnen verschillen. Ze zijn namelijk gekoppeld aan een specifieke kinderoppas via diens salarisindex. Zo heeft mevrouw Marie Jouveinal, die een salarisindex van 2 heeft (tabel EMPLOYES), een uurloon van 2,1 euro (tabel INDEMNITES).
4.2.2. Genereren
Het script [dbpam_hibernate.sql] voor het genereren van de database wordt meegeleverd:
![]() |
Maak de database [dbpam_hibernate] aan (dit is de naam van de database BD die door de webserver / jSON wordt gebruikt) en zorg ervoor dat de login root zonder wachtwoord toegang heeft tot deze database. U kunt dit als volgt doen:
Start MySQL en vervolgens [PhpMyAdmin]:
![]() | ![]() |
- [1-2]: importeer het script [dbpam_hibernate.sql] en voer het vervolgens uit;
4.2.3. Java-modellering van de database
De elementen van de tabellen [EMPLOYES], [INDEMNITES] en [COTISATIONS] worden gemodelleerd door de volgende klassen:
[Employe]
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 en setters
....
}
- regels 8-15: deze velden komen overeen met de kolommen van de tabel [EMPLOYES];
- regel 16: het veld [indemniteId] komt overeen met de kolom [INDEMNITE_ID], die de vreemde sleutel is van de tabel [EMPLOYES];
- regel 17: de vergoeding van de werknemer. Dit veld is niet altijd ingevuld:
- het is niet ingevuld wanneer URL [/employes] wordt opgevraagd,
- het is wel ingevuld wanneer de URL en [/salaire] worden opgevraagd;
[Indemnite]
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 en setters
....
}
- regels 8-14: de velden komen overeen met de kolommen van de tabel [INDEMNITES];
[Cotisation]
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 en setters
...
}
- regels 8-13: de velden komen overeen met de kolommen van de tabel [COTISATIONS];
4.3. Installatie van de webserver / jSON
![]() |
4.3.1. Installatie
Het Java-uitvoeringsbestand van de webserver / jSON wordt u verstrekt:
![]() |
Ga als volgt te werk om de webserver / jSON te starten:
- start SGBD MySQL;
- controleer of BD en [dbpam_hibernate] aanwezig zijn;
- open een venster DOS;
- ga naar de map van het jar-bestand;
- typ de opdracht:
Hierbij wordt ervan uitgegaan dat het binaire bestand [java.exe] zich in de map PATH op uw computer bevindt. Als dit niet het geval is, voer dan het volledige pad naar [java.exe] in, bijvoorbeeld:
Er worden logbestanden weergegeven:
- regel 16: URL [/salaire/{SS}/{ht}/{jt}] wordt gevonden;
- regel 17: URL [/employes] wordt gedetecteerd;
4.3.2. De URL van de webservice/jSON
![]() |
De webservice / jSON wordt geïmplementeerd door Spring MVC en stelt twee URL beschikbaar:
@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) {
De webservice accepteert de volgende twee URL:
- regel 1: /employes: om de lijst met werknemers op te vragen;
- regel 4: /salaire/SS/ht/jt: om de loonstrook op te vragen van de medewerker met nr. [SS] die [ht] uur heeft gewerkt gedurende [jt] dagen;
Hieronder staan enkele schermafbeeldingen die dit illustreren.
We vragen de werknemers:

We verwijderen de database, starten de server opnieuw op en vragen de werknemers op:

We vragen een salaris op:

We vragen het salaris op van een niet-bestaande persoon:

4.3.3. De antwoorden jSON van de webservice/jSON
![]() |
![]() |
De URL van de webservice / jSON sturen antwoorden van het type [Response<T>]:
package client.android.dao.service;
import java.util.List;
public class Response<T> {
// ----------------- eigenschappen
// status van de transactie
private int status;
// eventuele statusberichten
private List<String> messages;
// de inhoud van het antwoord
private T body;
// constructors
public Response() {
}
public Response(int status, List<String> messages, T body) {
this.status = status;
this.messages = messages;
this.body = body;
}
// getters en setters
...
}
- de URL [/employes] retourneert een type Response<List<Employe>>;
- de URL en [/salaire] retourneren een type Response<FeuilleSalaire>;
De klasse [FeuilleSalaire] is als volgt:
package pam.entities;
import java.io.Serializable;
public class FeuilleSalaire implements Serializable {
private static final long serialVersionUID = 1L;
// privévelden
private Employe employe;
private Cotisation cotisation;
private ElementsSalaire elementsSalaire;
// constructors
public FeuilleSalaire() {
}
public FeuilleSalaire(Employe employe, Cotisation cotisation, ElementsSalaire elementsSalaire) {
...
}
// getters en setters
...
}
- regel 9: de klasse [Employe] is beschreven in paragraaf 4.2.3;
- regel 10: de klasse [Cotisation] is beschreven in paragraaf 4.2.3;
De klasse [ElementsSalaire] (regel 11) is als volgt:
package pam.entities;
import java.io.Serializable;
public class ElementsSalaire implements Serializable {
private static final long serialVersionUID = 1L;
// privévelden
private double salaireBase;
private double cotisationsSociales;
private double indemnitesEntretien;
private double indemnitesRepas;
private double salaireNet;
// constructors
public ElementsSalaire() {
}
public ElementsSalaire(double salaireBase, double cotisationsSociales, double indemnitesEntretien, double indemnitesRepas, double salaireNet) {
...
}
// getters en setters
...
}
4.4. Tests van de Android-client
![]() |
Hieronder vindt u het uitvoerbare binaire bestand van de voltooide Android-client:
![]() |
Sleep het bovenstaande binaire bestand [pam-client.apk] met de muis naar een tabletemulator [GenyMotion]. Het wordt dan opgeslagen en vervolgens uitgevoerd. Start ook de webserver / jSON als u dat nog niet hebt gedaan. De Android-client heeft als doel de door de webserver / jSON teruggestuurde informatie op te halen en op te maken. De verschillende schermen van de Android-client zijn als volgt:
U moet eerst verbinding maken met de webservice / jSON:

- in [1], geef je de URL van de webservice / jSON op. Stel in de emulator een van de adressen IP of PC in (maar niet 127.0.0.1). Voer op een tablet het wifi-adres van de webserver in / jSON en schakel de firewall van de server uit, indien aanwezig, omdat deze inkomende verbindingen zou kunnen blokkeren;
- in [2] log je in;
Je komt dan op de simulatiepagina terecht:

- in [3] kiest men een medewerker;
- in [4] voer je een aantal uren in;
- op [5] voer je het aantal dagen in;
- in [6] wordt de simulatie opgestart;
De resulterende simulatiepagina ziet er als volgt uit:

- in [7], de verkregen simulatie;
- in [8] wordt deze opgeslagen;

- in [9], de lijst met simulaties;
- in [10], wordt een simulatie verwijderd;

- in [11], er zijn geen simulaties meer;
- in [12], keert men terug naar het simulatieformulier;

- in [13] verschijnt het formulier weer;
- in [14] keert men terug naar de configuratiepagina;

- met [15] komt u terug bij het oorspronkelijke inlogformulier.
4.5. Te doen
Het eerder gepresenteerde skelet van de Android-client wordt u aangereikt. Het is opgebouwd op basis van het project [client-android-skel] dat in paragraaf 2 wordt beschreven.
![]() |
Het project is uitvoerbaar en bevat al de benodigde weergaven. Er hoeft alleen nog wat code te worden toegevoegd om de applicatie te laten doen wat ze moet doen. Ga als volgt te werk:
- voer de volledige versie uit om inzicht te krijgen in het werk dat moet worden gedaan;
- voer de vereenvoudigde versie uit en bestudeer de code daarvan. Deze volgt de ontwerpmethoden die op de voorgaande pagina's zijn gebruikt;
- voeg de ontbrekende code toe;










