-
-
Save ro-fdm/65d54da1e9bef44106dc to your computer and use it in GitHub Desktop.
class Checkout | |
PRODUCTS = {"AM" => {"code" => "AM", "price" => 3.11}, | |
"AC" => {"code" => "AC", "price" => 5} , | |
"CA" => {"code" => "CA", "price" => 11.23}} | |
def initialize(pricing_rules) | |
@pricing_rules = pricing_rules || default_pricing_rules | |
@list_products = [] | |
end | |
def default_pricing_rules | |
[ | |
{ name: '2x1', code: 'AM', min: 2 }, | |
{ name: 'discount', price: 4.5, code: 'AC', min: 3 } | |
] | |
end | |
def scan(code) | |
product = PRODUCTS[code] | |
@list_products << product | |
end | |
def total | |
list_products_discount = calculate_discounts(@list_products) | |
list_products_discount.inject(0){| sum, p | sum + p["price"]} | |
end | |
def calculate_discounts(list_products) | |
['AM', 'AC', 'CA'].inject([]) do |products, code| | |
list = list_products.select{|item| item['code'] == code} | |
products + apply_rule(list, code) | |
end | |
end | |
def apply_rule(list, code) | |
rule = @pricing_rules.detect{|r| r[:code] == code } | |
if rule && rule[:name] == '2x1' | |
discount_2x1(list, rule) | |
elsif rule && rule[:name] == 'discount' | |
discount_3_or_more(list, rule) | |
else # CA or other | |
list | |
end | |
end | |
def discount_2x1(list, rule) | |
list_am = [] | |
if list.size >= rule[:min] | |
list.each_with_index do |item, index| | |
if index.odd? | |
list_am << {"code" => item['code'], "price" => 0} | |
else | |
list_am << item | |
end # if index | |
end # each | |
else | |
list_am = list | |
end # if list size | |
list_am | |
end | |
def discount_3_or_more(list, rule) | |
list_ac = [] | |
if list.size >= rule[:min] | |
list_ac = list.map{|item| {"code" => item['code'], "price" => rule[:price]}} | |
else | |
list_ac = list | |
end | |
list_ac | |
end | |
end | |
INSTRUCCIONES
Imagina que estamos implementando una tienda online, que vende solo 3 productos:
Codigo | Nombre | Precio
AM | Agua mineral | 3.11€
AC | Aceite | 5.00€
CA | Cafe | 11.23€
El departamento de marketing es fan de las promociones de tipo 2x1 (si compras dos productos iguales, uno de ellos es gratis). Y quiere que haya un descuento de este tipo en Agua mineral.
El CEO cree que lo mejor para aumentar las ventas es agregar descuentos por cantidad (al comprar x de un mismo producto, el precio por unidad baja). Y quiere que al comprar 3 o mas aceites, el precio por unidad sea de 4.50€.
El proceso de checkout permite escanear los productos en cualquier orden y debe devolver el total de la compra.
La interfaz del proceso de checkout es asi:
co = Checkout.new(pricing_rules)
co.scan(item)
co.scan(item)
price = co.total
Implementa el proceso de checkout que cumpla con estos requerimientos. Debes usar como lenguaje ruby y puedes utilizar las gemas o componentes que necesites.
Ejemplos:
Items: AM,AC,AM,AM,CA
Precio total esperado: 22.45€
Items: AM,AM
Precio total esperado: 3.11€
Items: AC,AC,AM,AC
Precio total esperado: 16.61€
Ejercicio entrevista plenummedia
21-junio-2015