Camping

Objectifs

Ce sujet propose de concevoir une application permettant de faciliter la gestion du système d’information d’un camping municipal. Les informations nécessaires sont stockées dans une base de données relationnelle composée de trois relations :

Client ( id_client , nom, prenom, adresse, ville, pays, telephone)
Reservation ( id_reservation , #id_client, #id_emplacement, nombre_personnes, date_arrivee, date_depart)
Emplacement (id_emplacement, nom, localisation, tarif_journalier)

Représentation textuelle

Dans une représentation textuelle d'une base de données relationnelle, les clés primaires sont soulignées et les clés étrangères sont précédés du caractère "#".



La première fonctionnalité sera de récupérer les informations nécessaires au calcul du montant à régler.

Question 1

Dans cette question, on se limitera au cas particulier du client dont l'identifiant est \(1\).

Réaliser les requêtes SQL suivantes :

  • Obtenir le nom, le prénom et la ville du client dont l'identifiant est \(1\) :


    
    

  • Obtenir l'emplacement, le nombre de personnes et les dates de départ et d'arrivée de chaque réservation associée au client dont l'identifiant est \(1\), classées de la plus récente à la plus ancienne :


    
    

Question 2

Dans cette question, on généralise les requêtes de la question précédente pour n'importe quel client. Les variables requete_1 et requete_2 correspondent aux requêtes SQL définies en question 1 mais elles doivent s'adapter à l'identifiant passé en paramètre de la méthode __init__.

Le module sql_camping permet d'exécuter en python des requêtes sur la base de données qui gère le camping.

Une fois importée, la fonction help donne les indications pour utiliser ce module.

Compléter les méthodes suivantes qui permettent l'instanciation de la classe Client.

classe Reservation

On donne la description suivante de la classe Reservation :

classDiagram
    class Reservation {
    +int id_reservation
    +int id_emplacement
    +int nombre_personnes
    +str date_arrivee
    +str date_depart
    nb_jours()
    }

Le code de cette classe est déjà chargée en mémoire.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:LpM(40ed3; 1Ej}o5_ên)Bh]6,qc[yFCuvHi2DxmYWsU7=wlSIatf-9O{RQrg.çTé?Pkb8/050j0i0#0!0L0X0S0m0D0X0!0S0S0V010#0L0d010406050S0I0P0P0!0-0F040Y0r0X0I1c0r0v0m020!0P0d0l0m0+0i1m0-0C0I0i0S050{1j1l1n1p1h0d041N1U051X0{1X1Z1U1h0j0L0J1416181a0y0L0.0y0X1;0y0#1f050 0_0X0i1,1719011:1=1@1=0#1}1 1{0#0_0r0j1p1|0-1V0#0y141s0S0d0!0v1a0M01211.010$110i0v1A0i1{2p2r2w232z1 2C0P2E040a0m0@0-0r0d0r0S0L1v1x0}2n0-0-0i0D2Z1N2G0v1V0{2l2/0#2j2i2k0j2I1a1@0v2B2W1{1)1+15222|0L2~0v2f1*1{0d2(1V2-2/3g1i2q1x342x390-1m0X1f0m0n2,3k1g3j2H3m233o3q3s0M3v2r3x2-2{013C0!3r040m0k3G2.1h3J3A1a3M3O0m0g3S3I3k3K3Y3s0s3$3U3(3W3L0r3p3N3s0A3-3y3l1-3B3=3D3P0U3`3V3}3X3 3@3P0`433/453;3?3Z0(4b3z4d3*040n0h4i3|354e400n3u1O3w3.4j4r4l0n3F4w3H4y4q3n473O0n3R4E3T3{3)4J1f0n3#4N3%4z4I4f4S3,4V4G4Q4Z4m3_4$4P3:4B424,444A4R4m4a4;4c4?4)0n4h4`4X3~4)0M4o504H52400M4v3i1!3e1N322=0j2_3K0D2f2O0|1*1V3d0i3f3w3$055l0}5t511a0^0v1f0$2T0P5v4=2x0W3s5I4{3n5D040S0C0X0t0D1A0d370.5N5A015L3P5#575B5Q0L1B3=0#3$0m4-4k1f0i0O2)1u0i0t2(1J0~0i3-4%3:0^1f3A5*3K5(5?4V5@4A0D1f0H1@2B5;6e5J231e040b3-0m6u5?6o5B1f0}0$6a3:6c6C4d0$0P1f0t0t372Y6K6F4r6q0f6P2x0_6q0S0i0X6B6n5O6p1f0B5=6f3n1f0L0j5V6k0v6m3i6x016q0w6s4$6v6~6w6$1a6V1f6X6Z6T230r1f0/773X6-6/150L6l6*6^79040V7j713L7e6:7h6=6t6 6u6+3B1f601K0#5~5b3w705$7l7n4V7H5+010S0!5E7c7O2u04017W0Y0o0c0o0H0;0m390P0B0m5r7)7+0J111 4p3K0S7U7w7`7`0G0+0)0e0m6j7t6?4x7y1a7^3s7{8a6u0R0K0o0+0o0m6.7s6l0m0V6d6@7p2X1f0*7S735R6Y6!8p7I7a7S5-7f6;843H867O0L1f0q7S887V7W7v7w8I5Q5W0-0!2*0i0-0L0S1c610S8k7u7L8I7J7o5$5Q5`5|7D5 0i617D7S6R8C7A8_7C7E8|1f0w8R6 8I8v758y5u7k8B6#8:1f7)93046)8,6^998x7S7l7b9f7N5Q7-0r5H9t3K6q9l3g7M3K9o769z3:9r8~047:0X7=7L9E9J1f7K9D8T681n8X7D8!8$0L8(8*8G2.8I6q0E7S0P8K04558z7N6q0z966~986W9p9I4d9Ka04A8 6X0-0J0!2Z1M9m7p8.ac5$9-9`4$069|6^67046A7S6Ea33n0$1f0r0_7D0v0L0-8^a6a8aa9j6Sas239G9b8H6^6`6|3gak7`9W047B620t4D9V9d7m8/7N7P7RaI877U7W017Y7!7$8i6/2(aDa90L1w7+8j1G0d160D1G6l7+7)0_2(0t0d8Z0S1w2~0S7+0ja95~1n8!0J0i0ibfbh0t0}2q0-9*4Wa%7_8b8a7}7 1E1L8ZaEa`0v7?3:8Oby8a8d8f8h8j7g8l8n8N9;8ta*01aK9q9e9@3)7rbR8+b$bJ9;8M567@bxbL7w0)0+0N8f0m0x0Q0mbg8@bj1*bm0mb_0Y0Ha-9{6vaT1@8$5~a@bEa_1wabaZad9Ta$b%048=0D5}8^8`63bX8}bX5QaV8@aY9c7p6`c97xam5E3=cn4.5_0v2(0.8#2?b2b*7G8-5(37cL5^04cc8@cfa7ch0vcjcDag1faP4xbLaT8jc(bF1w9j9CcV6^8D0ta~b0cTbu9,6(cZa404b5b7b90-bb0vbdc{d76,aobpc1blcvb+4d9Bdi7zdk8@br1nbucHcla#af9ucNcPcR2(2NcU4Fc=9n9~9Hdp4ra2dPdjc^c*c,aMdA9sdSdt0!0db90v0jaG9L1Fa^2+cw1faHd!7d04c@bDc)d/d?6_d6dCcoa}1Bd2dId4aNd ck9gd99xb65~dcdedgd:9kdsd@b bi2%c2doc-9^e8c}7p5Qembq0ibse6cE94954,0{5x5s1W5e0{5g1N0#5ieN2@2:2e2g2=0!1~eIeL5p1T5z7NdH0t0$0!0^5~0y0k1f1F1H8(0mc:8H1!3x1U0)1x0!0I8W2Y7,0I0m0=0.3Nd38i5/bt8Z0m1 0m0P2f0Iff2#160me*0:1w0m1j1*2r7De@1W3x323K251?1^1`e$3K2K2B2D1f2Q0Y0D8!0d0#2R0F2lc`6e5re$3h5ueHfF665-fbeB5$ard}df745T5V5X5ZbIa17a0/dZ85c~9X8W8Y9#8%1K8)b)dy8-cme0cM5Rf/5W1Bf=bXdRercocqcscAeqdXc.04d=ghg9gl0t7Fgnes04eEaQ1Nf!eJeY5g1(1*3K0!0jfhaz2Z0m0W1naz0v0.1f1TgIgK1w2YbG0%1c0#2b040Z0v0p2)gN2#0Y0,0cfxe#0T1cccfdfm5l0v5W0#0=2CgN0rf41 130$0%0Y2?5Z7,h40-140-0=g{0!0m7B0ufvg:0chlezhh6X6=200I2~fn109O202#0S0=cr8!h0141n14203d0r0D0=0j0=0m1LfQ0Jfj0v0=8WeX0me 0Oh$290!e?bs8ig+g-bGb~20hp9s1%1Y04e}7,hh0$hZ8Zhkfm390 gNfsa8hvfwe`gG334dfB271_3c5e5c3igCf|aU9062cC3H9Rf@dBe9a%7Q04aL9+6^8Oa-a/7#7%d_d.bGa|6/d18Xd3b4ecdbbabc1Lboc0eodniW5~dwbt8of{8qb;b=bA80d-cggNf?4rbKb=8c8e8ga=9)8m0m0?i=2xi@i^b@b_0+b{b}exdmc3c5c78Qb/gs1Lfji5ek01aeiwgi5{crc%ip8{eigqgwcogliriBeCejg8dqd;8C0_7ec{0wgz85eG5m2/fW5fe!jS0J3xeL0~hA0S04.
Question 3

On souhaite écrire une fonction qui renvoie le montant dû par ce client pour cet emplacement et pour cette durée de séjour. Sachant qu’au tarif journalier de location de l’emplacement il faut ajouter une taxe de séjour de \(2,20\) € par jour et par personne.

On donnera le résultat arrondi au centime près.

round ?

La fonction intégrée round permet d'arrondir un nombre donné. La fonction prend en paramètres un nombre à virgule ainsi qu'un nombre de décimales et renvoie la valeur arrondie à ce nombre de décimales près.

🐍 Console Python
>>> round(65.1745, 2)
65.17
>>> round(65.1795, 1)
65.2

Exemple de calcul du montant à régler pour un client ayant réservé pour \(4\) personnes pendant \(12\) jours un emplacement à \(30\) € la journée :

>>> 30 * 12 + 4 * 2.20 * 12
465.6

classe Emplacement

On donne la description suivante de la classe Emplacement :

classDiagram
    class Emplacement {
    +str nom
    +float tarif_journalier
    }

Le code de cette classe est déjà chargée en mémoire.

Comparaison de nombres flottants

Lorsqu'on écrit a = x ou x est un nombre réel, la valeur de a enregistrée en machine est une valeur approchée de x (quelques fois la valeur exacte). Cette valeur approchée a la forme d'un nombre flottant (le type float en Python). En conséquence, alors que des calculs et des comparaisons peuvent être effectués de manière exacte sur des réels, ils ne le sont que de manière approchée sur leur représentation en machine. On peut donc obtenir par exemple, avec a = x et b = y, l'expression a == b évaluée à True alors que x et y sont différents.

C'est pourquoi les tests ne vérifient pas l'égalité des résultats et des valeurs attendues mais leur proximité.

Ainsi, on peut vérifier que \(\sqrt{2} \approx 1,414214\) en faisantassert abs(1.414214 - sqrt(2)) < 1e-6. Ce test vérifie que les deux valeurs sont proches à \(10^{-6}\) près.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbvà(40i2+edm3s7= 1Ejo5w_lSnatf-)9h6R,crg.*éyPku8/050n0m0F0E0j0B0q0t0O0B0E0q0q0s010F0j0c010406050q0X0o0o0E0P0U040C0x0B0X0@0x0D050Z0~1012140|0c041d1k051n0Z1n1p1k0|0n0j0e0,0.0:0=0K0j0Q0K0B1D0K0F0`050%0d0B0m1y0/0;011C1E1G1E0F1M1O1K0F0d0x0n141L0P1l0F0K0,170q0c0E0D0=0k011Q1A010G0)0m0D0E0o0m1K1=1@1|1S1 1O22240`0a0t0V0P0x0c0x0q0j1a0D0t0#1:0P0P0m0O2p1d270D1l0Z1.2C0F1,1+1-0n290=1G0D212m1K1v1x0-1R2M0j2O0D1(1w1K0c2v1l2A2C2*0}1?2q2U1}2Z0P110B0`0t0u2z2.0{2-282:1S2=2@2_0k2|1@2~2A2L01330E2^040t0p372B0|3a310=3d3f0t0h3j392.3b3p2_0y3t3l3v3n3c0x2?3e2_0L3A2 2/1z323F343g0r3K3m3N3o3P3H3g0Y3T3C3V3E3G3q0J3#303%3x040u0i3,3M2V3(3Q0u2{1e2}3B3-3^3/0u363}383 3@2;3X3f0u3i453k3L3w4a0`0u3s4e3u40493)4j3z4m474h4q3:3J4t4g3D423S4z3U414i3:3!4E3$4G4w0u3+4K4o3O4w0k3=4Q484S3Q0k3|2*4u4B4H0k444$4A3.4)4d4,4F4p4Z4l4;4L4?3Y0k4s2,1q2(1d2S2F0n2J3b0O1(251l531o514 2,580#2)4`1S0W0D0`0G2j0o3t4-3^0z2_5s4=325n040n0E0F0$0j245x5k0=5v3g5I4R0=5m0`5G2l0P0F3t0t5t2;0`5C5E3A4%3%0W0`315N4X5K5w4m5Y320O0`0M0m0q0m0P0e5D0j1b5-3b0_040b3A0t685X5y5P5!0m0G623D5L5X5;6b1~0o0`0A0A2X2o6p6g3%640g6u3^0d645{0B6f6k5J01640N5W5=3o5R0n0A2v5{5}5 616F5O6H0`6J4m6a6G5A0j6O0m0o0c0.0O6*215V6V5.6X046Z2*6#6W5A2Z0o0d2v0A0c5|0q1b2O0q6y1}6I6K6l5A5#0m0A120P1w0m0m791S7b6!6L3c5!5D7g0#1?5U7n0=640I664t06697G6{6?6A0`6C6E2,6l0x0`0R7z7s046(6P5`5|5~2y7q7P0`0s7c6$6N7X6R7!601c4t7H697r7K047M7T7Q047S6=3w7,6Q7Z6T7;6`7r7}7)7$7+7V6O836S7#4$7?687^6B0m6D7|7R7T6}0x6 71730P750D777*6W898B6?8s8u7g8w8y8A7=8j8l7L8n7N2}888q804B7t5E7h2u7k7m8b8C7(8E815B7u8Z7j0e7l678N6l7_7{8V3%7}7 7O8c7f0A7w126;877%048a958 8-927y8M7?8O7`8Q8p7~8r0`6*6,0E6.240D942}7I3b8D8%8F0`0v6+6-6/9s7T6w9l8d0A9n9D9r9t387r7B5%7F7@6l5*5B6e7T6i8r0G0`0D0d0A0w0x0X8x9G0`6x8`6z8m8o9=7a0`7C3?3b6i8N9_1S0q0n0`01a60t2v0D0e0x0j0m0N0t0f0t0B000(2s2saj5D2G0j0d192r0E0U0+an0E298$4_6Wa32_8j0@240#0B0%af0X2q6:ad0P2t6Q2l0D5C9F4W3baE3g8j0E0X0t6~701P2s9+9-0+1?0:0T0+a%0,230c2X0Q0Ra6018=9f7d6d7x9O2B9v3D9x996|8XaB8S968}bf8c5p8t0j750G3Xb65j6W9Ha10=8^9ibu018|9I909cbq9Q9{b17H7r5A7i8#8*b98)9y8+7f9jbh9Pb304bk0obm0xbo3GbE6lbt8~6Wbw9^b+6?bAby7e8-bL8:bebV6G9R9ebI9V0`2v0F9-869ubF049;b/bR0mb5bN8{0`0Hce410`b^8;byb}cabO9kb=7taw5%7G7r9W0#8Rb{6W9!b=9$040o1b0%aXcp6v9:7Tb-cA2Bc79|b~cwbWa.9.bQcq98c68@9@cQbrb:8UcLcj049(9*9,cYc-9`c80IbHcV8c0O3e0O0X0B0AcH9s1@bqb8cf97ci1}cPbT9I9L9p9Eb(6Gb;c@320`0%7j0Gc;c43eaQdb1S7}0Sdw6M04cX78cZd90ldA7UdDdIdydIddbydlbibcc/8ta+7274765`dL0`dzdF3^0ocF0k0R4+3~8jd83^9Wc2c4dI9(c19,aV9/c89Ic~0Bd0d2d4cJdjbs6YdIbZ0`d-cB6?co3~1d5h0m2C2%ej521w542F2H2D1%1)2F0E1Nem0Z530|ez0$0(0*04.

La deuxième fonctionnalité sera de déterminer le taux d'occupation sur une année de chaque emplacement.

Question 4

Compléter la requête qui permet de récupérer les noms d'emplacement ainsi que les dates d'arrivée et de départ pour toutes les réservations qui se sont finis en 2025.

Prédicat BETWEEN

Le prédicat BETWEEN permet de comparer la valeur d'un champ par rapport à une borne inférieure et une borne supérieure (bornes incluses).

Exemple
Coeff BETWEEN 1 AND 2
Format de date

Les dates sont au format AAAA-MM-JJ.



Une fonction taux_occupation a été écrite, qui prend en paramètre une année et qui renvoie un dictionnaire qui associe chaque nom d'emplacement avec son taux d'occupation, exprimé en pourcentage.

Cependant des erreurs ont été commises.

Corriger les erreurs de la fonction.

fonction occupations

La fonction occupations prend en paramètre une chaîne de caractères représentant l'année et renvoie la liste des occupations, chaque occupation étant un tuple contenant le nom de l'emplacement, la date d'arrivée et la date de départ.

Cette fonction est déjà chargée en mémoire.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(40i2+edxm3s7= 1j}o5w_lSnatf)9h]{6,crg.*[yPku8/050m0l0F0E0i0B0q0t0O0B0E0q0q0s010F0i0c010406050q0X0o0o0E0P0U040C0x0B0X0@0x0D050Z0~1012140|0c041d1k051n0Z1n1p1k0|0m0i0e0,0.0:0=0J0i0Q0J0B1D0J0F0`050%0d0B0l1y0/0;011C1E1G1E0F1M1O1K0F0d0x0m141L0P1l0F0J0,170q0c0E0D0=0j011Q1A010G0)0l0D0E0o0l1K1=1@1|1S1 1O22240`0a0t0V0P0x0c0x0q0i1a0D0t0#1:0P0P0l0O2p1d270D1l0Z1.2C0F1,1+1-0m290=1G0D212m1K1v1x0-1R2M0i2O0D1(1w1K0c2v1l2A2C2*0}1?2q2U1}2Z0P110B0`0t0u2z2.0{2-282:1S2=2@2_0j2|1@2~2A2L01330E2^040t0p372B0|3a310=3d3f0t0g3j392.3b3p2_0y3t3l3v3n3c0x2?3e2_0M3A2 2/1z323F343g0r3K3m3N3o3P3H3g0Y3T3C3V3E3G3q0I3#303%3x040u0h3,3M2V3(3Q0u2{1e2}3B3-3^3/0u363}381m2(1d2S2F0m2J3b0O1(251l4a1o482,452B054f0#2)3$3^0W0`0#0G3t3L3b0z2_4z3U410G0`0%0X0n0A0x0O0O0X1?2y4n4s401}0_040f4E4t2;0`1@2O0l4!4V1S4X0H0b3A0t4=0t4A3D0D4I0E0d0A0l0o0c0.0O4 210F3t4@4F1}0x0`0s574^3.0`4N4P4R0i1b0q4+3@4W0`4Z4T5f414%0D4)5o3b4.4;4?5u4$041M4~0G0G2w0@4y4T584#1S5b045d5O5E4-0`0L0w5C4=5W0=4v040G3F5e59320`2Z0o5z3D4X0N5-5Q3o4w0E0F0l0A120P1w0l4*5t5.0=5^5`4,5|040m5~600#1?0P565V68010x4C042X6b5p5/5G4|4~5052540D6l2,6n4X4:4T064?6K5P6c015)0i5N2*6M6u6d5;6t3b6p0`6s6m5{3c4{4}0l5J5L6Q5?3%6G5#6L6K5%6(6w6*6,2x6.676%4X0T6/5v046W6 6N4X0K6X3D5S0k5U6S6^4`754}0v0x0X0P5n776U014X5s6E6%7i6f5 612u64667v780`5_6$6N7x6g0A6i126D2}6^5B6I6?5$6n5)0l0*7D7Q6F0`6H2*6J7U6@6n7i5H6+5K6}6R7#700`727q3w5:0x5=7{5@0`7a7I7r5S7f2}6T7|7j0A7l7n7p7E7r7t735F7y60627C8j5X047H7g7-5}7z7N6k8p690`0H3A7*7V6%5)5+0P7b5g757~8z7s7G8K748d7o8R5a6q6#8t7w6)5I7;5M8O5S0R8O7i2o4 8f7@7F4Y4/6=7,8!6`8$6-7?467$047`8g8a76938104838Z6N868V320d0`2j0X0D0m8O8i808L8T8:8 6%5S0S8O0o0i0`3;3=9n3^5S0Z9v9x040p0M3z9B5q8r9d0=9w0`44966:8B6=6^5)2v0F7n1c848a7/6|8(6I1d4q0l2C2%9/491w4b2F2H2D1%1)2F4|1O2C4a0|0Z0#0%0)0q04.