Corrigé Barème Contrôle de connaissances 2013/2014 des étudiants de 2 è année (EI2) CSC4002 : Contrôle Final Session 2 Date : 27 Mars 2014 Durée : 1H30 Coordonnateurs : Christian Bac et Denis Conan Les seuls documents autorisés sont ceux distribués en cours / BE / TP et mis à disposition sur le site Web du module, ainsi que vos notes personnelles. Notes : le travail doit se faire individuellement ; n oubliez pas d indiquer votre nom sur chaque feuille rendue ; soyez concis et précis, et justifiez vos réponses par des commentaires appropriés ; soyez rigoureux dans la syntaxe JAVA ; veillez à rendre une copie propre et lisible.
1 EuroCompta L objectif du système est de modéliser le fonctionnement d un groupe de cabinets de comptabilité d entreprises. 1.1 Description du système Le système permet de gérer des cabinets de comptabilité avec leurs employés et leurs entreprises clientes. Chaque cabinet est associé à un ensemble d entreprises. Les employés des cabinets réalisent diverses tâches. Le système que nous modélisons et concevons sert à prospecter des entreprises pour être de futures clientes et à établir les bilans comptables des entreprises clientes. Un cabinet est composé d un expert comptable qui est responsable du cabinet. L expert comptable est le seul habilité à certifier un bilan. Il peut recruter ses collaborateurs. Le nombre de collaborateurs détermine la taille du cabinet. Parmi les collaborateurs d un cabinet, nous distinguons les comptables qui sont habilités à réaliser les bilans et les secrétaires commerciaux qui prennent en charge la relation client, y compris le démarchage que nous appelons dans la suite «prospect» (pour prospection des clients). Un comptable est en charge d au plus vingt entreprises et un commercial peut gérer un portefeuille de quarante entreprises et vingt prospects (dossiers d entreprises en cours de démarchage). 1.2 Gestion des prospects et des bilans Un secrétaire commercial gère son parc de prospects et de clients. Il propose des contrats pour l établissement des bilans mais aussi pour le suivi de la comptabilité par la réalisation du journal comptable de l entreprise. Les contrats dépendent de la taille de l entreprise, et plus précisément du nombre d écritures qu elle réalise chaque année. Une écriture correspond à une ligne dans le journal comptable de l entreprise. Une entreprise peut choisir la périodicité de son bilan qui peut être annuelle, semestrielle (tous les 6 mois) ou trimestrielle (tous les 3 mois). Pour les bilans annuels, une date de clôture est spécifiée ; le plus souvent, c est le 31 décembre de l année en cours. Seul le bilan annuel doit être certifié pour être présenté à l administration fiscale. Les autres bilans sont établis le même jour du mois, le plus souvent le 10. Lorsqu un nouveau contrat est établi, il est à l état de projet. Pour qu il passe à l état de proposition il est nécessaire de connaître le nombre d écritures comptables annuelles et la périodicité du bilan. Chaque proposition est ensuite négociée avec l entreprise et son montant est fixé avant que le contrat ne passe dans l état accepté. Les bilans peuvent être dans l état en cours, achevé, vérifié et certifié. Les bilans sont gardés pendant cinq ans avant d être archivés. 2 Partie UML [10 points] Liste des classes Voici la liste des classes et des attributs que nous décidons de garder pour décrire ce système : EuroComptable : nomgroupe :String datecréation : Date Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 2
Cabinet : dateouverture : Date adresse : Adresse numcabinet : String Collaborateur : nom : String, prénom : String clefemployé : String Classes enfants : Commercial Comptable Classe enfant : Expert Entreprise nom : String, adresse : Adresse numentreprise : String Contrat numcontrat : String ; datedébut : Date daterenouvellement : Date clôtureannuelle : Date périodicité : String jourdumoisbilan : int montantcontrat : float Journal Bilan Les attributs suivants permettent de distinguer les objets d une même classe : numcabinet : est un numéro unique qui identifie un cabinet. Ce numéro unique est attribué par la méthode String getnewnumcabinet() de la classe EuroComptable ; clefemploye : la clef d employé représente une valeur unique. Cette clef est attribuée par la méthode String getnewclefemploye() de la classe Cabinet ; numentreprise : est un numéro unique qui identifie une entreprise dans un cabinet. Ce numéro unique est attribué par la méthode String getnewnumentreprise() de la classe Cabinet ; numcontrat : est un numéro unique qui identifie un contrat dans une agence. Ce numéro unique est attribué par la méthode String getnewnumcontrat() de la classe Cabinet. Cas d utilisation Nous avons retenu pour cette réalisation trois acteurs : commercial, comptable et expert comptable. Tous les cas d utilisation ne sont pas décrits. Les cas d utilisation pertinents pour cet examen sont décrits dans la figure 1. Diagramme de classes Question 1 (5pt) système. Réalisez un diagramme de classes correspondant à cette description du Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 3
Ajouter un prospect Proposer un contrat Mettre a jour un contrat Commercial Relancer un prospect Verifier un journal Etablir un bilan Comptable Valider un contrat Embaucher un employe Licensier un employe Expert Certifier un bilan Figure 1 Diagramme de cas d utilisation EuroCompta Cabinet directeur Expert personnel maintient Comptable Collaborateur client Entreprise contracte Commercial Bilan Journal 1..4 associe 0..1 associe Contrat 0..40 gerer 0..20 demarcher 0..20 etablir bilan certifier bilan Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 4
Barème de correction sur 5 points : 1 notation UML correcte 0,5 héritage collaborateur, comptable, expert 0,5 association comptable contrat 0,5 association commercial contrat 0,5 cardinalités 40 et 20 0,5 compositions à partir de cabinet 0,5 association contrat bilan avec cardinalité 1..4 0,5 nommage des associations 0,5 association contrat journal avec cardinalité 0..1 Question 2 (5pt) Construire le diagramme de machine à états de la classe Contrat. Une ébauche du diagramme de machine à états de la classe Contrat est donnée dans la figure qui suit. Creation Demarchage demande chiffrage Negociation entry: / constructeur() do:/demarcher() contrat non accepte do:/proposerchiffrage() [relances infructueuse]/abandonner() contrat signe renegociation: EnCours do: fairebilan() [date > date fin] echec renegociation Destruction entry: / detruire() Barème de correction sur 5 points : 1 pas d erreur de notation UML 1 3 états 1 événements entre négociation et en cours 1 lien direct avec destruction Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 5
1 retour entre encours et negociation 3 Partie Java [10 points] Vos réponses à ces questions doivent être conformes aux diagrammes UML que vous avez réalisés précédemment. Toutes les réponses doivent être rédigées dans le langage Java. L ensemble des fichiers de cette réalisation sont dans le paquetage appelé cabinetcomptable. Les collections doivent être réalisées en utilisant la classe java.util.vector et l interface java.util.list. Question 3 : (3pt) Écrivez une ébauche de la classe Commercial contenant les attributs de cette classe et un constructeur pour cette classe ayant le prototype suivant : public Commercial(String nom, String prenom, Cabinet cabinet). package cabinetcomptable; import java.util.vector; import java.util.list public class Commercial extends Collaborateur { private static final int maxcontrats = 40; private static final int maxprospects = 20; private List<Contrat> contrats; private List<Contrat> prospects; public Commercial(String nom, String prenom, Cabinet cabinet) { super(nom, prenom, cabinet); contrat = new Vector<Contrat>(); prospects = new Vector<Contrat>(); Barème de correction sur 3 points : 0.5 package 0.5 import correct 0.5 extends correct 0.5 attributs liste 0.5 utilisation du super constructeur 0.5 initialisation des vecteurs Question 4 (3pt) Écrivez une ébauche de la classe Contrat contenant les attributs de cette classe et un constructeur pour cette classe. package cabinetcomptable; public class Contrat { private String numcontrat; private Date datedebut, daterenouvellement; private Date clotureannuelle ; Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 6
private String periodicite ; private int jourdumoisbilan ; private float montancontrat ; private int nbbilans ; private Entreprise entreprise; private Commercial responsable ; private Comptable comptable ; private Cabinet cabinet; private Expert expert; private boolean endemarchage, ennegociation, encours, enarchive; private List<Bilan> bilans; private Journal journal; public Contrat(Entreprise e, Commercial co, Cabinet ca){ cabinet = ca; numcontrat = cabinet.getnewnumcontrat(); entreprise = e; responsable = co; endemarchage = true; bilans = new Vector<Bilan>(); Barème de correction sur 3 points : 0.5 report attributs du texte ok 0.5 attributs en provenance du diagramme de classes 0.5 attributs du dme 0.5 utilisation de getnewnumcontrat 0.5 initialisation de l état dme 0.5 initialisation bilans Question 5 (2pt) Proposez deux méthodes permettant à un commercial de réaliser son bilan annuel par le calcul du nombre de contrats en cours dans son portefeuille et du montant de ses contrats. Pour cela, écrivez le corps des méthodes de la classe Commercial ayant les protoypes suivants : public int nbencours() public float valeurencours() Vous pouvez considérer que la classe Contrat dispose de méthodes de type getter pour les valeurs des attributs dont vous avez besoin. public int nbencours() { return contrats.size(); public float valeurencours() { float valeur = 0; for(contrat c : contrats) { if(c.isencours()){ valeur += c.getmontant(); return valeur; Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 7
Barème de correction sur 2 points : 0.5 utilisation de size 0.5 parcours correct du vecteur 0.5 test et addition 0.5 retours de valeurs corrects Question 6 (2pt) Le méthode qui permet d ajouter un contrat au sein de la classe Cabinet possède le prototype suivant : Contrat ajoutercontrat(entreprise e, Commercial c) throws IllegalArgumentException. Cette méthode lève cette exception dans trois cas : l entreprise est une référence nulle ou n est pas présente dans la collection gérée par le cabinet ; le commercial est une référence nulle ou n est pas présent dans la collection gérée par le cabinet ; il existe déjà un contrat pour cette entreprise. Nous vous fournissons le jeu de tests suivant et vous demandons de le compléter pour que tous les cas soient couverts. package testeurocompta; import cabinetcomptable.; import org.junit.; public class testajoutercontrat(){ EuroComptable facade; Cabinet c1; Entreprise e1; Commercial a1; Contrat p; @Before public void setup() throws Exception { facade = new EuroComptable("eurocompta"); c1 = new Cabinet("22 Boulevard Caumartin, Paris 8"); facade.ajoutercabinet(c1); e1 = c1.addentreprise("peugeot paris 8", "32 Boulevard Champs Elysees, Paris 8"); a1 = c1.addcommercial("guerin", "Sandra"); a1.ajouter(e1); @Test public void ajoutercontratok() { Contrat co = c1.ajoutercontrat(e1, a1) @After public void teardown() throws Exception { e1 = null; c1 = null; a1 = null; facade = null; package testeurocompta; Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 8
import eurocompta.; import org.junit.; public class testajoutercontrat(){ EuroComptable facade; Cabinet c1; Entreprise e1; Commercial a1; Contrat p; @Before public void setup() throws Exception { facade = new EuroComptable("eurocompta"); c1 = new Cabinet("22 Boulevard Caumartin, Paris 8"); facade.ajoutercabinet(c1); e1 = c1.addentreprise("peugeot paris 8", "32 Boulevard Champs Elysees, Paris 8"); a1 = c1.addcommercial("guerin", "Sandra"); a1.ajouter(e1); @Test(expected=IllegalArgumentException.class) public void ajoutercontratentreprisenulle() throws Exception { Contrat co = c1.ajoutercontrat(null, a1) Assert.fail(); @Test(expected=IllegalArgumentException.class) public void ajoutercontratentrepriseinexistante() throws Exception { Entreprise e2 = new Entreprise(c1, "peugeot paris 8", "32 Boulevard Champs Elysees, Paris 8"); Contrat co = c1.ajoutercontrat(e2, a1) Assert.fail(); @Test(expected=IllegalArgumentException.class) public void ajoutercontratcommercialnull() throws Exception { Contrat co = ajoutercontrat(e1, null) Assert.fail(); @Test(expected=IllegalArgumentException.class) public void ajoutercontratcommercialinexistant() throws Exception { Commercial a2 = new Commercial("Guerin", "Sandra", c1); Contrat co = c1.ajoutercontrat(e1, a2) Assert.fail(); @Test public void ajoutercontratcommercialok() throws Exception { Contrat co = c1.ajoutercontrat(e1, a1) @After public void teardown() throws Exception { e1 = null; c1 = null; a1 = null; facade = null; Barème de correction sur 2 points : 0.5 par test 0.5 si Assert.fail 0.5 si throws et test expected= Télécom SudParis Denis Conan et Christian Bac 27 Mars 2014 CSC4002 CF2 9