Skip to content

Instantly share code, notes, and snippets.

@ro-fdm
Created July 1, 2015 18:33
Show Gist options
  • Save ro-fdm/65d54da1e9bef44106dc to your computer and use it in GitHub Desktop.
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
@ro-fdm
Copy link
Author

ro-fdm commented Jul 1, 2015

Ejercicio entrevista plenummedia
21-junio-2015

@ro-fdm
Copy link
Author

ro-fdm commented Jul 1, 2015

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€

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment