-
-
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