Você pode executar pelo REPL do Elixir, na raiz do projeto:
$ mix iex -S
O módulo StoneDesafio possui uma função púbica, split_order/2
, que aceita duas listas.
items
Lista de items, seguindo a estrutura definida em StoneDesafio.Item
. Exemplo:
items = [
%StoneDesafio.Item{base_price: 20, name: "item_1", quantity: 2},
%StoneDesafio.Item{base_price: 15, name: "item_2", quantity: 2},
%StoneDesafio.Item{base_price: 30, name: "item_3", quantity: 1}
]
persons
Lista de e-mails (strings) que serão as chaves do mapa com os dados resultantes. Exemplo:
persons = [
"[email protected]",
"[email protected]",
"[email protected]"
]
Em caso de sucesso:
{:ok,
%{
# <resultado>
}}
Em caso de alguma lista vazia:
{:error,
# <mensagem de erro>
}
iex> StoneDesafio.split_order(items, persons)
{:ok,
%{
"[email protected]" => 34,
"[email protected]" => 33,
"[email protected]" => 33
}}
Você também pode executar os testes automatizados com o comando no terminal, na raiz do projeto:
$ mix test
O caso base segue a seguinte lógica:
- Recebe as duas listas
- Remove os emails duplicados
- Calcula quantas pessoas (emails) dividirão a conta
- Calcula o total da conta
- Divide (divisão inteira) o total da conta pelo total de pessoas e calcula o resto dessa divisão
- Cria uma nova lista, com o preço base (resultado da divisão inteira) distribuido pela quantidade de pessoas
- Distribui o resto da divisão entre os participantes, um de cada vez (como a distribuição de cartas em um grupo)
- Formata o resultado para a forma final
- Retorna
O caso de exceção:
- Caso uma das listas (ou ambas) esteja vazia, retorna a tupla de erro com a devida mensagem.