Correction de l'étude de cas 2016 du BTS SIO : FFBSP

Une étude de cas assez facile qui comporte peu d'exercices de programmation et peu de questions très techniques. On ne sait pas trop ce qui est attendu pour les missions 1 et 4.

La correction peut comporter des erreurs, ce n'est pas la correction officielle, vous pouvez laisser un message si vous voulez proposer une autre solution.

Mission 1 - Question 1

Le travail à réaliser pour créer l’application web :

Analyse de toutes les fonctionnalités de l’application GestBowl.

Analyse de la structure de la base de données de l’application GestBowl.

Incorporation des fonctionnalités de GestBowl dans l’application web en PHP.

Modification de la base de données MySQL si nécessaire.

Mise en service du site web

Formation des salariés à la nouvelle interface web.

Mission 1 - Question 2

Le travail à réaliser pour se connecter à distance à la base MysQL :

Mettre en place la solution proposée par l’hébergeur au niveau de réseau.

Analyser la structure de la base de données MySQL.

Modifier le programme GestBowl pour que la connexion ne soit plus locale mais utilise un lien vers une base MySQL.

Modifier le logiciel et les commandes SQL pour s’adapter à la structure de base MySQL et aux commandes MySQL.

Déployer la nouvelle version du logiciel sur tous les postes clients.

Supprimer la base locale Access.

Mission 2 - Question 3

Cette question est la plus difficile, elle met en jeu l'héritage et le polymorphisme, la question suivante est plus classique avec des parcours de listes.

La classe Licence

  class Licence
{
	private $LePratiquant;
	private $Numero;
	private $LeClub;
	private $LaCategorie;
	private $Annee;
	
	public function __construct($numero, $pratiquant, $club, $categorie, $annee )
	{
		$this->LePratiquant = $pratiquant;
		$this->LeClub = $club;
		$this->LaCategorie = $categorie;
		$this->Annee = $annee;
		
	}
	
	
	
	public function GetDescription()
	{
            return $this->Numero . " " . $this->LePratiquant->GetNom() . " " . $this->LePratiquant->GetPrenom();	
	}...
   

La classe LicenceJeune

   class LicenceJeune extends Licence
{
	private $NomResp;
	
	public function __construct($nomResp, $pratiquant, $numero, $club, $categorie, $annee)
	{
		parent::__construct($numero, $pratiquant, $club, $categorie, $annee);
		$this->NomResp = $nomResp;
		
	}
	//Implémentation de la méthode GetDescription dans la classe fille.
	//On retourne en plus le nom du responsable.
	public function GetDescription()
	{
		//On rajoute les informations
		return parent::GetDescription() . " " . $this->NomResp . " " . $this->PrenomResp . " ". $this->TelResp;
	
	}
	
	
}

La classe LicenceMixte

class LicenceMixte extends Licence
{
	private $Entreprise;
	public function __construct($entreprise, $pratiquant, $numero, $club, $categorie, $annee)
	{
		parent::__construct($numero, $pratiquant, $club, $categorie , $annee);
		$this->Entreprise = $entreprise;
	}
	//Implémentation de la méthode GetDescription dans la classe fille.
	//On retourne le nom de l'entreprise
	
	public function GetDescription()
	{	
	return parent::GetDescription() . " " . $this->laEntreprise->GetNom();
				
	}	
}
   

Mission 2 - Question 4

Dans la classe Licence

        //La méthode retourne un booléen
	public function EstActive()
	{		
		return $this->Annee == date("Y");
	}

Dans la classe Club

    //La méthode retourne la liste des licences actives
	public function GetLicenceActive()
	{
		$listeLicenceActive = array();
		//On parcourt toutes les licences du club et on ne garde que celles qui sont actives.
		foreach ($this->LesLicences as $uneLicence)
		{
	       
			if ($uneLicence->EstActive())
			{
				$listeLicenceActive[] = $uneLicence;
			}
		}
		return $listeLicenceActive;
	}

Dans la classe LigueRegionale

        public function getNbLicencesParCategorie()
	{
		$listeParCategorie = array();
		
		//On parcourt tous les clubs de la ligue
		foreach ($this->LesClubs as $unClub)
		{	
			//Pour chaque club on récupère les licences actives
			foreach ($unClub->GetLicenceActive() as $uneLicenseActive)
			{
				$libelleCategorie = $uneLicenseActive->GetCategorie()->GetLibelle();
				
				//Si le libellé de la catégorie est déjà présent on incrémente la valeur dans le tableau associatif
				//sinon on crée une nouvelle entrée dans le tableau associatif.
				if (isset($listeParCategorie[$libelleCategorie]))
				{				
					$listeParCategorie[$libelleCategorie]++;
				}
				else 
				{
					$listeParCategorie[$libelleCategorie] = 1;
				}
			}
		}
		return $listeParCategorie;
	}

Mission 3 - Question 5

Ecrire les requêtes destinées à tester la BD existante.

    SELECT  C.nom FROM Club C, CentreDeBowling CB WHERE C.idCentre = CB.id AND CB.denomination = 'RedBowl' ;
    SELECT count(*) FROM Licence L, Club C, LigueRegionale LR WHERE L.annee = 2016 AND L.idclub = C.id AND C.codeLigue = LR.code AND LR.nom = 'Bretagne' ;

Mission 3 - Question 6

Proposer une nouvelle modélisation de la base de données.

Cette question peut être traitée avec une modification du diagramme de classe, du schéma conceptuel ou du schéma relationnel (solution retenue).

Competition (id, titre, date, idCategorieAge, idClub, idCentreDeBowling, tarif, genreRequis, typeRequis, niveauRequis)
Clé primaire : id
Clés étrangères : idCategorieAge en référence à id de CategorieAge, idClub en référence à id de Club, idCentreDeBowling en référence à id de CentreDeBowling
Le champ genreRequis (femme, homme) fixera le sexe des participants
Le champ typeRequis (individuelle, doublette) fixera le nombre (1 ou 2) de participants lors d'une inscription
Le champ niveauRequis (aucun, promotion, honneur, excellence, élite) pour une exigence de la compétition individuelle

Inscription (id, idLicence1, idLicence2, idCompetition, resultat)
Clé primaire : id
Clés étrangères : idLicence1 en référence à premier id de Licence, idLicence2 en référence à second id de Licence si doublette, idCompetition en référence à id de Competition)
Le champ resultat (gagné, perdu) permettant un calcul ultérieur de niveau acquis.

Licence (id, …, niveauAcquis)
On ajoute le champ niveauAcquis (aucun, promotion, honneur, excellence, élite) qui sera renseigné à la création de la licence grâce à un calcul sur les résultats des inscriptions. Ce champ aurait pu aussi être ajouté dans la table Pratiquant

Pratiquant (id, …, genre)
On ajoute le champ genre (femme, homme) qui sera renseigné à la création du pratiquant

Mission 4 - Question 7

Scénario nominal (on ne tient pas compte des cas d'erreurs)

 azure offre web minute

Mission 4 - Question 8

Tarif mensuel avec contrat VAD

On a un nombre de transactions > 1000 et un montant de transaction de 100 000 euros

La calcul : 15 + (100 000 * 0,4/100) + (0,01 * 5000) = 15 + 400 + 50 = 465

Tarif mensuel sans contrat VAD

On a aussi un montant de transaction de 100 000 euros

La calcul : (100 000 * 0,5/100) = 500

Mission 4 - Question 9

Les deux offres sont quasiment équivalentes au niveau des couts.

Au niveau de la sécurité les deux offres sont aussi similaires, les informations sont transmises cryptées.

La solution contrat VAD est plus longue à mettre en place car il faut obtenir un agrément. L’autre solution est plus rapide au niveau de la mise en service.

Avec le contrat le commerçant est réglé plus vite que dans la solution sans contrat. Il n’a pas besoin d’attendre pour le règlement. Il est surement aussi plus facile de discuter avec sa banque qu’avec une autre société en cas de problème.