Défi

On veut calculer le prix total d'une commande de plusieurs articles réalisée sur un site web de papeterie. On dispose des informations de la commande sous forme d'un tableau de cette forme :

Article

Prix Unitaire Hors Taxes (en €)

Quantité achetée

Taux TVA

Carnet Capiha Format A6

4.32 €

2

5 %

Cartouche d'encre bleu Water Melon Man

2.71 €

5

20 %

Stylo plume Carpeur

26.82 €

1

20 %

Pour réaliser la commande il faut calculer :

  • le montant hors-taxe de la commande ;

  • appliquer une majoration pour trouver le prix TTC (« Toutes taxes comprises ») de la commande.

Question

Calculer à la main le montant hors-taxe du panier.

Indice

Le montant hors-taxe est égal à la somme de tous les prix unitaires hors-taxe, multipliés par la quantité achetée.

Solution

Le montant hors taxe réel est : 4.32 × 2 + 2.71 × 5 + 26.82 × 1 = 49.01 €.

Question

On se donne le morceau de code suivant reprenant le tableau donné plus haut et la logique pour calculer le prix hors taxe du panier.

1
const productsTable =
2
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
3
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
4
['Stylo plume Carpeur', 26.82, 1, 0.2]]
5
6
7
let dutyFreePrice = 0
8
for (let line of productsTable) {
9
    dutyFreePrice = dutyFreePrice + line[1] + line[2]
10
}
11
12
console.log('Total Price: ', dutyFreePrice, ' €')

Quel est la sortie retournée par le programme ?

Le résultat est-il correct ? Corriger s'il faut l'erreur et vérifier que le résultat est bien bon.

Solution

La sortie retournée est :

1
Total Price:  41.85  €

Le résultat est différent de celui qu'on a calculé à la main. Il y a un problème de logique dans le script, il faut remplacer la somme par une multiplication.

1
dutyFreePrice = dutyFreePrice + line[1] * line[2]

On obtient :

1
const productsTable =
2
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
3
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
4
['Stylo plume Carpeur', 26.82, 1, 0.2]]
5
6
7
let dutyFreePrice = 0
8
for (let line of productsTable) {
9
    dutyFreePrice = dutyFreePrice + line[1] * line[2]
10
}
11
12
console.log('Total Price: ', dutyFreePrice.toFixed(2), ' €')

Question

Exécuter le script corrigé.

Quelle est la sortie du programme ? Le comportement de ce nouveau script corrigé est-il correct ?

Solution

Le résultat que l'on obtient est bien correct.

1
Total Price:  49.01  €

Question

Calculer à la main le montant TTC du panier.

Indice

Le montant TTC pour chaque ligne de produit est égal à son prix hors-taxe, multiplié par (1 - pourcentageTVA).

Solution

Le coût réel du panier est : 4.32 × 2 × 1.05 + 2.71 × 5 × 1.2 + 26.82 × 1 × 1.2 = 57.52 €.

Question

On veut maintenant calculer le montant du panier avec TVA dans une variable.

On se donne le morceau de code suivant reprenant le tableau donné plus haut et la logique pour calculer le prix du panier après application de la TVA.

1
const productsTable =
2
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
3
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
4
['Stylo plume Carpeur', 26.82, 1, 0.2]]
5
6
7
let price = 0
8
for (let line of productsTable) {
9
    price = price + line[1] * line[2]
10
    price = price * line[3]
11
}
12
13
console.log('Total Price with taxe: ', price.toFixed(2), ' €')

Quel est la sortie retournée par le programme ?

Le résultat est-il correct ? Corriger s'il faut l'erreur et vérifier que le résultat est bien bon.

Solution

Le résultat est mauvais, on obtient :

1
Total Price with taxe:  5.92328  €

Il y a des erreurs sur les lignes de calculs, on corrige cela pour :

1
for (let line of productsTable) {
2
    price = price + line[1] * line[2] * (1 + line[3])
3
}

On obtient le script final :

1
const productsTable =
2
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
3
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
4
['Stylo plume Carpeur', 26.82, 1, 0.2]]
5
6
7
let price = 0
8
for (let line of productsTable) {
9
    price = price + line[1] * line[2] * (1 + line[3])
10
}
11
12
console.log('Total Price with taxe: ', price.toFixed(2), ' €')

On obtient bien :

1
Total Price with taxe:  57.52  €

Question

On veut maintenant calculer et afficher comme précédemment le prix avec TVA de plusieurs paniers donnés dans une liste.

1
const productsTables = [
2
3
  [['Cahier Sombreroche', 7.00, 4, 0.05],
4
  ['Feutre indélébile générique', 3.99, 5, 0.2],
5
  ['Stylo à bille Sib', 35, 12, 0.2]],
6
7
  [['Carnet Capiha Format A4', 8.23, 1, 0.05],
8
  ["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]],
9
10
  [['Lot de craies', 3.99, 3, 0.2],
11
  ['Tableau blanc', 12.00, 1, 0.2]]
12
13
]

On met en place naïvement le code suivant :

1
const productsTables = [
2
3
  [['Cahier Sombreroche', 7.00, 4, 0.05],
4
  ['Feutre indélébile générique', 3.99, 5, 0.2],
5
  ['Stylo à bille Sib', 35, 12, 0.2]],
6
7
  [['Carnet Capiha Format A4', 8.23, 1, 0.05],
8
  ["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]],
9
10
  [['Lot de craies', 3.99, 3, 0.2],
11
  ['Tableau blanc', 12.00, 1, 0.2]]
12
13
]
14
15
let price = 0
16
for (let line of productsTables[0]) {
17
    price = price + line[1] * line[2] * (1 + line[3])
18
}
19
20
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
21
22
price = 0
23
for (let line of productsTables[1]) {
24
    price = price + line[1] * line[2] * (1 + line[3])
25
}
26
27
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
28
29
30
price = 0
31
for (let line of productsTables[1]) {
32
    price = price + line[1] * line[2] * (1 + line[3])
33
}
34
35
console.log('Total Price with taxe: ', price.toFixed(2), ' €')

Exécuter ce code. Il y a-t-il une erreur ? Comment la corriger ?

Solution

Oui, il y a une erreur : le prix du second panier est affiché à la place de celui du troisième panier.

On doit normalement obtenir 28.76 €.

La dernière boucle devient :

1
for (let line of productsTables[2])

La bonne valeur est alors affichée.

Question

Après correction, le code précédent contient de la duplication de code, ce qui est une très mauvaise pratique.

Proposer un moyen qui permette à la fois de réduire ce code, d'éviter des bugs et de gagner en compréhension, tout en gardant le même résultat.

Indice

On peut pour cela injecter la logique dans une fonction dédiée au calcul du montant avec taxe d'un panier.

Solution

1
const productsTables = [
2
3
  [['Cahier Sombreroche', 7.00, 4, 0.05],
4
  ['Feutre indélébile générique', 3.99, 5, 0.2],
5
  ['Stylo à bille Sib', 35, 12, 0.2]],
6
7
  [['Carnet Capiha Format A4', 8.23, 1, 0.05],
8
  ["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]],
9
10
  [['Lot de craies', 3.99, 3, 0.2],
11
  ['Tableau blanc', 12.00, 1, 0.2]]
12
13
]
14
15
function computeTaxesProducts(productsTable) {
16
    let price = 0
17
    for (let line of productsTable) {
18
        price = price + line[1] * line[2] * (1 + line[3])
19
    }
20
    return price.toFixed(2)
21
}
22
23
for (let table of productsTables) {
24
    console.log('Total Price with taxe: ', computeTaxesProducts(table))
25
}
26

On obtient :

1
Total Price with taxe:  557.34  €
2
Total Price with taxe:  20.64  €
3
Total Price with taxe:  28.76  €

Question

Donner le rendu final du code une fois formaté :

Indice

On peut utiliser un formateur en ligne comme : https://beautifier.io/

Solution

1
const productsTables = [
2
3
    [
4
        ['Cahier Sombreroche', 7.00, 4, 0.05],
5
        ['Feutre indélébile générique', 3.99, 5, 0.2],
6
        ['Stylo à bille Sib', 35, 12, 0.2]
7
    ],
8
9
    [
10
        ['Carnet Capiha Format A4', 8.23, 1, 0.05],
11
        ["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]
12
    ],
13
14
    [
15
        ['Lot de craies', 3.99, 3, 0.2],
16
        ['Tableau blanc', 12.00, 1, 0.2]
17
    ]
18
19
]
20
21
function computeTaxesProducts(productsTable) {
22
    let price = 0
23
    for (line of productsTable) {
24
        price = price + line[1] * line[2] * (1 + line[3])
25
    }
26
    console.log('Total Price with taxe: ', price.toFixed(2), ' €')
27
}
28
29
for (let table of productsTables) {
30
    computeTaxesProducts(table)
31
}

La lisibilité, notamment au niveau de la déclaration des différents paniers, est améliorée.