require "work_day" require "active_support" require "active_support/core_ext/date" module ROI class FinancialResult attr_reader :start_date, :end_date, :rentabilities def initialize(rentabilities, start_date, end_date) @rentabilities = rentabilities @start_date = start_date @end_date = end_date end def current_month scope_start = WorkDay.next_after(end_date.beginning_of_month, 0) format_financial(scope_start, end_date) end def months(amount) scope_start = (end_date - amount.months + 1.month).beginning_of_month check_gaps_and_format(scope_start, end_date) end def current_year scope_start = WorkDay.next_after(end_date.beginning_of_year, 0) format_financial(scope_start, end_date) end def years_ago(amount) scope_end = (end_date - amount.year).end_of_year scope_start = scope_end.beginning_of_year format_financial(scope_start, scope_end) end def portfolio format_financial(start_date, end_date) end private def scoped_rentabilities(scope_start, scope_end) rentabilities.values.select.each do |line| line.date.between?(scope_start, scope_end) end end def format_financial(scope_start, scope_end) return unless scope_start && scope_end total = scoped_rentabilities(scope_start, scope_end).sum do |line| line.try(:daily_result) || 0 end.round(2) total != 0 ? total : nil end def check_gaps_and_format(scope_start, scope_end) if scope_start >= start_date scoped_rentabilities(scope_start, scope_end).each do |line| return if line.try(:have_position) == false end format_financial(scope_start, scope_end) end end end end