Correction de l'étude de cas 2018 du BTS SIO SLAM: WebCaisse

Première version. Draft. Les erreurs peuvent être signalées avec le système de commentaire.

Question 1.1 Modifier la structure de la base de données utilisée par l'application AchatWebCaisse afin de permettre la souscription en ligne du logiciel WebCaisse.

bdd bts sio 2018

Question 1.2 Expliquer en quoi la structure de la table ne permettra pas de gérer l'historique des formules souscrites, indispensable à la détermination du montant mensuel à régler par le client.

On ne peut pas garder l’historique car il n’y a pas de notion de date. Le commerçant ne pourra pas souscrire, pour un point de vente, à une formule déjà souscrite par le passé car celui va lui être interdit par les clés primaires. Avec cette table on ne peut pas souscrire plusieurs fois à la même formule pour le même établissement.

Question 1.3 Proposer une correction de la structure de la table qui réponde au besoin exprimé

Pour résoudre ce problème je créerai une relation ternaire avec une entité DateSouscription qui contient le jour, le mois et l’année sachant qu’on ne peut faire qu’une seule modification par jour.

On obtiendra la table suivante :

FormuleSouscrite(idPointDeVente, idFormule, date)
clé primaire : idPointDeVente, idFormule,date
clés étrangères : idPointDeVente en référence à id de PointDeVente
idFormule en référence à id de Formule
date en référence à DateSouscription de date.

Question 2.1 Écrire les requêtes permettant d’extraire les informations nécessaires de la base de données fournie dans le dossier documentaire.

a. la liste des consommateurs (nom, prénom, adresse de courriel) pour lesquels au moins une vente a été réalisée en 2017 ;

 select nom, prenom, mail, tel from conso join on vente on idConso = conso.id where year(dateVente) = 2017 group by conso.id having count(*) > = 1

Group by pas vraiment nécessaire

b. le nombre de consommateurs ayant souscrit au programme de fidélité et appartenant à la tranche d’âge 18-30 ans ;

 select count(*) from consoFidele where TIMESTAMPDIFF(year, CURDATE(), dateNaissance)  between 18 and 30

c. la liste des consommateurs (nom, prénom, adresse de courriel) avec le montant total des ventes réalisées pour chacun.

 select nom, prenom, mail, tel, sum(montantVente) from conso join on vente on idConso = conso.id group by conso.id

Question 2.2 Modifier la requête SQL de la méthode listeConsoAFideliser(int seuilVentes, String dateDeb, String dateFin) fournie par Sylvain Cho, afin de lister les consommateurs qui n'ont pas adhéré au programme de fidélisation et pour lesquels on a enregistré un nombre de ventes supérieur au seuil donné, durant la période donnée (le seuil et la période sont fournis en paramètre).

 String requete = "select nom, prenom, tel, mail, count(*) as nbVentes " + "from Conso " + "join Vente on idConso = Conso.id " 
+ " where Conso.id not in (select id from ConsoFidele)" 
+ and dateVente between " + dateDeb + " and " + DateFin 
+ "group by nom, prenom, tel, mail " + "having count(*) >" + seuilVentes ;

Question 2.3 Compléter la méthode testInitConso permettant de combler ce manque.

assertEquals("erreur calcul mise à 0 fidélité",0,consoTest.getPointsFidelite());

Question 2.4 Compléter la méthode testAddMontant permettant de valider les points de fidélité obtenus dans le cas d'un de programme de fidélisation par points.

On considère que les points fidélité sont à 0.
consoTest.addFidelite(3, 150);
assertEquals("erreur calcul 1er point",10,consoTest.getPointsFidelite());
consoTest.addFidelite(3, 250)
assertEquals("erreur calcul 2ème point ",30,consoTest.getPointsFidelite());
consoTest.addFidelite(3, 600)
assertEquals("erreur calcul 3ème point ",80,consoTest.getPointsFidelite());

Question 3.1 Rédiger le commentaire de la méthode statVente de la classe Statistique expliquant ce qu'elle retourne.

La méthode indique le pourcentage de consommateurs fidèles qui ont réalisés des achats dans la journée.

Exemple si on 5 ventes dans la journée et si 2 ont été effectuées par des consommateurs fidèles. On aura 2 * 100 / 5 = 40 % de consommateurs fidèles à avoir effectué des achats dans la journée.

Question 3.2 Écrire la méthode getNbVentes de la classe Conso qui retourne le nombre de ventes enregistrées dans la collection des ventes du consommateur.

public int getNbVentes()
{
    return lesVentes.size();
}

Question 3.3 Écrire le constructeur de la classe VenteEcommerce qui permet d’initialiser tous les attributs d'une instance de la classe.

public  VenteEcommerce(Date uneDateVente, Conso unConso, double unMontant,  String adresseLivraison,  String optionLivraison)
{
    super(uneDateVente, unConso, unMontant) ;
    this.adresseLivraison = adresseLivraison ;
    this.optionLivraison = optionLivraison ;
}

Question 3.4 Compléter le code de la méthode compareLieuVente.

public static double compareLieuVente(ArrayList
    lesConsos)
{
    double totalEcom = 0; //cumul des montants des ventes ecommerce
    double totalMag = 0;  // cumul des montants des ventes en magasin
    //parcours de la liste des consommateurs fidèles
    foreach (ConsoFidele cf : lesConsos) 
    {
        foreach (Vente v : cf.getLesVentes())
        {
            if(v instanceof VenteECommerce)
            {
                totalEcom += v.getMontantVente();
            }
            else 
            {
                totalMag += v.getMontantVente();
            }
        }

    }
    return totalMag / totalEcom; //calcul de l’indice et retour du résultat }
}

Question 3.5 Expliquer en quoi la dernière instruction "return totalMag/totalEcom" de la méthode compareLieuVente peut poser problème.

On peut avoir une division par 0.

Question 3.6 Écrire la méthode répondant à ce besoin.

public ArrayList VentesSupérieurMontant(double montant)
{
      ArrayList lesVentesSup = new ArrayList();
      foreach(Vente v : lesVentes)
      {
          if (v.getMontantVente() > montant)
          {
               lesVentesSup.Add(v);
          }

       }
       return lesVentesSup;
}

Question 4.1 a) Identifier les charges fixes et les charges variables dans le coût du projet présenté dans le dossier documentaire.

Charges fixes :

Coût salarial de l’équipe
Coût des équipements informatiques

Charges variables :

Charges d’exploitation

b) Calculer le montant total de charges fixes et le montant total de charges variables.

Montant total des charges fixes :

Coût salarial de l’équipe : 172 000
Coût des équipements informatiques par année en tenant compte de l’amortissement : 8000
Coût total : 180 000

Les charges variables sont représentées par les charges d’exploitation : 104 000

Question 4.2 Déterminer le point mort du projet en nombre de jours, sachant qu’une année comptable est équivalente à 360 jours. Commenter le résultat obtenu.

Calcul du seuil de rentabilité

280 000 * 360 / 300 000 = 336

L’entreprise atteint le seuil de rentabilité juste à la fin de l’année (début décembre), elle ne va pas faire beaucoup de bénéfices.

Question 4.3 Rédiger une courte note à destination du chef de projet en justifiant le choix d’un hébergeur parmi les trois propositions.

Bonjour Renaud, voici un tableau qui analyse les différentes offres.

ABC
une sauvegarde quotidienne des données du portailouiouioui mais manuel
de la haute disponibilitéoui mais pas de réplicationouioui
une sécurisation des échanges et des données par cryptageoui SSLnonnon

Après analyse il apparait que la solution 1 est plus avantageuse, elle répond à tous les besoins de l'entreprise en plus les données sont situées en France et un service technique est disponible.