Rutas
/
Elixir
Elixir
/
Ejercicios
/
Tarifas de biblioteca
Tarifas de biblioteca

Tarifas de biblioteca

Ejercicio de aprendizaje

Introducción

Fechas y horas

La biblioteca estándar de Elixir ofrece 4 módulos diferentes para trabajar con fechas y horas, cada uno con su propio struct.

  • El módulo Date. Un struct Date se puede crear con el sigilo ~D.

    ~D[2021-01-01]
    
  • El módulo Time. Un struct Time se puede crear con el sigilo ~T.

    ~T[12:00:00]
    
  • El módulo NaiveDateTime para fechas y horas sin zona horaria. Un struct NaiveDateTime se puede crear con el sigilo ~N.

    ~N[2021-01-01 12:00:00]
    
  • El módulo DateTime para fechas y horas con zona horaria. Usar este módulo para zonas horarias distintas de UTC requiere una dependencia externa, una base de datos de zonas horarias.

Comparaciones

Para comparar fechas u horas entre sí, busca una función compare o diff en el módulo correspondiente. Los operadores de comparación como ==, > y < parecen funcionar, pero no hacen una comparación semántica correcta para esos structs.

Instrucciones

Tu amiga bibliotecaria te ha pedido que amplíes el software de su biblioteca para calcular automáticamente las tarifas por retraso. Su sistema actual almacena la fecha y la hora exactas de un préstamo como un string de fecha y hora ISO8601. Regenta una biblioteca local en un pueblo pequeño de Ghana, que usa la zona horaria GMT (UTC +0), no aplica el horario de verano y no necesita preocuparse por otras zonas horarias.

1. Analizar las fechas y horas almacenadas

Implementa la función LibraryFees.datetime_from_string/1. Debe tomar un string de fecha y hora ISO8601 como argumento y devolver una estructura NaiveDateTime.

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

2. Determinar si un libro se prestó antes del mediodía

Si un libro se prestó antes del mediodía, el lector tiene 28 días para devolverlo. Si se prestó al mediodía o después, son 29 días.

Implementa la función LibraryFees.before_noon?/1. Debe tomar una estructura NaiveDateTime y devolver un Boolean.

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

3. Calcular la fecha de devolución

A partir de la fecha y hora del préstamo, calcula la fecha de devolución.

Implementa la función LibraryFees.return_date/1. Debe tomar una estructura NaiveDateTime y devolver una estructura Date, 28 o 29 días después.

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

4. Determinar cuánto se retrasó la devolución del libro

La biblioteca tiene una tarifa fija por las devoluciones tardías. Para poder calcular la tarifa, necesitamos saber cuántos días después de la fecha de devolución se devolvió realmente el libro.

Implementa la función LibraryFees.days_late/2. Debe tomar una estructura Date (la fecha de devolución prevista) y una estructura NaiveDateTime (la fecha y hora de la devolución real).

Si la fecha de devolución real es anterior o el mismo día que la fecha de devolución prevista, la función debe devolver 0. En caso contrario, la función debe devolver la diferencia entre esas dos fechas en días.

La biblioteca registra tanto la fecha como la hora de la devolución real del libro con fines estadísticos, pero no usa la hora al calcular las tarifas por retraso.

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

5. Determinar si el libro se devolvió un lunes

La biblioteca tiene una oferta especial para devolver libros los lunes.

Implementa la función LibraryFees.monday?/1. Debe tomar una estructura NaiveDateTime y devolver un Boolean.

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

6. Calcular la tarifa por retraso

Implementa la función LibraryFees.calculate_late_fee/3. Debe tomar tres argumentos: dos strings de fecha y hora ISO8601, la fecha y hora del préstamo y la fecha y hora de la devolución real, y la tarifa por retraso de un día. Debe devolver la tarifa total por retraso en función de cuánto se retrasó la devolución real del libro.

Incluye la oferta especial de los lunes. Si devuelves el libro un lunes, tu tarifa por retraso tiene un 50% de descuento, redondeado hacia abajo.

# 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
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Tarifas de biblioteca?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.