Description

L’application devra désormais facturer les clients.

La facture doit contenir la somme du coût de toutes les commandes du client, plus les taxes. Les membres d’un groupe paient leur facture individuellement.

La configuration du café doit permettre la sélection d’un pays, soit le Canada, les États-Unis ou le Chili.

Le pays sélectionné détermine le fonctionnement du calcul des taxes, selon les règles ci-bas.

Lorsque le client demande sa facture (checkout), il quitte le café et son siège devient disponible. Ceci s’applique autant aux clients seuls que les membres d’un groupe.

Lorsque le dernier membre d’un groupe quitte (aucun membre restant), on libère les sièges encore réservés des membres du groupe qui ne se sont jamais présentés.

Il est possible d’accéder aux factures émises durant la journée. Cependant, lors de la fermeture du café, les factures sont archivées (effacées pour l’instant).

Règles de la configuration

  1. Il est possible de sélectionner un pays via la configuration.
  2. Si “CA”, une province doit être précisée.
  3. Si “US”, un état doit être précisé.
  4. Si “CL”, il n’y a que des taxes fédérales, donc la province et l’état sont ignorés.
  5. La valeur par défaut est “None”. Cette valeur implique qu’il n’y a pas de taxes.

Valeurs possibles

Pays Taxes
CA 5%
US 0%
CL 19%
None 0%

:warning: Par défaut, nous voulons sélectionner “None”.

Provinces Taxes
AB 0%
BC 7%
MB 7%
NB 10%
NL 10%
NT 0%
NS 10%
NU 0%
ON 8%
PE 10%
QC 9.975%
SK 6%
YT 0%
États Taxes
AL 4%
AZ 5.60%
CA 7.25%
FL 6%
ME 5.50%
NY 4%
TX 6.25%

Note: Le montant des taxes peut sembler bas aux États-Unis, mais notez que normalement il y aurait également des taxes municipales. Ignorez ceci pour les fins du cours.

Calcul de la facture

Subtotal = Somme du coût des aliments commandés.

Taxes = Subtotal * (Pays + (Province   État))

Total = Subtotal + Taxes

Attention: Il ne faut pas arrondir les montants d’argent durant les calculs, seulement lors de l’affichage (arrondi vers le haut au centième).

exemple 1: Canada, Québec

Subtotal = 10$

Taxes = 10$ * (0.05 + 0.09975) = 1.4975$

Total = 10$ + 1.4975$ = 11.4975$

exemple 2: États-Unis, Californie

Subtotal = 10$

Taxes = 10$ * (0 + 0.0725) = 0.725$

Total = 10$ + 0.725$ = 10.725$

exemple 3: Chili

Subtotal = 10$

Taxes = 10$ * (0.19 + 0) = 1.90$

Total = 10$ + 1.90$ = 11.90$

exemple 4: None

Subtotal = 10$

Taxes = 10$ * (0 + 0) = 0$

Total = 10$ + 0$ = 10$

Conditions de succès

# Description
1 À la sortie d’un client (checkout), il reçoit sa facture.
2 Un client peut demander pour sa facture même s’il n’a rien commandé.
3 La facture doit contenir la somme du coût de toutes les commandes, plus les taxes calculées selon la configuration.
4 Il est possible de configurer le pays où se situe le café.
5 Si le pays est “CA”, une province doit être spécifiée.
6 Si le pays est “US”, un état doit être spécifié.
7 Si le pays est “CL” ou “None”, les champs “State” et “Province” sont ignorés.
8 Après avoir reçu sa facture, le client quitte le café, rendant son siège disponible.
9 Lorsque le dernier client d’un groupe quitte, tous les sièges réservés au nom du groupe sont libérés.
10 Pour l’affichage, les montants d’argent sont arrondis vers le haut au centième, donc 4.91001 = 4.92.
11 À la fermeture du café, les factures sont archivées (effacées pour l’instant).

API

:white_check_mark: Facturer un client

Requête

POST /checkout

{
  "customer_id": "45031cc97f15409ebf1bc29bd8c65b35"
}

Réponses

:arrow_right: HTTP 201 Created

  Location: /customers/<customerId::string>/bill

:warning: Pour le cours nous mettons un location vers une ressource créée non-primaire. Dans la vraie vie, ceci pourrait avoir des conséquences. Pourquoi selon vous? :wink: Plus d’information.

:arrow_right: HTTP 404 Not Found - Quand un des clients spécifiés n’existent pas.

{
  "error": "INVALID_CUSTOMER_ID"::string,
  "description": "The customer does not exist."::string
} 

:white_check_mark: Obtenir la facture

Requête

GET /customers/{CUSTOMER_ID}/bill

:warning: Un client doit pouvoir obtenir sa facture même s’il n’a rien commandé, tant qu’il a fait un checkout.

Réponses

:arrow_right: HTTP 200 OK

{
  "orders": ["Mocha", "Espresso"],
  "subtotal": 4.15::float,
  "taxes": 0.62::float,
  "total": 4.78::float
}

:arrow_right: HTTP 404 Not Found - Quand le client n’existe pas.

{
  "error": "INVALID_CUSTOMER_ID"::string,
  "description": "The customer does not exist."::string
} 

:arrow_right: HTTP 400 Bad Request - Quand le client n’a pas encore fait de checkout.

{
  "error": "NO_BILL"::string,
  "description": "The customer needs to do a checkout before receiving his bill."::string
} 

:white_check_mark: Modifier la configuration

Requête

POST /config

{
  "country": "CA",
  "province": "QC",
  "state": "",
  ...
}

Attention: Toutes les configurations doivent être envoyées à chaque appel sans exception, mais toutes options supplémentaires (non reconnues) seront ignorées (voir comment faire en Java avec Jackson).

Réponses

:arrow_right: HTTP 200 OK

:arrow_right: HTTP 400 Bad Request - Quand la combinaison de pays, province et état n’est pas supportée par la configuration (ex. US, QC).

{
  "error": "INVALID_COUNTRY"::string,
  "description": "The specified country is invalid."::string
} 

Note: Votre application doit supporter un JSON de configuration contenant plus d’élément qu’attendu. Ces éléments doivent être ignorés. Voir la documentation pour apprendre comment le faire en Java.