Parcours
/
Elixir
Elixir
/
Exercices
/
Frais de bibliothèque
Frais de bibliothèque

Frais de bibliothèque

Exercice d'apprentissage

Introduction

Dates et heures

La bibliothèque standard d'Elixir propose 4 modules différents pour manipuler les dates et les heures, chacun avec sa propre structure.

  • Le module Date. Une structure Date peut être créée avec le sigil ~D.

    ~D[2021-01-01]
    
  • Le module Time. Une structure Time peut être créée avec le sigil ~T.

    ~T[12:00:00]
    
  • Le module NaiveDateTime pour les dates et heures sans fuseau horaire. Une structure NaiveDateTime peut être créée avec le sigil ~N.

    ~N[2021-01-01 12:00:00]
    
  • Le module DateTime pour les dates et heures avec fuseau horaire. Utiliser ce module pour des fuseaux horaires autres qu'UTC nécessite une dépendance externe, une base de données de fuseaux horaires.

Comparaisons

Pour comparer des dates ou des heures entre elles, cherche une fonction compare ou diff dans le module correspondant. Les opérateurs de comparaison tels que ==, > et < semblent fonctionner, mais ils n'effectuent pas une comparaison sémantique correcte pour ces structures.

Instructions

Ton amie bibliothécaire t'a demandé d'étendre son logiciel de bibliothèque pour calculer automatiquement les frais de retard. Son système actuel enregistre la date et l'heure exactes de l'emprunt d'un livre sous la forme d'une string datetime au format ISO8601. Elle gère une bibliothèque locale dans une petite ville du Ghana, qui utilise le fuseau horaire GMT (UTC +0), n'applique pas l'heure d'été et n'a pas à se soucier des autres fuseaux horaires.

1. Analyse les dates et heures stockées

Implémente la fonction LibraryFees.datetime_from_string/1. Elle prend en argument une string datetime au format ISO8601 et renvoie une structure NaiveDateTime.

LibraryFees.datetime_from_string("2021-01-01T13:30:45Z")
# => ~N[2021-01-01 13:30:45]

2. Détermine si un livre a été emprunté avant midi

Si un livre a été emprunté avant midi, le lecteur dispose de 28 jours pour le rendre. S'il a été emprunté à midi ou après, il dispose de 29 jours.

Implémente la fonction LibraryFees.before_noon?/1. Elle prend en argument une structure NaiveDateTime et renvoie un booléen.

LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true

3. Calcule la date de retour

À partir de la date et de l'heure de l'emprunt, calcule la date de retour.

Implémente la fonction LibraryFees.return_date/1. Elle prend en argument une structure NaiveDateTime et renvoie une structure Date, 28 ou 29 jours plus tard.

LibraryFees.return_date(~N[2020-11-28 15:55:33])
# => ~D[2020-12-27]

4. Détermine de combien de jours le retour du livre était en retard

La bibliothèque applique un tarif fixe pour les retours en retard. Pour pouvoir calculer les frais, il faut savoir combien de jours après la date de retour le livre a effectivement été rendu.

Implémente la fonction LibraryFees.days_late/2. Elle prend deux arguments : une structure Date, la date de retour prévue, et une structure NaiveDateTime, la date et l'heure du retour effectif.

Si la date de retour effective tombe un jour antérieur ou le même jour que la date de retour prévue, la fonction doit renvoyer 0. Sinon, elle doit renvoyer la différence entre ces deux dates, en jours.

La bibliothèque enregistre à la fois la date et l'heure du retour effectif du livre à des fins statistiques, mais n'utilise pas l'heure pour calculer les frais de retard.

LibraryFees.days_late(~D[2020-12-27], ~N[2021-01-03 09:23:36])
# => 7

5. Détermine si le livre a été rendu un lundi

La bibliothèque propose une offre spéciale pour les livres rendus le lundi.

Implémente la fonction LibraryFees.monday?/1. Elle prend en argument une structure NaiveDateTime et renvoie un booléen.

LibraryFees.monday?(~N[2021-01-03 13:30:45Z])
# => false

6. Calcule les frais de retard

Implémente la fonction LibraryFees.calculate_late_fee/3. Elle prend trois arguments : deux strings datetime au format ISO8601, la date et l'heure de l'emprunt et celles du retour effectif, ainsi que les frais de retard pour un jour. Elle doit renvoyer le montant total des frais de retard en fonction du retard du retour effectif du livre.

N'oublie pas l'offre spéciale du lundi. Si tu rends le livre un lundi, tu bénéficies de 50 % de réduction sur les frais de retard, arrondie à l'entier inférieur.

# Sunday, 7 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-03T13:30:45Z", 100)
# => 700

# one day later, Monday, 8 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-04T09:02:11Z", 100)
# => 400
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Elixir Exercism

Prêt à commencer Frais de bibliothèque ?

Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.