Calcular los importes adeudados

Calcula los importes adeudados por cada cliente de una tienda de alquiler de dispositivos.

Datos de ejemplo

 {
    // [id, rate( $/hour )]
    deviceLevels: [
        [0, 1.00],
        [1, 1.50]
    ],
    // [id, level]
    devices: [
        [0, 0],
        [1, 1]
    ],
    // [id, name, percentage discount (%), flat rate discount($)]
    customers: [
        [0, 'John', 10, 5],
        [1, 'Sara', 5, 7]
    ],
    // [id, device, customers, hours]
    rentals: [
        [0, 1, [0], 10],
        [1, 0, [1], 20],
        [2, 1, [1,0], 20],
    ]
  }

Costo del dispositivo por hora

Cada dispositivo tiene un nivel y cada nivel tiene un costo por hora. Estos valores se almacenan en devices y deviceLevels (por ejemplo, el dispositivo 1 tiene un nivel de 1, por lo que su costo es de 1.50/hora).

Costo del dispositivo por hora por cliente

Varios clientes pueden compartir un alquiler de un solo dispositivo. Todos los costos se repartirán por igual (por ejemplo, si 2 clientes comparten un alquiler de 10 horas de un dispositivo que cuesta $1/hora, a cada uno le corresponderán $5).

Descuentos del cliente

Cada cliente tendrá un descuento porcentual y un descuento de tarifa fija. Para calcular el importe adeudado después del descuento, resta el descuento porcentual del cliente de su importe total adeudado y luego resta la tarifa fija. Si el importe después del descuento es menor que minimumCharge, minimumCharge se tomará como el importe adeudado.

Entradas

  • data: Consulta los ejemplos.
  • minimumCharge: Importe mínimo (consulta "descuentos del cliente" arriba).

Valor de retorno

La función devolverá un objeto indexado por nombre del cliente e incluirá el importe total adeudado por cada cliente, redondeado a dos decimales.

Ejemplos

const minimumCharge = 10
const data = {
    // [id, rate( per/hour )]
    deviceLevels: [
        [0, 1.00],
        [1, 1.50]
    ],
    // [id, level]
    devices: [
        [0, 0],
        [1, 1]
    ],
    // [id, name, percentage discount (%), flat rate discount($)]
    customers: [
        [0, 'John', 10, 5],
        [1, 'Sara', 5, 7]
    ],
    // [id, device, customers, hours]
    rentals: [
        [0, 1, [0], 10],
        [1, 0, [1], 20],
        [2, 1, [1,0], 20],
    ]
  }

data,  minimumCharge ➞ { John: 22, Sara: 26.25 }

Desglose del ejemplo

John alquiló el dispositivo 1 durante 10 horas según los datos de rentals. El dispositivo 1 está en el nivel de precio 1 y cuesta $1.50/h según los datos de deviceLevels, por lo que el cargo de este dispositivo es 1.50 * 10 o $15.

Sara alquiló el dispositivo 0 durante 20 horas según los datos de rentals. El dispositivo 0 está en el nivel de precio 0 y cuesta $1.00/h según los datos de deviceLevels, por lo que el cargo de este dispositivo es 1.00 * 20 o $20.

John y Sara compartieron un alquiler del dispositivo 1 durante 20 horas según los datos de rentals. El dispositivo 1 está en el nivel de precio 1 y cuesta $1.50/h según los datos de deviceLevels, por lo que el cargo de este dispositivo es 1.50 * 20 o $30. John y Sara dividirán ese cargo, así que cada uno deberá $15.

John debe 15 + 15 o $30. Según la tabla de customers, John recibe un descuento del 10% y otro descuento de tarifa fija de $5. John debe 30 - (30 * 0.10) - 5 o $22.

Sara debe 20 + 15 o $35. Según los datos de customers, Sara recibe un descuento del 5% y otro descuento de tarifa fija de $7. Sara debe 35 - (35 * 0.05) - 7 o 26.25.

Notas

  • Puede haber cualquier cantidad de dispositivos, niveles de dispositivos, clientes y alquileres.
  • La legibilidad del código es importante; no se probará directamente, pero elige la legibilidad en lugar de lograr el objetivo con la menor cantidad de código posible.