require 'date'
require 'ostruct'
class OrdersReport
def initialize(orders, start_date, end_date)
@orders = orders
@start_date = start_date
@end_date = end_date
end
def total_sales_within_date_range
within_date_range = ->order{ order.placed_at.between?(@start_date, @end_date) }
@orders.select(&within_date_range).sum(&:amount)
end
end
class Array #for ideone.com
def sum(zero = 0, &b)
inject(zero){ | s, e | s + (b ? b[e] : e) }
end
end
class Order < OpenStruct
end
order_within_range1 = Order.new(amount: 5,placed_at: Date.new(2016, 10, 10))
order_within_range2 = Order.new(amount: 10,placed_at: Date.new(2016, 10, 15))
order_out_of_range = Order.new(amount: 6,placed_at: Date.new(2016, 1, 1))
orders = [order_within_range1, order_within_range2, order_out_of_range]
start_date = Date.new(2016, 10, 1)
end_date = Date.new(2016, 10, 31)
report = OrdersReport.new(orders, start_date, end_date)
p report.total_sales_within_date_range #=> 15
cmVxdWlyZSAnZGF0ZScKcmVxdWlyZSAnb3N0cnVjdCcKCmNsYXNzIE9yZGVyc1JlcG9ydAogIGRlZiBpbml0aWFsaXplKG9yZGVycywgc3RhcnRfZGF0ZSwgZW5kX2RhdGUpCiAgICBAb3JkZXJzID0gb3JkZXJzCiAgICBAc3RhcnRfZGF0ZSA9IHN0YXJ0X2RhdGUKICAgIEBlbmRfZGF0ZSA9IGVuZF9kYXRlCiAgZW5kCgogIGRlZiB0b3RhbF9zYWxlc193aXRoaW5fZGF0ZV9yYW5nZQogICAgd2l0aGluX2RhdGVfcmFuZ2UgPSAtPm9yZGVyeyBvcmRlci5wbGFjZWRfYXQuYmV0d2Vlbj8oQHN0YXJ0X2RhdGUsIEBlbmRfZGF0ZSkgfQogICAgQG9yZGVycy5zZWxlY3QoJndpdGhpbl9kYXRlX3JhbmdlKS5zdW0oJjphbW91bnQpCiAgZW5kCgplbmQKCmNsYXNzIEFycmF5ICNmb3IgaWRlb25lLmNvbQogIGRlZiBzdW0oemVybyA9IDAsICZiKQogICAgaW5qZWN0KHplcm8peyB8IHMsIGUgfCBzICsgKGIgPyBiW2VdIDogZSkgfQogIGVuZAplbmQKCmNsYXNzIE9yZGVyIDwgT3BlblN0cnVjdAplbmQKCm9yZGVyX3dpdGhpbl9yYW5nZTEgPSBPcmRlci5uZXcoYW1vdW50OiA1LHBsYWNlZF9hdDogRGF0ZS5uZXcoMjAxNiwgMTAsIDEwKSkKb3JkZXJfd2l0aGluX3JhbmdlMiA9IE9yZGVyLm5ldyhhbW91bnQ6IDEwLHBsYWNlZF9hdDogRGF0ZS5uZXcoMjAxNiwgMTAsIDE1KSkKb3JkZXJfb3V0X29mX3JhbmdlID0gT3JkZXIubmV3KGFtb3VudDogNixwbGFjZWRfYXQ6IERhdGUubmV3KDIwMTYsIDEsIDEpKQpvcmRlcnMgPSBbb3JkZXJfd2l0aGluX3JhbmdlMSwgb3JkZXJfd2l0aGluX3JhbmdlMiwgb3JkZXJfb3V0X29mX3JhbmdlXQoKc3RhcnRfZGF0ZSA9IERhdGUubmV3KDIwMTYsIDEwLCAxKQplbmRfZGF0ZSA9IERhdGUubmV3KDIwMTYsIDEwLCAzMSkKCnJlcG9ydCA9IE9yZGVyc1JlcG9ydC5uZXcob3JkZXJzLCBzdGFydF9kYXRlLCBlbmRfZGF0ZSkKcCByZXBvcnQudG90YWxfc2FsZXNfd2l0aGluX2RhdGVfcmFuZ2UgIz0+IDE1