Created
July 1, 2015 18:33
-
-
Save ro-fdm/65d54da1e9bef44106dc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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€