Calcular os valores devidos

Calcule os valores devidos por cada cliente de uma loja de aluguel de dispositivos.

Dados de exemplo

 {
    // [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],
    ]
  }

Custo do dispositivo por hora

Cada dispositivo tem um nível, e cada nível tem um custo por hora. Esses valores são armazenados em devices e deviceLevels (por exemplo, o dispositivo 1 tem nível 1, então seu custo é de 1.50/hora).

Custo do dispositivo por hora por cliente

Vários clientes podem compartilhar o aluguel de um único dispositivo. Todos os custos serão divididos igualmente (por exemplo, se 2 clientes compartilharem um aluguel de 10 horas de um dispositivo que custa $1/hora, cada um deverá $5).

Descontos do cliente

Cada cliente terá um desconto percentual e um desconto de tarifa fixa. Para calcular o valor devido após o desconto, subtraia o desconto percentual do cliente do valor total devido e depois subtraia a tarifa fixa. Se o valor após o desconto for menor que minimumCharge, minimumCharge será considerado o valor devido.

Entradas

  • data: Consulte os exemplos.
  • minimumCharge: Valor mínimo da cobrança (consulte "descontos do cliente" acima).

Valor de retorno

A função retornará um objeto indexado pelo nome do cliente e incluirá o valor total devido por cada cliente, arredondado para duas casas decimais.

Exemplos

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 }

Detalhamento do exemplo

John alugou o dispositivo 1 por 10 horas, de acordo com os dados de rentals. O dispositivo 1 está no nível de preço 1 e custa $1.50/h, de acordo com os dados de deviceLevels, então a cobrança por esse dispositivo é 1.50 * 10 ou $15.

Sara alugou o dispositivo 0 por 20 horas, de acordo com os dados de rentals. O dispositivo 0 está no nível de preço 0 e custa $1.00/h, de acordo com os dados de deviceLevels, então a cobrança por esse dispositivo é 1.00 * 20 ou $20.

John e Sara compartilharam o aluguel do dispositivo 1 por 20 horas, de acordo com os dados de rentals. O dispositivo 1 está no nível de preço 1 e custa $1.50/h, de acordo com os dados de deviceLevels, então a cobrança por esse dispositivo é 1.50 * 20 ou $30. John e Sara dividirão essa cobrança, então cada um deverá $15.

John deve 15 + 15 ou $30. De acordo com a tabela de customers, John recebe um desconto de 10% e um desconto adicional de tarifa fixa de $5. John deve 30 - (30 * 0.10) - 5 ou $22.

Sara deve 20 + 15 ou $35. De acordo com os dados de customers, Sara recebe um desconto de 5% e um desconto adicional de tarifa fixa de $7. Sara deve 35 - (35 * 0.05) - 7 ou 26.25.

Observações

  • Pode haver qualquer quantidade de dispositivos, níveis de dispositivos, clientes e aluguéis.
  • A legibilidade do código é importante; ela não será testada diretamente, mas escolha a legibilidade em vez de atingir o objetivo com a menor quantidade possível de código.